Thread.sleep("2000");
每次将等待4秒,还是将最大时间限制设置为4秒。我什至尝试过,但这确实减慢了我的测试执行速度。我需要帮助。
#1 楼
查看“等待”命令而不是睡觉-在此站点或Google上进行搜索将为您提供许多示例评论
避免OP等问题的最有用的方法是使用“ waitForPageToLoad”方法。完全值得的。
– joshin4colours
13-10-10在11:35
#2 楼
您可以使用WebDriverWait与页面加载同步。类似以下内容可能会有所帮助WebDriverWait wait = new WebDriverWait(driver, 15); //you can play with the time integer to wait for longer than 15 seconds.`
wait.until(ExpectedConditions.titleContains("title")); //if you want to wait for a particular title to show up
OR
wait.until(ExpectedConditions.presenseOfElementLocated(ByLocator)); //in case you want to wait for a particular element to appear on the page.`
#3 楼
睡眠方法几乎总是最不可接受的同步自动化测试的方法。更好的方法可能是注册事件并在处于所需状态时检查事件是否引发,或者使用轮询循环,当系统准备就绪(例如,出现元素ID)或超时时,轮询循环可使测试继续如果花费的时间超过了预定的最大等待时间,则会发生此错误。 (请参见自动测试困)评论
此链接没有任何详细信息。说这是出售。
–ilm
16年2月6日在9:11
#4 楼
永远不要在测试中使用睡眠。您的每次睡眠都表明测试设计不好。假设您有1000毫秒的睡眠时间,但是加载某些内容则需要1002毫秒-测试会失败。如果花费996ms,那么您正在浪费时间。话虽如此,我只是在stackoverflow中回答了几乎相同的问题-https://stackoverflow.com/questions/18843581/wait-for-elment-webdriver-pageobject-pattern/18844275#18844275评论
我认为你有一点。但是对于页面加载,我们可以使用WaitForPageLoad()吗? 。有时由于网络速度慢,我的应用程序变慢或页面加载时间变慢。在那些情况下如何处理硒?
– kittudk
2013年9月26日下午5:55
除非您提供的是静态html,否则“页面加载有限”是没有问题的。如今,东西一直都在异步加载,这种概念已经不复存在了。作为测试人员,您必须知道何时会发生某些特定的事情,并在继续之前等待该事情发生。因此,您宁愿等待(例如)提交按钮可见,并假设页面处于某种状态,以便您可以继续。如果您通过代理运行测试,则browsermob具有类似WaitForNetworkTrafficToStop之类的功能,但我会选择WebDriverWait。
– Erki M.
2013年9月27日上午7:50
#5 楼
此代码告诉Selenium最多搜索60秒,以使元素ID出现在页面上。一旦找到元素,就可以与它进行交互。如果在60秒内未找到该元素,则将引发java.lang.AssertionError,原因是“超时”。for (int second = 0;; second++){
if (second >= 60)
fail("timeout");
try{
if (1 == driver.findElements(By.xpath("//a[@id=\"id-of-element"]")).size()){
driver.findElement(By.xpath("//a[@id=\"id-of-element")).click();
break;
}
} catch (Exception e){
}
}
根据Kate的评论,代码不会产生60秒的等待时间。
要等待元素出现,我将使用隐式等待:
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
这意味着,每当您调用WaitForElement()或WaitForElements()时,驱动程序将最多等待60秒,以显示指定的一个或多个元素。参见http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits和http://www.bizalgo.com/2012/01/14/timing-races-selenium-2-implicit-waits-explicit -waits /。
评论
我认为这不会给您60秒的保险丝-它只需要60次迭代,而这需要花费任何时间-为此,您确实需要包含一个明确的等待时间1秒。
–凯特·保罗(Kate Paulk)
2013年9月17日18:33
这是IMO的最佳答案,除了您应该等待某个日期(即,不是+ 60秒)而不是如上所述的60个计数,并且可以将其重构为使用By选择器和任何根元素的方法,或者默认为驱动程序可以将其用作IWebDriver或IWebElement上的扩展方法,因此您的驱动程序始终尝试等待所访问的任何元素都可见。
–chrisc
2015年6月18日在16:41
#6 楼
简单的ready2use代码段>为我完美工作static void waitForPageLoad(WebDriver wdriver) {
WebDriverWait wait = new WebDriverWait(wdriver, 60);
Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
}
};
wait.until(pageLoaded);
}
评论
很久以来,该线程似乎一直处于活动状态。 @kituudk-解决了您对页面加载时间的查询?
– NarendraC
16年7月6日在6:45
#7 楼
根据我的经验,driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
是正确,最干净的方法。实例化驱动程序后调用一次,所有后续调用将正确等待指定的时间跨度(在这种情况下为60秒)最好在时间范围内慷慨地进行明确的等待,因为较低的环境可以加载时间有偏差,尤其是在第一次访问新鲜环境时。话虽如此,Web应用程序仍处于60秒的高端。
评论
为什么不使用显式等待并等待自定义条件?
–demouser123
16年2月6日在19:41
#8 楼
尽管document.readyState大部分时间都在工作,而不是依赖document.readyState,但我还是建议您观察页面上哪个元素最后加载。您可以根据该最终元素的加载进行进一步处理评论
你可以扩大这个答案吗?为什么其他解决方案更好?您能否在答案中举一个实施示例?
– ECiurleo
17年9月7日在8:23
例如,假设您有一个HTML表格在页面上最后加载,则以该表格的ID为例:table1 WebDriverWait wait1 = new WebDriverWait(driver,20); wait1.until(ExpectedConditions.visibilityOf(driver.findElement(By.Id(“ table1”))));您可以基于此执行其余处理。
– Pinakin Chaubal
17-10-17在8:20
#9 楼
与以前的响应一样,使用静态“睡眠”不是一个好主意。 WebDriver Wait(...)应该是最适合您的选择。但是由于某些元素以不同的顺序加载,因此您需要特别注意这种情况。就我而言,最好的结果是询问JS是否已经准备就绪:)执行验证的方法:
return ((string)Driver.ExecuteScript("return document.readyState")).Equals("complete");
当然,Driver类是原始WebDriver驱动程序的包装并执行脚本,我正在使用:
public object ExecuteScript(string javascriptCode, params object[] args)
{
return ((IJavaScriptExecutor)DriverInstanceInstance).ExecuteScript(javascriptCode, args);
}
#10 楼
我们在产品中也遇到了这个问题,增加了我们使用Dojo的复杂性,因此有Javascript代码在readystate完全更改后执行。因此,在载入Javascript之后,我们会调用一小段Javascript代码: /**
* Sets the focus on a field
*/
setFocus : function(focusedElement, defaultFocusGainedDivId) {
// timeout needed for IE to work
setTimeout(function() {
focusedElement.focus();
if ( typeof (focusedElement.select) !== "undefined") {
// select a value in the text inputs
// only (no combobox).
focusedElement.select();
}
if(!defaultFocusGainedDivId) {
defaultFocusGainedDivId = "defaultFocusGainedDiv";
}
domConstruct.create("div", {"id": defaultFocusGainedDivId, "class": "u-display-none" }, win.body());
}, 300, focusedElement);
}
然后在Selenium端,我们有这样的代码:我们在加载新页面时会调用:
private static By defaultFocusGainedBy = By.cssSelector("div#defaultFocusGainedDiv.u-display-none");
/**
* Waits for 5 seconds for a div with id='defaultFocusGainedDiv' and css
* class='focusGained'. This div is added after the focus is set to a page's
* default control using js/utils/CommonUtils.js' setFocus() function.
*
*/
public static void waitForPageFocusGained() {
wdWait.until(ExpectedConditions.presenceOfElementLocated(defaultFocusGainedBy));
}
这主要解决了此问题,尽管您确实需要遵守纪律以继续使用两个摘要。
#11 楼
synchronized(driver) {
driver.wait(4000);
}
评论
欢迎来到拉曼SQA。您能详细说明一下吗?根据经验,一段代码比附带的说明没有多大用处。
–corsiKa♦
13年8月19日在14:56
评论
我遇到了同样的问题。输入UN和PWD后,我输入的每个输入都单击Login按钮消失了。加载时间更多,最后也没有登录。根据我的一个朋友在工作中的建议,我更改了我正在自动执行的URL,最后一切正常。