2008-09-17 12 views
9

In bestimmten unbekannten Situationen erkennt Selen nicht, dass eine Seite geladen wurde, wenn die offene Methode verwendet wird. Ich benutze die Java API. Zum Beispiel (Dieser Code wird diesen Fehler nicht produziert Ich weiß nicht, von einem von außen sichtbaren Seite, die wird..):Wie erhalten Sie Selen um zu erkennen, dass eine Seite geladen ist?

Selenium browser = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com"); 
browser.start(); 
browser.open("http://www.google.com/webhp?hl=en"); 
browser.type("q", "hello world"); 

Wenn der Fehler auftritt, um den Anruf zu ‚öffnen‘ mal aus, auch wenn Sie kann klar sehen, dass die Seite erfolgreich geladen wurde, bevor die Zeitüberschreitung auftritt. Das Erhöhen der Zeitüberschreitung hilft nicht. Der Aufruf von "type" tritt nie auf, es wird kein Fortschritt gemacht.

Wie erhalten Sie Selen um zu erkennen, dass die Seite geladen wurde, wenn dieser Fehler auftritt?

Antwort

1

Wenn ich Selen-Tests mache, warte ich, ob ein bestimmtes Element sichtbar ist (waitForVisible), dann mache ich meine Aktion. Normalerweise versuche ich ein Element nach dem zu verwenden, in dem ich tippe.

0

Die Aktivierung der 'multiWindow'-Funktion hat das Problem gelöst, obwohl mir nicht klar ist, warum.

SeleniumServer (int port, boolean slowResources, boolean Mehrfenster)

SeleniumServer server = new SeleniumServer(4444, false, true); 

Jede Klarstellung wäre hilfreich sein.

0

Ich habe ähnliche Probleme bei der Verwendung von Selenium zum Testen einer Anwendung mit iFrames. Grundsätzlich schien es, als ob die primäre Seite (die Seite, die die Iframes enthielt) geladen wurde, Selenium konnte nicht feststellen, wann der Iframe-Inhalt vollständig geladen war.

Wenn Sie sich die Quelle für den Link ansehen, den Sie zu laden versuchen, sieht es aus, als gäbe es Javascript, das zusätzliche Seitenelemente erstellt, sobald die Seite geladen wurde. Ich kann mir nicht sicher sein, aber es ist möglich, dass dies das Problem verursacht, da es der Situation ähnlich ist, die ich oben erlebt habe.

Erhalten Sie die gleichen Fehler beim Laden einer statischen Seite? (dh, etwas mit geraden html)

Wenn Sie nicht eine bessere Antwort erhalten können, versuchen Sie die Selenforen, sie sind in der Regel ziemlich aktiv und die Selenium-Entwickler reagieren auf gute Fragen.

http://clearspace.openqa.org/community/selenium_remote_control

Auch, wenn Sie nicht bereits versucht haben, einen Anruf zu browser.WaitForPageToLoad („15000“) nach dem Gespräch noch zu öffnen. Ich habe festgestellt, dass dies nach jedem Seitenwechsel meine Tests etwas robuster macht, obwohl dies technisch nicht erforderlich sein sollte. (Wenn Selen feststellt, dass die Seite tatsächlich geladen ist, geht es weiter, so dass die tatsächliche Timeout Variable ist nicht wirklich ein Problem ..

1

Mit ‚openAndWait‘ anstelle von ‚offen‘ wird der Trick.

von den website.

Viele Aktionen können mit dem „AndWait“ Suffix, zB „clickAndWait“ das Suffix Selen sagt genannt werden, die die Aktion der Browser einen Aufruf an den Server zu machen, und dass Selen sollte verursachen Warten Sie, bis eine neue Seite geladen wird.

+1

Die Frage bezieht sich auf die Selenium RC API, die den "AndWait" -Teil nicht unterstützt. Das ist nur in Selenium IDE. –

+0

Einverstanden, das ist keine nützliche Antwort. Nicht nur die "... AndWait" -Methoden sind in der Java-API nicht verfügbar, sondern das Problem besteht darin, dass Selenium nicht korrekt erkennt, wenn die Seite vollständig geladen ist. Die Verwendung dieser Methoden würde sowieso nicht helfen. http://release.seleniumhq.org/selenium-core/0.8.0/reference.html#waitForPageToLoad – Hovis

2

Ich habe dieses Problem vor kurzem konfrontiert.

Alle JS-basierten Lösungen nicht ganz passen ICEFaces 2.x + Selen 2.x/Webdriver-Kombination, die ich habe.

Was ich tat, und was für mich gearbeitet ist folgende:

In der Ecke des Bildschirms gibt es Verbindungsaktivitätsanzeige.

  <ice:outputConnectionStatus id="connectStat" 
             showPopupOnDisconnect="true"/> 

In meinem Java Unit-Test, warte ich, bis seine ‚Leerlauf‘ Bild wieder zurückkommt:

private void waitForAjax() throws InterruptedException { 
    for (int second = 0;; second++) { 
     if (second >= 60) fail("timeout"); 
     try { 
      if ("visibility: visible;".equals(
       selenium.getAttribute("top_right_form:connectStat:[email protected]"))) { 
       break; 
      } 
     } catch (Exception e) { 

     } 
     Thread.sleep(1000); 
    } 
} 

Sie Rendering dieses Indikators in der Produktion Build deaktivieren können, wenn es auf der Seite zeigt, ist unnötig, oder leere 1x1 Gifs als Bilder verwenden.

Funktioniert 100% (mit Popups, Push-Nachrichten usw.) und befreit Sie von der Hölle der Angabe von waitForElement (...) für jedes Element separat.

Ich hoffe, das hilft jemandem.

0

keine perfekte Lösung, aber ich bin mit dieser Methode

$t1 = time(); // current timestamp 
$this->selenium->waitForPageToLoad(30); 
$t2 = time(); 

if ($t2 - $t1 >= 28) { 
    // page was not loaded 
} 

Also, es ist eine Art überprüft, ob die Seite nicht während der angegebenen Zeit geladen wurde, so wird es nicht geladen.

0

Wenn Sie Seite hat keine AJAX, versuchen Fußzeile Seite zu suchen (Ich benutze auch Junit fail(""), können Sie System.err.println() stattdessen verwenden):

element.click(); 
    int timeout =120; 
    // one loop = 0.5 sec, co it will be one minute 
    WebElement myFooter = null; 

    for(int i=0; i<timeout; i++){ 
     myFooter = driver.findElement(By.id("footer")); 
     if(myFooter!= null){ 
     break; 
     } 
     else{ 
     timeout--; 
     } 
} 
if(timeout==0 && myFooter == null){ 
    fail("ERROR! PAGE TIMEOUT"); 
} 
+0

'findElement()' löst eine Ausnahme aus, wenn das Fußzeilenelement nicht gefunden wird. Sie werden nicht die 60 Versuche bekommen, die Sie versucht haben, dort zu programmieren. – Alexander

0

eine andere Idee ist AJAX API (hinzuzufügen, um einen Text zu ändern nach AJAX-Aktionen). Nachdem Ajax-Aktion beendet wurde, vor der Rückkehr, unsichtbares Feld auf TRUE gesetzt ist, wird es Selen finden und als grünes Licht

in html lesen:

<input type='hidden' id="greenlight"> 

in Selen

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){ 
    // do something after page loading 
} 
2

Vielleicht dies wird Ihnen helfen ....

Betrachten Sie die folgende Methode ist in der Seite genannt Functions.java

public static void waitForPageLoaded(WebDriver driver) { 

     ExpectedCondition<Boolean> expectation = new 
    ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver driver) { 
       return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); 
      } 
      }; 

      WebDriverWait wait = new WebDriverWait(driver,30); 
      try { 
        wait.until(expectation); 
      } catch(Throwable error) { 
        Assert.assertFalse(true, "Timeout waiting for Page Load Request to complete."); 
      } 
    } 

Und Sie können diese Methode in Ihre Funktion aufrufen. Da es sich um eine statische Methode handelt, können Sie den Klassennamen direkt aufrufen.

public class Test(){ 
    WebDriver driver; 

    @Test 
    public void testing(){ 
     driver = new FirefoxDriver(); 
     driver.get("http://www.gmail.com"); 
     Functions.waitForPageLoaded(driver); 
    } 
}