gpt4 book ai didi

java - Selenium FirefoxDriver 在动画发生时点击了错误的链接

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:07 24 4
gpt4 key购买 nike

我正在使用 Selenium 2.35 并在尝试单击 firefox 中的元素时出现不可预知的错误,如下所示:

new Actions(driver).moveToElement(element).click().perform();

我找到的元素是一个 元素,它绑定(bind)了一个点击事件。我遇到的问题偶尔会在 Firefox 尝试单击该元素时未命中并单击完全不同的元素。如果我使用调试器遍历我的代码,问题永远不会发生,这让我相信 FirefoxDriver 只是在浏览器上单击了错误的位置,与计时问题有关。在我的页面上有动态加载的

使我想要单击的元素在我找到它并发送 .click() 命令之前向下移动。我相信这是我问题的根源。我可以放置一个 Thread.sleep(500) 以确保它有足够的时间来完成动画和插入动态 div,但这对我来说似乎很草率。有没有一种方法可以让我的 FirefoxDriver 等到屏幕上的元素完成移动后再尝试发送 .click() 事件?

此外,我曾尝试只发送 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 类还很陌生。

最佳答案

除了使用 ExpectedConditions 确保页面实际可见之外,这种情况还可以通过处理页面上的动画(转换)来解决。

可以通过执行以下命令来禁用页面上的所有动画,直到页面刷新:

(JavascriptExecutor)driver.executeScript("$('body').append('<style> * {transition: none!important;}</style>')")

此外,如果您知道获得动画的特定元素,您可以检查它是否是动画的(JQuery animation selector):

(Boolean)((JavascriptExecutor)driver).executeScript("return $("#ELEMENT_ID").is(":animated")")

如果特定元素未知,您可以确定是否所有动画都已完成:

(Boolean)((JavascriptExecutor)driver).executeScript("return $(":animated").length == 0 ")

关于java - Selenium FirefoxDriver 在动画发生时点击了错误的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18621416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com