我在Eclipse中使用Java运行selenium RC。我遇到的问题是使用selenium.click命令。我点击的链接会加载一个新页面。有时需要5秒钟,有时需要2-3分钟。每当我看到页面加载并且在我的测试失败后立即收到消息“我等待完成等待操作的时间。”
我尝试使用selenium.isElementPresent来检查正在加载的页面。但是,当我在调试模式下运行时,我注意到它永远不会通过selenium.click甚至达到检查元素的程度。根据我的理解,selenium.click命令中内置了一个等待。所以我的问题是,有没有人知道如何忽略内置等待,所以我可以改为使用selenium.isElementPresent?
selenium.click(Link);
for (int i = 0; i < 60 ; i++) {
if (selenium.isElementPresent(Home)) {
break;
}
Thread.sleep(1000);
}
我还尝试使用selenium.open直接转到URL并完全跳过链接,然后使用selenium.isElementPresent来验证页面是否已加载。我在那里得到了同样的问题,在失败之前它从未实际进入for循环。
答案 0 :(得分:1)
我遇到过同样的问题。我只是使用try / catch包含click命令,以便捕获错误,然后执行断言标题并检查页面上的预期文本。
答案 1 :(得分:1)
我建议您将此方法/功能合并到代码中。
public static void WaitForPageToLoad(IWebDriver driver)
{
TimeSpan timeout = new TimeSpan(0, 0, 2400);
WebDriverWait wait = new WebDriverWait(driver, timeout);
IJavaScriptExecutor javascript = driver as IJavaScriptExecutor;
if (javascript == null)
throw new ArgumentException("driver", "Driver must support javascript execution");
wait.Until((d) =>
{
try
{
string readyState = javascript.ExecuteScript("if (document.readyState) return document.readyState;").ToString();
return readyState.ToLower() == "complete";
}
catch (InvalidOperationException e)
{
//Window is no longer available
return e.Message.ToLower().Contains("unable to get browser");
}
catch (WebDriverException e)
{
//Browser is no longer available
return e.Message.ToLower().Contains("unable to connect");
}
catch (Exception)
{
return false;
}
});
}
有时selenium的.Click()会等待自我参考响应。要超越它,并让测试继续进行,我将使用您的代码执行以下操作。
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
try{ selenium.click(Link); }
catch(WebDriverException) {}
WaitForPageToLoad(driver);
//look for your element.
将其与隐式等待相结合,一旦JavaScript报告该页面已完成加载,您就可以查找您的元素。我发现它比在60秒内找不到元素的硒更具动态性。
答案 2 :(得分:0)
解决方案取决于您正在测试的应用程序的性质。如果单击操作,则加载新页面,然后您可以使用selenium的waitForPageToLoad命令,如下所示:
selenium.click(Link);
selenium.waitForPageToLoad(60000);
注意:该参数是超时值,以毫秒为单位。因此,这将等待最多60秒的页面加载。
点击和等待功能的最佳解决方法可能就是使用Selenium的waitForCondition方法:
selenium.waitForCondition("selenium.isElementPresent(\"Home\")", 60000);
Selenium持续运行isElementPresent方法,直到它返回true或达到作为第二个参数给出的超时值。此外,selenium.waitForCondition
可以运行selenium.isTextPresent
以检查屏幕上是否显示文字,然后继续使用该脚本。