Selenium.click在等待操作完成时超时
我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我单击的链接将加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,以及测试失败后,我收到消息“超时等待操作完成” 我尝试使用selenium.isElementPresent来检查正在加载的页面。但是,当我在调试模式下运行时,我注意到它永远不会超过selenium。单击甚至可以检查元素。据我所知,selenium.click命令中内置了等待。所以我的问题是,有没有人知道如何忽略内置的等待,这样我就可以改用selenium.isElementPresentSelenium.click在等待操作完成时超时,selenium,webdriver,selenium-rc,Selenium,Webdriver,Selenium Rc,我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我单击的链接将加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,以及测试失败后,我收到消息“超时等待操作完成” 我尝试使用selenium.isElementPresent来检查正在加载的页面。但是,当我在调试模式下运行时,我注意到它永远不会超过selenium。单击甚至可以检查元素。据我所知,selenium.click命令中内置了等待。所以我的问题是,有没有人知
selenium.click(Link);
for (int i = 0; i < 60 ; i++) {
if (selenium.isElementPresent(Home)) {
break;
}
Thread.sleep(1000);
}
selenium。单击(链接);
对于(int i=0;i<60;i++){
如果(硒元素存在(家庭)){
打破
}
睡眠(1000);
}
我还尝试使用selenium.open直接转到URL并完全跳过链接,然后使用selenium.isElementPresent验证页面是否已加载。我在那里遇到了同样的问题,在出现同样的错误消息失败之前,它从未真正进入for循环。我也遇到过同样的问题。我只是用try/catch包装了click命令,以便捕获错误,然后执行了assert title并检查了页面上的预期文本。解决方案取决于您正在测试的应用程序的性质。如果单击操作加载一个新页面,则可以使用selenium的waitForPageToLoad命令,如下所示:
selenium.click(Link);
selenium.waitForPageToLoad(60000);
注意:该参数是以毫秒为单位的超时值。因此,这将等待长达60秒的页面加载
对于点击等待功能,最好的解决方法可能是使用Selenium的waitForCondition方法:
selenium.waitForCondition("selenium.isElementPresent(\"Home\")", 60000);
Selenium连续运行isElementPresent方法,直到它返回true或达到作为第二个参数给定的超时值。此外,
selenium.waitForCondition
可以运行selenium.isTextPresent
,在继续脚本之前检查屏幕上是否有文本。我建议您将此方法/函数合并到代码中
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秒内没有找到元素更具动态性 您永远不会转到
中的语句。应该是for(inti=0;i<60;i++)
。打字错误在问题中,但不是实际的代码,所以我在这里修复了它。但同样的问题仍然存在。实际上,我在这里遇到的问题是,我的测试从未通过selenium.click命令,甚至无法访问selenium.waitForPageToLoad或selenium.waitForCondition。selenium.click似乎有一个内置的等待,我似乎无法使用任何其他方法来验证页面是否已加载。我在2019年来到这里,遇到了这个问题,你找到了解决方法吗?实际上,用try/catch来解决它非常有效。我仍然可以捕获错误,但不能让它通过测试,这样我就可以使用其他方法确认加载的页面。谢谢你的建议。