2

我正在尝试将 Java 代码从 Selenium 1 (RC) 迁移到 Selenium 2 (WebDriver),看起来像这样:

1:  selenium.click(someButton);
2:  selenium.waitForPageToLoad();
3:  if (!selenium.isElementPresent(errorMessageElement)) {
4:     Assert.fail("Test failed! No error msg should be displayed on page.");
5:  }

关键部分是第 3 行,我尝试根据Rostislav Matl的建议将其转换为 Selenium 2 :

3:  if (!driver.findElements(By.xpath(errorMessageElement)).size() > 0) {

不幸的是,WebDriver 等待整个超时(在我的情况下为 60 秒)来检测该元素确实不存在。虽然这有效,但它引入了太多的时间开销......

Selenium 2 中是否有任何方法可以高效地检查当前在 Web 浏览器中显示的 HTML 页面上是否存在元素?

4

3 回答 3

3

这是一个两部分的答案

  1. 时间开销是正确的:因为您希望确保该元素确实没有被渲染。也就是说,考虑到页面渲染时间、AJAX 元素等。我知道错误消息将与页面加载一起显示,但如果您想检查以几毫秒延迟显示的 ajax 元素的存在(或不存在),则超时很有用。

  2. 减少等待开销的技巧:您仍然可以创建一种方法来临时重置隐式等待时间,如下所示

public boolean isElementNotPresent(By by) {
    boolean flag = true;
    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
    if (!driver.findElements(by).size() > 0) {
        flag = false;
    } 
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    return flag;
}

并在您要检查缺席的地方调用此方法,例如,第 3 行和第 4 行将是

if (!isElementNotPresent(By.xpath(xpathoferrorelement))) {
    Assert.fail("Test failed! No error msg should be displayed on page.");
}
于 2012-09-21T07:30:55.117 回答
1

尝试使用 FluentWait 类,很容易为您想要使用的条件进行配置:http: //selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/FluentWait .html

于 2012-09-21T07:00:32.853 回答
0

当页面已经呈现时,我通常使用的几种方法(验证存在或不存在)。方法1:

input.findElements(By.xpath("//xpath")).size() > 0

方法2:

driver.findElement(By.cssSelector(propertyKeysLoader(key))).isDisplayed()

方法3:

public bool IsElementPresent(By selector)
{
    return driver.FindElements(selector).Any();
}

如果您想渲染元素(以防页面上没有所有 AJAX),那么您最好使用 Arek 提到的 fluent wait 。

 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;              }     ;

在字符串中,.pollingEvery(5, TimeUnit.SECONDS)您可以设置任何迭代超时。很舒服。希望这对您有所帮助)

于 2012-09-21T16:08:14.580 回答