运行Selenium Webdriver测试时,我有一个非常奇怪的问题。
我的代码
driver.findElement(By.id("id")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.className("green_true")).click();
元素实际存在。我甚至可以看到有问题的网址被网络驱动程序点击,但后来没有任何反应。浏览器不会进入页面,也不会找到green_true元素。导致错误。但只是偶尔。有时测试应该运行。
谁能说出这是怎么回事?
我无法使用确切的网址,因为它们会根据所选语言而有所不同。
答案 0 :(得分:0)
好。建议以下列方式修改: 而不是
driver.findElement(By.id("id")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.className("green_true")).click();
尝试使用以下内容:
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo; } ;
fluentWait(By.id("id")).click();
fluentWait(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
fluentWait(By.className("green_true")).click();
问题可能是你在与元素交互(点击等)之后在页面上获得了一些AJAX。恕我直言,我们需要使用更强大的等待机制。
一条建议:当你获得webelement或css选择器的xpath时,不要忘记在fireBug,ffox扩展中验证找到的定位器。 问候。
答案 1 :(得分:0)
在单击动态元素时尝试使用显式等待。等到元素出现在Web浏览器上或对其应用操作。您可以使用此模式:
final FluentWait<WebDriver> wait =
new FluentWait<WebDriver>(getDriver())
.withTimeout(MASK_PRESENCE_TIMEOUT, TimeUnit.SECONDS)
.pollingEvery(100, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class)
.ignoring(StaleElementReferenceException.class)
.withMessage("Time out while waiting the element is loaded");
wait.until(new Predicate<WebDriver>() {
@Override
public boolean apply(final WebDriver driver) {
return ! driver.findElements(By.id("id")).isEmpty();
}
});