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的主要内容,如果未能解决你的问题,请参考以下文章

基于Java+Selenium的WebUI自动化测试框架

extjs4 全局网络异常监听器

如何为 Ext.Msg 定义监听器?

在 EXTJS 4 中向 Ext.Grid.panel 添加监听器

Ext JS 网格面板事件

Java Selenium InvalidElementStateException 错误