如何在加载filepicker.io时使xpath与Selenium一起使用

时间:2013-06-06 08:09:03

标签: selenium selenium-webdriver filepicker.io

实施filepicker.io后,我们的一些Selenium回归测试已经开始失败。失败(间歇性,但在某些情况下通常不是)在通过XPath查询找到的WebElements上忽略了点击。 e.g。

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

在findElement()和click()之间添加Sleep(2000)通常可以解决问题。 (我说一般是因为睡眠(1000)足够了,直到它没有,所以我做了睡眠(2000)...)

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

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

2 个答案:

答案 0 :(得分:0)

与往常一样,由于AJAX请求仍在下载/处理,您正试图找到页面上尚未提供的元素。您需要等待元素出现在页面上。

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

  1. 使用sleep()。这是 dis 勇敢的方式。你不应该使用硬编码的睡眠,因为你要么等待太长时间(使测试不必要地慢),要么太短(测试失败)。
  2. 使用Implicit wait。如果没有找到,那将始终等待一个元素。

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    
  3. 使用explicit wait。这使您可以明确地等待一个元素(dis)出现/变得可用/无论如何。

    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Demo data")));
    

答案 1 :(得分: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。我并没有将此标记为答案,因为我并不知道为什么它的工作原理。