1

我正在使用 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");

它有时使用相同的代码成功通过。我不明白发生了什么。

4

2 回答 2

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 秒内找不到(可编辑),它将崩溃(您可能不得不在方法中说它会抛出一些异常)

每当我不确定页面的加载速度时,我都会应用它...

于 2012-04-05T20:14:51.343 回答
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。

于 2012-04-20T07:34:57.940 回答