Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium测试在单独运行时通过,在套件中运行时挂起,在启用日志记录或远程运行时惊人地通过套件_Java_Selenium_Selenium Webdriver_Testng - Fatal编程技术网

Java Selenium测试在单独运行时通过,在套件中运行时挂起,在启用日志记录或远程运行时惊人地通过套件

Java Selenium测试在单独运行时通过,在套件中运行时挂起,在启用日志记录或远程运行时惊人地通过套件,java,selenium,selenium-webdriver,testng,Java,Selenium,Selenium Webdriver,Testng,不一致性是这里的主题。我有一个大型的Selenium测试套件,它在Mac上给我带来了问题。我的同事使用Windows,他们没有遇到任何问题。基本上,当我使用TestNG运行整个套件时,测试的行为与单独运行时不同。单独完成测试时,不会出现任何问题。当作为一个整体套件运行时,当前大约有十个测试,要执行的第三个测试总是挂起在完全相同的位置。它试图找到一个元素,但从未出现在Selenium API中。不返回点用下面的XXX标记 driver.manage().timeouts().pageLoadTim

不一致性是这里的主题。我有一个大型的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上也出现了同样的行为,尽管程序挂起时寻找的元素在浏览器之间确实会发生变化。我目前正在使用Mac10.10.6和最新版本的Selenium、Eclipse和TestNG。同样的行为也发生在不同的Mac机器上。无论我是在Eclipse中运行TestNG套件还是从命令行运行TestNG套件,行为都是相同的。当通过
-log someFile
在节点上启用日志记录时,或者当节点在远程机器上运行(即不在本地运行)时,整个套件的执行不会出现任何问题。该套件相当大,因此如果有任何其他代码我可以张贴在这里,这将有助于诊断问题,请让我知道。任何给我指出正确方向的想法都会非常有帮助。

我认为您应该将wait从“0”隐式增加

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

Selenium文档隐式地提到了这一点

隐式等待
隐式等待是告诉WebDriver在试图查找一个或多个元素(如果它们不立即可用)时轮询DOM一段时间。默认设置为0。一旦设置,将为WebDriver对象instanc的生命周期设置隐式等待。放置超时和等待本质上是主观的,因为加载页面所需的时间可能不同。您可以做的最好的事情是将它放在while循环中,但要包含一个大的超时,以强制代码退出while循环,或者如果因为毕竟是测试而找不到元素,则抛出一个错误

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

像这样的东西应该能奏效

你试过把它关掉再打开吗?这听起来好像真的有帮助。我会尝试这样做:1)在查找元素之前插入一个记录器(保存视口屏幕截图和原始html)2)单独运行测试3)运行整个套件4)比较同一测试的成功和失败测试结果之间的屏幕截图和原始html。5) 弄清楚发生了什么;-)诀窍:使用firebug插件运行,并在调试模式下运行套件。就在元素被发现之前,停在那里,在firebug中chk以确认元素的存在?如果元素与您正在使用的定位器一起出现(我对此表示怀疑),那么问题是另外的,否则您会发现问题:)
…尽管程序挂起时正在查找的元素在浏览器之间确实会发生变化
您可以详细说明一下,只是为了清除。@nullpointer设想我们仅在Chrome中运行该套件。某个页面上有一个锚元素。该锚元素的XPath是执行挂起时传递到
findElement()
的内容。杀死程序,在Chrome中再次运行它。执行再次暂停。当程序挂起时,相同的锚正被传递到
findElement()
。杀死程序,在Firefox上运行套件。它仍将挂起在
findElement()
,但传入的XPath将不同于我们在Chrome中的锚定标记。对于更紧凑的版本,可以使用
for
循环,因为它是提供的最佳完整答案,所以instead将接受这一点。然而,这并不能解决问题的核心。您是否建议不要使用隐式或显式等待?您将使用什么方法作为超时?@Steve,如果您使用的是Selenium2,则有一个WebDriverWait类可能对您更有用
var wait=new-WebDriverWait(驱动程序,TimeSpan.FromSeconds(timeoutInSeconds));返回wait.Until(drv=>drv.FindElement(by))@bilpor,它是一个显式等待伙伴。