【发布时间】:2018-02-05 19:29:04
【问题描述】:
情况:给定一个连接到外部系统的复杂 webapp。如果外部系统出现故障,可能有 2 个选项。
案例:出现 div 中的大胖堆栈跟踪。定位器 div 类:
errorPage。案例:应用程序仍然可以运行,但页面顶部出现警告错误消息。定位器:
span class=message message-error。
整个框架是用Java实现的,Selenium Webdriver和Page Object/Page Factory模式。
我正在寻找一种可靠的解决方案来验证页面在以下情况下没有任何错误:
导航到相应的页面,当新页面初始化时,检查页面是否有错误(我需要检查两种情况) 我在页面上执行某些操作,搜索,单击某些内容,然后验证错误没有出现在页面上。不是他们。 我的校验错误方法:
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 解决方案是我的想法。
有什么建议吗?谢谢。
【问题讨论】:
-
驱动程序已经默认等待就绪状态,所以在你的脚本中等待它是没有用的。而不是在通用服务员中隐藏通用错误断言,您应该在测试中明确断言错误,并使用肯定和否定的情况。
-
你能给我举个例子吗?完全理解你在说什么,但我并不清楚用两种不同的输出处理正负情况。
-
@FlorentB。 Selenium 仅在
driver.get()... 上等待就绪状态,而不是在点击或任何其他用户触发的导航上。我不确定.back()之类的。 -
@JeffC,规范说,当单击导致导航或调用
Back/Forward/Refresh时,驱动程序必须等待完成状态。我很确定 Chrome 就是这种情况,尽管上次我检查 geckodriver 在检测新页面时仍然存在问题,尤其是当导航是从复合操作触发时。我知道的唯一情况是,如果导航是通过SendKeys触发的,驱动程序不会等待。除此之外,现在大部分内容都是通过 Ajax 更新的,这对页面的状态没有影响。 -
@FlorentB。那么规范所说的与实际发生的事情是两件不同的事情。我有很多次单击链接并从页面上拉出一些文本,却发现该页面尚未更改,因此我从旧页面上获取了文本。这就是为什么我使用我在回答中描述的方法使页面对象构造函数等待预期元素的原因。有关详细信息,请阅读this。
标签: java selenium selenium-webdriver