【问题标题】:selenium with PhantomJs wait till page fully loaded?带有 PhantomJs 的硒等到页面完全加载?
【发布时间】:2013-05-26 15:05:41
【问题描述】:

我将 Selenium 与 Phantomjs 一起使用,并希望在页面完全加载后获取页面内容。

我尝试了http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp,但它似乎不适用于 phantomjs

显式等待:

using (IWebDriver driver = new PhantomJSDriver())
{
    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"));

    driver.Navigate().GoToUrl(url);

    content = driver.PageSource;

    driver.Quit();
}

另一个测试:

using (IWebDriver driver = new PhantomJSDriver())
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

    driver.Url = url;

    IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
        {
            return d.FindElement(By.Id("footer")); // failed because it's not yet loaded full content 
        });

    content = driver.PageSource;
}

或隐式等待:

using (IWebDriver driver = new PhantomJSDriver())
{
    driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
    driver.Navigate().GoToUrl(url);

    content = driver.PageSource;

    driver.Quit();
}

内容仍然缺乏。唯一的办法是把 Thread.Sleep(waitTime);这不是一个好的解决方案。

谢谢。

【问题讨论】:

    标签: c# selenium phantomjs


    【解决方案1】:

    对于您的“显式等待:”选项,我认为正确的顺序应该是:

    1) 通过以下方式导航到目标网址:

    driver.Navigate().GoToUrl(url);
    

    2) 等待目标 url 完全加载

    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"));
    

    这样下一行将在读取 PageSource 之前等待页面完全加载。

    【讨论】:

      【解决方案2】:

      我创建了一个扩展方法。在这种方法中,您可以输入您的条件。

        public static bool WaitUntil(this IWebDriver driver, Func<IWebDriver, bool> expression, int timeOutSeconds = 10)
          {
      
              TimeSpan timeSpent = new TimeSpan();
      
              bool result = false;
              while (timeSpent.TotalSeconds < timeOutSeconds)
              {
      
                  result = expression.Invoke(driver);
      
                  if (result == true)
                  {
                      break;
                  }
                  Thread.Sleep(timeSleepingSpan);
                  timeSpent = timeSpent.Add(new TimeSpan(0, 0, 0, 0, timeWaitingSpan));
      
              }
              return result;
      
          }
      

      喜欢

             driver.WaitUntil(d => d.Url.Equals("https://www.meusite.com/"));
      

      【讨论】:

      • URL 应该几乎立即相等。问题是在对其进行任何操作之前等待内容加载
      【解决方案3】:

      试试这样的:

      try (
        ExpectedConditions.presenceOfElementLocatedBy
        ExpectedConditions.visibilityOfElementLocatedBy
      ) catch error if both conditions are not met
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多