2013-05-26 3 views
5

Я использую Selenium с Phantomjs и хочу получить содержимое страницы после полной загрузки страницы.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); что не является хорошим решением для этого.

Спасибо.

ответ

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

Для вашего "Явного ожидания:" вариант, я считаю, что правильная последовательность должна быть:

1) Перейдите к целевому URL по:

driver.Navigate().GoToUrl(url); 

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.

Смежные вопросы