2013-05-26 16 views
5

Ich benutze Selenium mit Phantomjs, und möchte den Seiteninhalt nach der Seite voll geladen bekommen.Selen mit PhantomJs warten bis die Seite voll geladen ist?

Ich versuchte http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp aber es scheint, mit PhantomJS

Explicit Warte nicht funktioniert:

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

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

oder implizite Warte:

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

    content = driver.PageSource; 

    driver.Quit(); 
} 

Der Inhalt fehlt noch. Der einzige Weg ist, Thread.Sleep (waitTime) zu setzen; Das ist keine gute Lösung dafür.

Danke.

Antwort

1

versuchen, etwas wie folgt aus:

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

ich eine Verlängerung Methode erstellt haben. In dieser Methode können Sie Ihre Bedingung stellen.

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; 

    } 

Wie

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

Die URL sollte fast sofort gleich sein. Das Problem wartet darauf, dass der Inhalt geladen wird, bevor Sie etwas damit machen –

3

Für Ihre "Explicit Warte:" Option, ich glaube, die richtige Reihenfolge sein sollte:

1) Navigation URL zum Ziel durch:

driver.Navigate().GoToUrl(url); 

2) Warten Sie, bis die Ziel-URL von

vollständig geladen wurde
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")); 

Auf diese Weise wartet die nächste Zeile auf die vollständig geladene Seite, bevor PageSource gelesen wird.

Verwandte Themen