2013-05-26 58 views
5

我使用Selenium with Phantomjs,并希望在页面完全加载后获取页面内容。硒与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);这不是一个很好的解决方案。

谢谢。

回答

1

尝试这样:

try (
    ExpectedConditions.presenceOfElementLocatedBy 
    ExpectedConditions.visibilityOfElementLocatedBy 
) catch error if both conditions are not met 
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/")); 
+1

该URL应该几乎立即相等。在做任何事情之前,问题都在等待内容加载 –

3

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

driver.Navigate().GoToUrl(url); 

1)导航的目标网址

2)等到目标网址完全加载后通过

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之前等待页面完全加载。

相关问题