2013-05-26 14 views
5

Używam Selenium z Phantomjs i chcę uzyskać zawartość strony po pełnym załadowaniu strony.selen z PhantomJs czekać aż strona w pełni załadowana?

Próbowałem http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp ale nie wydaje się pracy z phantomjs

Explicit oczekiwania:

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(); 
} 

Kolejny test:

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; 
} 

lub domniemane oczekiwania:

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

    content = driver.PageSource; 

    driver.Quit(); 
} 

Treści wciąż brakuje. Jedynym sposobem jest umieszczenie Thread.Sleep (waitTime); co nie jest dobrym rozwiązaniem.

Dzięki.

Odpowiedz

1

spróbować czegoś takiego:

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

I stworzyli metodę rozszerzenia. W tej metodzie możesz umieścić swój stan.

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; 

    } 

Jak

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

Adres URL powinien być równy niemal natychmiast. Problem polega na oczekiwaniu na załadowanie zawartości, zanim cokolwiek z nią zrobisz –

3

Dla Twojej "Explicit czekać:" opcja, myślę, że prawidłowa kolejność powinna być:

1) Przejdź do docelowego adresu URL przez:

driver.Navigate().GoToUrl(url); 

2) Poczekaj, aż docelowy adres URL zostanie w pełni załadowany przez

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

W ten sposób następna linia będzie czekać całkowicie załadowana strona przed odczytywaniem PageSource.

Powiązane problemy