在Selenium 2.0 Webdriver中,按ID定位元素失败

时间:2012-04-05 17:43:53

标签: webdriver selenium-webdriver

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

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

2 个答案:

答案 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。