【问题标题】:A Selenium test passes when run individually, hangs when run in a suite, and amazingly passes in the suite when logging is enabled or run remotelySelenium 测试在单独运行时通过,在套件中运行时挂起,在启用日志记录或远程运行时惊人地通过套件
【发布时间】:2016-03-06 02:28:25
【问题描述】:

不一致是这里的主题。我有一个大型 Selenium 测试套件,它在 Mac 上给我带来了问题。我的同事使用 Windows,他们没有遇到任何问题。本质上,当我使用 TestNG 运行整个套件时,测试的行为与单独运行时不同。单独地,测试完成没有任何问题。当作为一个整体运行时,目前大约有十个测试,要执行的第三个测试总是挂在完全相同的位置。它试图找到一个元素并且永远不会从 Selenium API 中出来。下面用XXX标记了不归路。

driver.manage().timeouts().pageLoadTimeout(20000, TimeUnit.MILLISECONDS);
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
try {
    element = driver.findElement(By.xpath(xpathLocator));  // XXX
} catch (NoSuchElementException | org.openqa.selenium.TimeoutException e)

套件未并行运行。 Chrome、Firefox 和 Safari 中也发生了相同的行为,尽管当程序挂起时正在寻找的元素在浏览器之间确实发生了变化。我目前正在使用 Mac 10.10.6 和最新版本的 Selenium、Eclipse 和 TestNG。同样的行为也发生在不同的 Mac 机器上。无论我是在 Eclipse 中还是从命令行运行 TestNG 套件,其行为也是相同的。当通过-log someFile 在节点上启用日志记录或当节点在远程机器上(即非本地)运行时,整个套件的执行没有任何问题。该套件相当大,因此如果我可以在此处发布任何其他有助于诊断问题的代码,请告诉我。任何可以为我指明正确方向的想法都会非常有帮助。

【问题讨论】:

  • 您是否尝试过将其关闭再打开?听起来像这样的东西实际上可以提供帮助。
  • 我会试试这个:1)在查找元素之前插入一个记录器(保存视口屏幕截图和原始 html)2)单独运行测试 3)运行整个套件 4)比较成功和失败之间的屏幕截图和原始 html同一测试的测试结果。 5)弄清楚发生了什么;-)
  • 技巧:使用 firebug add on 运行并在调试模式下运行您的套件。就在找到元素之前停在那里并在萤火虫中检查元素是否存在?如果该元素与您正在使用的定位器一起出现(我怀疑),那么问题是别的,否则您发现了问题:)
  • ...although the element that is being sought when the program hangs does change between browsers你能详细说明一下吗,只是为了清楚。
  • @nullpointer 假设我们只在 Chrome 中运行该套件。某个页面上有一个锚元素。该锚元素的 XPath 是在执行挂起时传递到 findElement() 的内容。杀死程序,在 Chrome 中再次运行它。执行再次挂起。当程序挂起时,同一个锚点就是传递给findElement() 的内容。杀死程序,在 Firefox 上运行该套件。它仍然会挂在findElement(),但传入的 XPath 将与我们在 Chrome 中的锚标记不同。

标签: java selenium selenium-webdriver testng


【解决方案1】:

我认为你应该从'0'隐式增加等待。

我听说 Mac 中存在一些 HTML 加载问题。通过增加时间值,将解决 DOM 加载问题。

Selenium 文档说明了有关隐式等待。

隐式等待 隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不是立即可用)时轮询 DOM 一段时间。默认设置为 0。一旦设置,就会在 WebDriver 对象实例的生命周期内设置隐式等待

【讨论】:

    【解决方案2】:

    设置超时和等待本质上是主观的,因为页面加载所需的时间可能会有所不同。您可以做的最好的事情是将它放在一个 while 循环中,但包括一个大的超时以强制代码退出 while 循环,或者如果找不到元素,因为它毕竟是一个测试,则抛出错误。

     int i = 0;                        
      while (!driver.findElement(By.xpath(xpathLocator))
        {
        //timeout goes here
        i++;
        if (i == 10) throw new exception
    }
    

    这样的事情应该可以解决问题

    【讨论】:

    • 对于更紧凑的版本,可以使用 for 循环代替
    • 我会接受这个,因为它是提供的最佳完整答案。然而,这并不能解决问题的核心。您是否建议不要使用隐式或显式等待?您会使用什么方法作为超时?
    • @Steve,如果您使用的是 Selenium2,那么有一个 WebDriverWait 类可能对您更有用。 var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); return wait.Until(drv => drv.FindElement(by));
    • @bilpor 那是一个明确的等待伙伴。
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多