我正在使用Selenium 2.0网络驱动程序。每当我尝试在页面中找到某些内容时,我的脚本偶尔会失败。它引发了一个例外:
无法找到元素:{“method”:“id”,“selector”:“username”};
我的部分代码:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
WebElement userName = driver.findElement(By.id("username"));
userName.clear();
userName.sendKeys("admin");
它有时会成功通过相同的代码。我不明白发生了什么。
答案 0 :(得分:4)
有时会发生这种情况,因为页面加载速度比您预期的要慢。我正在通过应用自己的包装器帮助器来解决方法。它看起来像这样:
private WebElement foundElement;
public WebElement find(By by){
for (int milis=0; milis<3000; milis=milis+200){
try{
foundElement = driver.findElement(by);
}catch(Exception e){
Thread.sleep(200);
}
}
return foundElement;
}
后来在代码中:
WebElement userName = find(By.id("username"));
此方法将尝试找到它,如果没有找到,则睡眠200毫秒并再试一次。如果在3秒内没有找到(可编辑),它将崩溃(你可能不得不在方法中说它抛出一些异常)
每当我不确定页面加载速度有多快时我就会应用它...
答案 1 :(得分:3)
解决问题的最佳方法是让驱动程序等待,直到使用WebDriverWait对象在浏览器中加载id元素 -
new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver arg0) {
WebElement element = driver.findElement(By.id("username"));
return element.isDisplayed();
}
});
这可确保驱动程序停止检查id元素是否已加载。如果它在10秒内没有加载,则抛出timedOutException。