使用Selenium单击伪元素

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

这是DOM的样子:

  ::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(Service Cloud),如果有帮助的话。

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

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

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

如果你这样做:

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

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

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

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

elem= driver. ActionChains(driver).move_to_element_with_offset(elem,249,1).click().perform()

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

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

PS:使用此导入 – 来自selenium.webdriver.common.action_chains导入ActionChains

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

希望这可以帮助。

上面的Maciej’a答案适用于WebDriver,但不适用于针对Firefox V.56的RemoteWebDriver(Selenium 3.12.0)。 我们需要一个适用于本地和远程的解决方案。 使用键盘快捷键结束调用导航菜单下拉菜单。 作为额外的好处,这也消除了使用偏移的需要。

 String navigationMenuDropdownShortcutKeys = Keys.chord(Keys.ESCAPE, "v"); new Actions(driver) .sendKeys(navigationMenuDropdownShortcutKeys) .perform();