我正在使用 Selenium 2.35 并在尝试单击 Firefox 中的元素时遇到不可预测的错误,如下所示:
new Actions(driver).moveToElement(element).click().perform();
我找到的元素是一个 <span> 元素,带有一个与之关联的点击事件。我遇到的问题是偶尔当 Firefox 尝试单击该元素时未命中并单击一个完全不同的元素。如果我使用调试器遍历我的代码,则永远不会发生问题,这使我相信 FirefoxDriver 只是单击了浏览器上的错误位置,这与时间问题有关。在我的页面上有动态加载的 < div > 使我想要单击的元素在我找到它并发送 .click() 命令之前向下移动。我相信这是我问题的根源。我可以放一个 Thread.sleep(500) 以确保它有足够的时间来完成动画和插入动态 div,但这对我来说似乎很草率。
另外,我试图只发送 element.click() 但这似乎更频繁地失败。
更新(2013 年 9 月 5 日):
我在@MrTi 的评论的帮助下得出的解决方案如下:
private void jsClickOnElementById(String id)
{
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id(id)));
JavascriptExecutor js = (JavascriptExecutor)driver;
StringBuilder sb = new StringBuilder();
sb.append("var x = $('#" + id + "');");
sb.append("x.click();");
js.executeScript(sb.toString());
}
只是为了确保元素实际上在页面上,我添加了初始的“等待”调用,然后使用 JavascriptExecutor 运行一些 jquery 并单击页面上的元素。这似乎对我的情况很有用。如果有人对这个解决方案的一些缺点有帮助,他们将不胜感激,因为我对 JavascriptExecutor 类相当陌生。