实施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()现在似乎被调用了两次。
答案 0 :(得分:0)
与往常一样,由于AJAX请求仍在下载/处理,您正试图找到页面上尚未提供的元素。您需要等待元素出现在页面上。
有三种方法可以做到这一点:
sleep()
。这是 dis 勇敢的方式。你不应该使用硬编码的睡眠,因为你要么等待太长时间(使测试不必要地慢),要么太短(测试失败)。使用Implicit wait。如果没有找到,那将始终等待一个元素。
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
使用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。我并没有将此标记为答案,因为我并不知道为什么它的工作原理。