我每天两次运行近30-40个测试用例。每次某些测试用例由于页面加载时间而失败时。实际上,无论何时我觉得需要花费更多的时间来加载,我都明确提到过。但是仍有5-6个测试案例失败。我如何让硒等待页面加载??下面的代码将执行什么操作?
Thread.sleep("2000");
每次将等待4秒,还是将最大时间限制设置为4秒。我什至尝试过,但这确实减慢了我的测试执行速度。我需要帮助。

评论

我遇到了同样的问题。输入UN和PWD后,我输入的每个输入都单击Login按钮消失了。加载时间更多,最后也没有登录。根据我的一个朋友在工作中的建议,我更改了我正在自动执行的URL,最后一切正常。

#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