Selenium:如何定位通知消息等动态元素

时间:2012-10-08 10:12:20

标签: selenium selenium-webdriver xpath

我正在使用Selenium和Web Driver。

我有一个表格可以装在灯箱里。现在,当我点击"提交"。 Light Box关闭后,页面顶部会生成一个简单的通知,几秒后就会消失。

现在我的问题是:当我做的时候

driver.findElement(By.xpath(".//*[@id='createCaseBtn']")).click(); // x-path of submit button

如何检查UI上是否显示该通知消息。

因为当我做的时候

driver.findElement(By.xpath(".//*[@id='easyNotification']")).getText(); // x-path of easyNotification message

我告诉我,无法找到逻辑上正确的元素,因为那时UI上没有通知消息。只有在完成AJAX请求(对于表单的子目录)之后,才会在UI上显示消息。

请帮助!!!!

由于

2 个答案:

答案 0 :(得分:3)

使用过显式等待。它对我来说很好:

显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。最糟糕的情况是Thread.sleep(),它将条件设置为等待的确切时间段。提供了一些便捷方法,可帮助您编写仅在需要时等待的代码。 WebDriverWait与ExpectedCondition相结合是一种可以实现的方法。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.id(".//*[@id='easyNotification']")));

答案 1 :(得分:0)

好。当我处理AJAX时,我总是使用流畅的等待方法。 假设您在单击提交按钮后显示消息的定位符:

String xPathMessage= ".//*[@id='easyNotification']"; 

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

//simply call the method:
String text=fluentWait(By.xpath(xPathMessage)).getText();

来自流利等待的文档: Wait接口的实现,可以动态配置其超时和轮询间隔。 每个FluentWait实例定义等待条件的最大时间量,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。

上述方法与isElementPresent配对也不错:

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

或那:

public bool isElementPresent(By selector)
{
    return driver.FindElements(selector).size()>0;
}

希望这适合你