3

在实现 filepicker.io 之后,我们的一些 Selenium 回归测试开始失败。失败(间歇性的,但在某些情况下更常见)是通过 XPath 查询找到的 WebElements 上的点击被忽略。例如

driver.findElement(By.xpath("//a[text()='Demo data']")).click();

在 findElement() 和 click() 之间添加 Sleep(2000) 通常可以解决问题。(我说一般是因为 Sleep(1000) 基本上就足够了,直到它不够,所以我把它变成了 Sleep(2000)...)

检查 element.isDisplayed() 没有帮助。如果我们停止包含 filepicker.io JavaScript 文件,问题就会消失。

这与 filepicker.io 引入 IFRAME 有关吗?我们还注意到 JQuery 的 document.ready() 现在似乎被调用了两次。

4

2 回答 2

0

我们现在在打开任何包含 filepicker.js 的页面后首先运行此代码:

while (FindElementsMaybeNone(By.cssSelector("#filepicker_comm_iframe")).size() == 0)
    Sleep(50);
while (driver.switchTo().frame("filepicker_comm_iframe") == null)
    Sleep(50);
driver.switchTo().defaultContent();

我们猜想 filepicker 的动态 IFRAME 插入会扰乱 Firefox 或 Selenium。我没有将此标记为答案,因为我真的不知道它为什么起作用。

于 2013-06-13T05:15:44.067 回答
0

像往常一样遇到此类问题,您正在尝试查找页面上尚不可用的元素,因为 AJAX 请求仍在下载/处理它。您需要等待元素出现在页面上。

有三种方法可以做到这一点:

  1. 使用sleep(). 这是胆怯的方式。您不应该使用硬编码的睡眠,因为您会等待太久(使测试不必要地变慢)或太短(测试失败)。
  2. 使用隐式等待。如果找不到元素,它将始终等待它。

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    
  3. 使用显式等待。这使您能够明确地等待一个元素(dis)出现/变得可用/任何东西。

    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Demo data")));
    
于 2013-06-11T01:12:09.860 回答