Selenium等待文档准备就绪

151

有人能告诉我如何使Selenium等待页面完全加载吗? 我想要一些通用的东西,我知道我可以配置WebDriverWait并调用类似于“find”的内容来等待,但我不需要那么多。 我只需要测试页面成功加载并继续下一页进行测试。

我在.net中找到了一些东西,但无法在java中使其工作...

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

有任何想法吗?


为什么你不想使用wait? - Amey
8
你是指显式等待吗?这需要花费时间,我正在测试大约10,000个页面。 - Girish
2
我的意思是,如果我正在测试大量的链接,添加一个固定的等待时间可能不是个好主意,对吧? - Girish
14
等待固定秒数是没有用的。那就是瞎猜。 - Anders Lindén
鉴于页面的JavaScript可以运行任何通用代码,编写一个程序等待其完成是不可能的。这是停机问题(https://en.wikipedia.org/wiki/Halting_problem)的一种形式。这里的任何解决方案都将需要做出妥协或基于底层网页的假设。 - speedplane
如下面的答案所述,大多数事情已经等待(driver.get())。一个不等待的特殊情况是表单提交点击按钮,请参见Python Selenium - Wait until next page has loaded after form submit - Stack Overflow - user202729
27个回答

0
public boolean waitForElement(String zoneName, String element, int index, int timeout) {
        WebDriverWait wait = new WebDriverWait(appiumDriver, timeout/1000);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(element)));
        return true;
    }

-1

这里有一个类似的 Ruby 示例:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { @driver.execute_script('return document.readyState').eql?('complete') }

你的代码对我不起作用。我该如何在Ruby中切换到iframe并等待onload="javascript:pageload(); functionalPageLoad();"重新加载页面? 我发现自己在页面内打开了iframe,我可以访问它,然后页面重新加载,我就无法再访问该frame了。 我已经阅读了很多关于等待、睡眠、时间、切换到frame然后切换回父级的答案,但是我无法达到我的目标。 - Amanda Cavallaro
1
听起来你的问题主要是关于如何切换到iFrame,而不是等待文档加载。如果在有关处理iFrame的问题的问题中找不到解决方案,最好开一个新的问题。 - emery

-1

对于需要等待特定元素出现的人(使用C#)

public static void WaitForElement(IWebDriver driver, By element)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
    wait.Until(ExpectedConditions.ElementIsVisible(element));
}

如果您想等待DOM中是否存在class="error-message",只需执行以下操作:

WaitForElement(driver, By.ClassName("error-message"));

对于id,代码将会是:

WaitForElement(driver, By.Id("yourid"));


-1

我已检查页面加载完成,使用的是Selenium 3.14.0

    public static void UntilPageLoadComplete(IWebDriver driver, long timeoutInSeconds)
    {
        Until(driver, (d) =>
        {
            Boolean isPageLoaded = (Boolean)((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete");
            if (!isPageLoaded) Console.WriteLine("Document is loading");
            return isPageLoaded;
        }, timeoutInSeconds);
    }

    public static void Until(IWebDriver driver, Func<IWebDriver, Boolean> waitCondition, long timeoutInSeconds)
    {
        WebDriverWait webDriverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
        webDriverWait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
        try
        {
            webDriverWait.Until(waitCondition);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

-1

你可以让线程休眠直到页面重新加载。这不是最好的解决方案,因为你需要估计页面加载需要多长时间。

driver.get(homeUrl); 
Thread.sleep(5000);
driver.findElement(By.xpath("Your_Xpath_here")).sendKeys(userName);
driver.findElement(By.xpath("Your_Xpath_here")).sendKeys(passWord);
driver.findElement(By.xpath("Your_Xpath_here")).click();

我发现Thread.sleep(5000)常常是唯一可以让测试正常运行的方法,尽管所有的建议都反对使用它。对我来说,等待元素的任何组合都不起作用,特别是由于许多元素在实际找到之前无法被识别。 - Steve Staple

-1
public void waitForPageToLoad()
  {
(new WebDriverWait(driver, DEFAULT_WAIT_TIME)).until(new ExpectedCondition<Boolean>() {
      public Boolean apply(WebDriver d) {
        return (((org.openqa.selenium.JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete"));
      }
    });//Here DEFAULT_WAIT_TIME is a integer correspond to wait time in seconds

-3

你在使用Angular吗?如果是的话,可能webdriver无法识别异步调用已经完成。

我建议看一下Paul Hammants ngWebDriver。 方法waitForAngularRequestsToFinish()可能会很有用。


他完全没有使用Angular。这个答案被downvote了,因为看起来你没有仔细阅读原始问题。 - zelusp
但不要让负面评价影响你的情绪。这里的人们都是出于好意。批评实际上是一种爱的表现(因为如果有人花时间纠正你,那是因为他们在乎)。请查看《如何聪明地提问》(http://www.catb.org/~esr/faqs/smart-questions.html#stackoverflow) - 这些想法也适用于聪明地回答问题。 - zelusp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接