2013-05-26 21 views
5

Uso Selenium con Phantomjs e voglio ottenere il contenuto della pagina dopo che la pagina è stata caricata completamente.selenio con PhantomJs attendere fino a pagina completamente caricata?

ho cercato http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp ma non sembra lavorare con phantomjs

attesa esplicito:

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

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

o implicita attesa:

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

    content = driver.PageSource; 

    driver.Quit(); 
} 

Il contenuto è ancora carente. L'unico modo è inserire Thread.Sleep (waitTime); che non è una buona soluzione per questo.

Grazie.

risposta

1

provare qualcosa di simile:

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

ho creato un metodo di estensione. In questo metodo puoi mettere le tue condizioni.

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; 

    } 

Come

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

L'URL dovrebbe essere uguale quasi immediatamente. Il problema è aspettare che il contenuto si carichi prima di fare qualcosa con esso –

3

Per la vostra "wait esplicito:" l'opzione, penso che la sequenza corretta dovrebbe essere:

1) Passare al bersaglio URL:

driver.Navigate().GoToUrl(url); 

2) Attendi che l'URL di destinazione sia completamente caricato da

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

In questo modo la riga successiva attenderà la pagina caricata completamente prima di leggere PageSource.

Problemi correlati