Selenium / Firefox:命令“.click()”不适用于找到的元素
我试图找到解决这个问题的方法,我花了很多时间,但这对我来说几乎是不可能的。
问题:我在Firefox中使用Selenium和Java。 我需要找到一个元素(列表框)并单击它。 因此,代码找到元素,但单击操作不起作用。 它每次都适用于谷歌浏览器,有时只在Firefox中(有时相同的Java代码有效,有时则无效)。
当程序进入页面时,有一部分代码带有元素:
SELECCIONA TALLA
并且在单击元素时,代码的一部分会发生变化:
我尝试了很多解决方案,有时它可以工作,但下次我运行程序时,它不再起作用。
一些解决方案
-
它找到元素,但不运行单击操作。 我检查了xpath和cssSelector,并且找到了这些表达式的唯一元素。
driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")).click(); // Also checked with By.cssSelector("span.selected-size")
-
我虽然是因为时间,所以我试图以这种方式解决它。
WebElement we = driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")); // By.cssSelector("span.selected-size") Thread.sleep(3000); we.click();
-
最后,我有点绝望,我创建了一个新function,尝试这样做了近60次,寻找元素代码的更改,如果有任何更改,只是尝试再次单击操作。
clickAndWaitWhileElementIsNotPresent(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span"),By.xpath("//div[@class='size-btn opened']/span")); // By.cssSelector("span.selected-size") private void clickAndWaitWhileElementIsNotPresent(By by1, By by2) throws Exception { for (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (isElementPresent(by2)) { break; } else { driver.findElement(by1).click(); } } catch (Exception e) { } Thread.sleep(1000); } }
有元素的图像:
有谁知道怎么做?
最后,我找到了一个适用于Firefox和Google Chrome的答案。
WebElement we = this.driver.findElement(By.id("size-btn")); JavascriptExecutor executor = (JavascriptExecutor) driver; executor.executeScript("arguments[0].click();", we); waitForElementPresent(By.xpath("//div[@id='size-btn' and contains(@class,'opened')]/span"));
谢谢你读我
我不确定你为什么使用这个Xpath,如果你有自由改变Xpath然后使用selenium IDE记录元素并使用Xpath::position
从target
下拉列表(它选择相对于html标题的唯一路径),它将解决动态定位器的问题。 并尝试下面提到的事件。
1-使用clickAt
。
2-使用fireevent(focus)
然后单击。 有时会发生背景中的某些元素被加载,当它被加载时,焦点移动到那里因此elementNotVisible错误。
3-使用mouseDownRight
。
我在Firefox中遇到同样的问题。 诀窍是单击内部的文本而不是按钮本身。
我有一些解决方案,用机器人做一个类放在那里TAB事件键,然后调用那个类。 它的作用就像一个专注于页面的背面。 对于一些razon,页面失去了焦点,从未找到那个botton。
Robot robot; try { robot = new Robot(); robot.keyPress(KeyEvent.VK_TAB); robot.keyRelease(KeyEvent.VK_TAB); } catch (AWTException e) {e.printStackTrace();}
您可以尝试使用org.openqa.selenium.interactions中的Actions类:
WebElement element = driver.findElement(By.id("size-btn")); Actions builder = new Actions(driver); builder.moveToElement(element).click(element); builder.perform();
- Firefox浏览器没有打开selenium webbrowser代码
- 如何通过Java中的Firefox配置文件下载CSV文件
- 如何使用Selenium webdriver和Java为firefox设置代理?
- Selenium:如何在不调用driver.quit()的情况下停止影响PC内存的geckodriver进程?
- 确定客户端浏览器是否已安装Java并可以启动applet
- 使用java中的selenium webdriver登录Gmail
- 如何调试Firefox警报框自动关闭并且无法检测Serenity BDD中的警报?
- 在Hadoop的mapreduce框架中运行“Selenium Webdriver”,在地图步骤中冻结
- 如何使用FirefoxProfile通过Firefox浏览器自动下载?
Interesting Posts
编写一个firefox插件并从java应用程序访问它
使用Selenium在FireFox中设置首选项时出现mime类型问题
Firefox错误:使用Java启动Selenium 3.0.1驱动程序时“您的连接不安全”
在selenium中绕过capcha
如何使用Geckodriver禁用Selenium中的Firefox日志记录?
来自Selenium 2 / WebDriver的Id的jQuery元素选择器
webdriver无法单击firefox中的超链接
无法使用IEDriver单击IE上的链接
如何让Firefox在Mac OSX上使用Selenium WebDriver
如何使用Geckodriver保留我的Firefox配置文件缓存?