使用 Selenium 单击伪元素

新手上路,请多包涵

我正在尝试使用 Selenium 单击 ::after 伪元素。我意识到这不能直接通过 WebDriver 完成,但似乎无法找到使用 Javascript 的方法。

下面是 DOM 的样子:

 <em class="x-btn-split" unselectable="on" id="ext-gen161">
    <button type="button" id="ext-gen33" class=" x-btn-text">
        <div class="mruIcon"></div>
        <span>Accounts</span>
    </button>
    ::after
</em>

这就是上面的元素的样子。对象的左侧是“按钮”元素,右侧是带箭头的 :after 元素,单击该箭头会弹出下拉菜单。正如您所看到的,右侧没有任何标识符,这在一定程度上使这很难做到。

被点击的元素

我在 stackoverflow 中看到了这两个链接,并试图将答案组合起来形成我的解决方案,但无济于事。

使用 JavaScript 单击 Selenium WebDriver 中的元素

使用 JavaScript 在 Selenium WebDriver 中定位伪元素

这是我的尝试之一:

 string script = "return window.getComputedStyle(document.querySelector('#ext-gen33'),':before')";
IJavaScriptExecutor js = (IJavaScriptExecutor) Session.Driver;
js.ExecuteScript("arguments[0].click(); ", script);

我在其中收到此错误:

 System.InvalidOperationException: 'unknown error: arguments[0].click is not a function
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 6.1.7601 SP1 x86_64)'

我还尝试使用 Selenium 中的 Actions 类将鼠标移动到左侧,类似于 这个答案。我想这可能是因为我不知道偏移量是用什么来衡量的,而且文档似乎也没有给出任何指示。我认为它以像素为单位?

 Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(235, 15).Click().Build().Perform();

这种尝试似乎点击了某个地方,因为它没有给出任何错误,但我不确定在哪里。

如果有帮助,我正在尝试在 c# 中自动化 Salesforce(服务云)。

也许有人可以提供解决方案?

原文由 Jand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我在为 Salesforce 编写 Selenium 测试时遇到了同样的问题,并设法通过使用 Actions 直接控制鼠标来解决它。

此按钮的包装表具有 250 像素的硬编码宽度,您已经发现了这一点。要定位鼠标的位置,您可以使用 contextClick() 方法而不是 Click(). 它模拟鼠标右键,因此它将始终打开浏览器菜单。

如果你这样做:

 Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).ContextClick().Build().Perform();

您会发现鼠标移动到 WebElement 的中间,而不是左上角(我认为它也是)。由于该元素的宽度是恒定的,我们可以将鼠标向右移动 250 / 2 - 1 ,它会起作用:)代码:

 Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(124, 0).Click().Build().Perform();

原文由 Maciej Podstawka 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于那些试图在 Python 中执行此操作的人,解决方案如下:

elem= driver.<INSERT THE PATH TO ELEMENT HERE> ActionChains(driver).move_to_element_with_offset(elem,249,1).click().perform()

基本上在这里,我在 DOM 中找到我的元素并分配给 WebElement。然后将 WebElement 作为参数传递给 move_to_element_with_offset 方法。

我从开发人员工具中获得了元素的 px 值。

PS:使用这个导入 - from selenium.webdriver.common.action_chains import ActionChains

您可以在此处阅读有关 Action 链 类及其方法 _move_to_element_withoffset 的 更多信息: http ://selenium-python.readthedocs.io/api.html。

希望这可以帮助。

原文由 AmrithS 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题