我有一套相当大的Selenium测试(大约180个),这些测试在XP和Win7 32 / 64bit机器上长期运行良好。
最近,在Windows 7更新(可能是巧合)之后,测试变得不可靠。它们随机失败,但始终存在同样的问题 - 显示预期的屏幕,但WaitForPageToLoad()方法不会返回以确认这一点。这不会发生在XP机器上,只有最近更新的Win7机器。
平台:Win7,32和64位,Selenium 1.0和2.33.0(行为没有区别),VS2008,浏览器IE9。
场景:测试最初显示一个带有单个按钮的“重启”屏幕,单击应启动登录屏幕的按钮(所有测试都通过相同的代码执行此操作)。登录屏幕显示在浏览器中但测试线
selenium.WaitForScreenToDisplay(30000);
不返回,因此测试超时并显示错误消息。测试将以这种方式完全随机失败 - 其中大约一半失败,但不一致相同。
当人类与浏览器交互时,应用程序本身表现得非常好。 selenium日志没有提供太多线索 - 最后一行总是'等待页面',例如“......命令请求:waitForPageToLoad [30000,...]”。
在VS调试器中单步执行测试永远不会重现问题。
问题显现的实际代码是
selenium.Open(GetRestartPageURL());
selenium.WaitForPageToLoad("30000");
selenium.Click("Button");
selenium.WaitForPageToLoad("30000"); <-- this is where it times out even though the expected screen that is launched by "Button" is now displayed in the browser
是否存在已知问题或解决方法?这是IE9和Selenium 1.0的问题吗?它在关键时刻突然出现。
答案 0 :(得分:1)
这被证明是IE9 / 10和/或selenium中的一个错误,或者至少是IE9 / 10中的一个错误,即硒人不会很快解决这个问题。我通过编写自己的WaitForPage方法来解决它,该方法在浏览器中查看window.document.readyState并监视延迟,因此我仍然有一个超时。
这是代码,如果它可以帮助其他人:
internal static void WaitForPageToLoad(ISelenium selenium)
{
//Wait until the browser reports that it is no longer loading the page, or 'timeOut' has been reached.
//Pause 1/4 second between attempts (should normally be sufficient for the page to load, unless it is a very slow page)
const int timeOut = 30000; //mS
const int pause = 250; //mS
int timeWaited = 0;
do
{
System.Threading.Thread.Sleep(pause);
timeWaited += pause;
}
while (selenium.GetEval("window.document.readyState") != "complete" && timeWaited<timeOut);
if (timeWaited >= timeOut)
{
//abort test and notify error:
Assert.Fail("Expected page was not dislpayed");
}
}