【问题标题】:Selenium + Java error listener ext.jsSelenium + Java 错误监听器 ext.js
【发布时间】:2015-05-04 14:58:34
【问题描述】:

当我不知道它何时发生时,我如何捕捉错误?

我正在使用 Selenium + Java。为 JS 网页创建测试。

发生错误时,测试会继续单击元素。 错误在那一刻是可见的,所以它不是一个消息框或类似的东西。一个错误框变得可见。然后过了一段时间,测试崩溃了,说它不能点击某个元素。

如何在我的测试运行时监听任何可见(或可点击)的随机元素?这将使我能够捕捉到错误并且测试不会失败。

我应该把我的测试放到两个线程中,一个监听错误,另一个运行我的测试用例吗?

【问题讨论】:

    标签: java selenium extjs listener


    【解决方案1】:

    最好的选择是了解并解决潜在的错误情况。

    如果错误仅在测试中出现,或者无法解决,我建议查看您的驱动程序配置,并确保您看到的对话框不会被 Unexpected_Alert_Behavior 的驱动程序设置覆盖。如果您已将其关闭,我会尝试将其打开,看看它对您的行为有何影响。

    我不完全确定这将解决列出的问题,因为您提到的对话框是 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 中的类名。
      • 那么,为什么不用相同的过程比较类名呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 2016-08-16
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多