我怎样才能克服Selenium中的元素id异常?

时间:2012-08-08 10:46:36

标签: gwt selenium selenium-webdriver gwt2 selenium-server

在UiBinder中为GWT小部件设置'id'。

例如。的

还在* .gwt.xml

中添加了

然后我在Selenium测试用例中尝试这个

WebElement element = driver.findElement(By.id("gwt-debug-loginButton"));

有时它可以正常工作。但有时会抛出以下异常,

  

无法找到元素:   {“method”:“id”,“selector”:“gwt-debug-loginButton”}命令持续时间或   超时:62毫秒

我需要更新什么? 任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:6)

使用WebDriverWait,在一段时间后搜索元素。这样的事情。

try {
        (new WebDriverWait(driver, seconds, delay)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                try {
                    WebElement el = d.findElement(By.id("gwt-debug-loginButton"));
                    return true;
                } catch (Exception e) {
                    return false;
                }
            }
        });
    } catch (TimeoutException t) {
        //Element not found during the period of time
    }

答案 1 :(得分:3)

当您尝试使用selenium WebDriver在网页上查找任何元素时。 您可以driver等待页面完全加载,方法是使用Implicit WaitExplicit Wait

隐式等待的示例(此代码通常在初始化驱动程序后使用) -

WebDriver driver = new FirefoxDriver();   
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

如果驱动程序找不到您要查找的元素,则上述语句会使驱动程序等待10秒。如果驱动程序在10秒后仍无法找到,则驱动程序会抛出异常。

显式等待的示例 - 在您的情况下,这专门针对单个WebElement使用 -

new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.id("gwt-debug-loginButton")));

上面的代码会让驱动程序等待20秒,直到找到该元素。如果它在20秒后仍然无法找到该元素,则会抛出TimeoutException。 您可以查看ExpectedCondition here的API(您可以在此课程中使用许多有趣的变体)

注意:只有当驱动程序找不到代码所需的元素时,驱动程序才会等待指定的时间段,如果驱动程序找到了一个元素,那么它只会继续执行)< / p>