使用Java + Selenium WebDriver在页面上验证错误消息的强大解决方案

时间:2018-02-05 19:29:04

标签: java selenium selenium-webdriver

情况:给定连接到外部系统的复杂webapp。如果外部系统关闭,可能有2个选项。

  1. case:div中出现大胖堆栈跟踪。定位器div类:errorPage

  2. 案例:应用程序仍然有效,但页面顶部会出现警告错误消息。定位器:span class=message message-error

  3. 整个框架实现了Java,带有Page Object / Page Factory模式的Selenium Webdriver。

    我正在寻找一个强大的解决方案来验证在以下情况下页面没有任何错误:

    导航到相应的页面,当新页面初始化时,检查页面上是否有任何错误(我需要检查两种情况) 我在页面上执行某些操作,搜索,点击某些内容,并验证错误是否显示在页面上。不属于他们。 我的检查错误方法:

    public void checkError() {
        if(errorPage.size() > 0) {
            try {
                throw new TestException("Unexpected error appears: " + errorPage.get(0).getText());
            } catch (TestException e) {
                e.printStackTrace();
            }
        }
    }
    

    (其中一个)我的等待方法:

    public void waitForPageLoaded() {
    
        if (driver.findElements(By.className("errorPage")).size() > 0) {
    
            try {
                throw new UnexpectedException("Unexpected error:" + driver.findElement(By.id("errorTrace")).getText());
            } catch (UnexpectedException e) {
                e.printStackTrace();
            }
        } else {
            ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((JavascriptExecutor) driver).executeScript("return document.readyState").toString()
                            .equalsIgnoreCase("complete");
                }
            };
            WebDriverWait wait = new WebDriverWait(driver, 30);
            wait.until(expectation);
        }
    
    }
    

    使用isDisplayed方法的简单if else语句不起作用,因为当页面上没有出现错误时我收到NoSuchElementException。

    上述方法可用于不同的情况,但我想以通用的方式在一个解决方案中收集所有内容。 DRY解决方案是我的想法。

    有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:1)

你有几种选择。我将通过一个基本案例并解释其他一些可能的方法,您可以希望使用此代码并根据您的喜好进行调整。

基本上,我的每个页面对象都确定它是否在构造函数中加载。我等待使用waitForLocator等待指定的元素。如果页面的加载速度较慢,请选择该区域中的元素作为定位器。如果你有一些缓慢的加载区域,你可以重写它,以便很容易地等待一个元素列表,以确保页面的所有部分都被加载。

之后,您实现了一个检查错误的方法和另一个检查警告的方法。你可以变得更加漂亮并让他们返回错误/警告,以便你可以将它们用于正面测试等。

下面的页面对象非常基本。我正在做一个愚蠢的版本,只是在出现错误或警告时抛出异常。如果您不希望测试因错误/警告而失败,您肯定可以从构造函数等中取出这些检查。你故意触发它们,然后验证它们是否存在。

使用此方法,您无需等到出现错误消息。等待waitForLocator表示您的页面已完成加载...此时,您可以检查错误/警告而无需等待。

这是我实现所有页面对象的方法。我在构造函数中放置等待,然后只需要在页面上触发某些事件时添加等待,例如模态对话框启动。当事件被触发时,触发该事件的方法等待页面的动态部分中的元素可见,例如,等待对话框的容器元素可见。

public class PageObject
{
    private WebDriver driver;
    private By waitForLocator = By.id("someId"); // this is a locator for some element on the page that is last to load

    private By errorLocator = By.cssSelector("div.errorPage");
    private By warningLocator = By.cssSelector("span.message.message-error");
    private By buttonLocator = By.cssSelector("button");

    public PageObject(WebDriver webDriver)
    {
        this.driver = webDriver;

        // wait for page to finish loading
        new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(waitForLocator));

        if (errorExists())
        {
            throw new IllegalStateException("There are errors on the page.");
        }
        if (warningExists())
        {
            throw new IllegalStateException("There are warnings on the page.");
        }
    }

    public void clickButton()
    {
        driver.findElement(buttonLocator).click();
    }

    public boolean errorExists()
    {
        return !driver.findElements(errorLocator).isEmpty();
    }

    public boolean warningExists()
    {
        return !driver.findElements(warningLocator).isEmpty();
    }
}

您的脚本看起来如下所示。我正在使用TestNG断言来验证是否存在错误/警告。

PageObject page = new PageObject(driver);
page.clickButton(); // do something that might trigger an error or warning
Assert.assertFalse(page.errorExists(), "Verify no errors exist");
Assert.assertFalse(page.warningExists(), "Verify no warnings exist");