Selenium + Java 错误监听器 ext.js
Posted
技术标签:
【中文标题】Selenium + Java 错误监听器 ext.js【英文标题】:Selenium + Java error listener ext.js 【发布时间】:2015-05-04 14:58:34 【问题描述】:当我不知道它何时发生时,我如何捕捉错误?
我正在使用 Selenium + Java。为 JS 网页创建测试。
发生错误时,测试会继续单击元素。 错误在那一刻是可见的,所以它不是一个消息框或类似的东西。一个错误框变得可见。然后过了一段时间,测试崩溃了,说它不能点击某个元素。
如何在我的测试运行时监听任何可见(或可点击)的随机元素?这将使我能够捕捉到错误并且测试不会失败。
我应该把我的测试放到两个线程中,一个监听错误,另一个运行我的测试用例吗?
【问题讨论】:
【参考方案1】:最好的选择是了解并解决潜在的错误情况。
如果错误仅在测试中出现,或者无法解决,我建议查看您的驱动程序配置,并确保您看到的对话框不会被 Unexpected_Alert_Behavior 的驱动程序设置覆盖。如果您已将其关闭,我会尝试将其打开,看看它对您的行为有何影响。
How to handle an Alert with "UnexpectedAlertBehaviour" capability in Selenium? https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ie/InternetExplorerDriver.html我不完全确定这将解决列出的问题,因为您提到的对话框是 dom 的一部分,并且从我所看到的情况来看,“意外”警报行为通常在该上下文中不可见。我相信这对于 IE 实现也是非常具体的。
最后,我想我会求助于在我的班级中使用一种方法来为我执行所有 findbys。在该方法中,我将使用显式等待来检查随机添加,并在等待无法解决“错误引用”时让它通过解决实际请求的对象。
/** By identifier for the error dialog addition.*/
private static final By ERR_DLG = By.className("error");
/**
* Delegate method that will attempt to resolve the occasional page error condition prior to performing the delegate lookup on the WebDriver.
* <p/>
* This method will fail on Assert behavior if the error dialog is present on the page.
*
* @param driver WebDriver referenced for the test instance.
* @param lookup By reference to resolve the desired DOM reference.
* @return WebElement of the specified DOM.
*/
private final WebElement safeResolve(WebDriver driver, By lookup)
WebDriverWait wait = new WebDriverWait(driver, 1);
WebElement errDlgRef = null;
try
errDlgRef = wait.until(ExpectedConditions.visibilityOfElementLocated(ERR_DLG));
catch (TimeoutException te)
//This is actually OK, in that in the majority of cases this is the expected behavior.
//Granted this is bad form for Unit-Testing, but Selenium at an Integration-Test level changes the rules.
Assert.assertNull("Unexpected Error Dialog exists in DOM", errDlgRef);
return driver.findElement(lookup);
这个解决方案有点像锤子,但我认为它会起作用。所有查找都需要通过此方法。如果您在测试中使用 List WebDriver.findElements(By) 函数,您可能还需要一个类似的方法,或者一种从中抽象出来的方法。
【讨论】:
【参考方案2】:我建议使用以下
List<WebElement> Elements = getDriver().findElements(method);
首先,当您进入页面时,您只需准备页面元素列表。 然后在代码中多次包含此过程。您将列表与新列表进行比较,看看是否出现错误元素,这意味着您将在新列表中多出一个元素。然后你抓住它。
【讨论】:
你能说得更具体点吗?我知道如何将页面元素添加到列表中。但我有什么要比较的?它在代码中的样子如何? 我以为你的错误框是页面中出现的新元素。然后,如果您有列表元素,您可以将新列表与旧列表进行比较。万一出现错误的新列表将包括您的错误框。然后代码就会知道添加了新元素。请参阅此post 以获得比较帮助 不幸的是,错误框不是新元素。这个元素是存在的,但它只是改变了他在 DOM 中的类名。 那么,为什么不用相同的过程比较类名呢?以上是关于Selenium + Java 错误监听器 ext.js的主要内容,如果未能解决你的问题,请参考以下文章