2008-09-17 16 views
9

W pewnych nieznanych sytuacjach selen nie wykrywa, że ​​strona załadowała się podczas korzystania z metody otwartej. Używam Java API. Na przykład (Ten kod nie będzie produkować ten błąd nie wiem o widocznej z zewnątrz stronę, która będzie..):Jak uzyskać selen, aby rozpoznać, że strona została załadowana?

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

Gdy wystąpi błąd, wezwanie do „otwartych” czasach, nawet jakbyś może wyraźnie zobaczyć, że strona została pomyślnie załadowana przed upływem limitu czasu. Zwiększenie limitu czasu nie pomaga. Wywołanie "typu" nigdy nie występuje, nie poczyniono żadnych postępów.

Jak uzyskać selen, aby rozpoznać, że strona została załadowana po wystąpieniu tego błędu?

Odpowiedz

1

Kiedy wykonuję testy Selenium, czekam, aby zobaczyć, czy dany element jest widoczny (waitForVisible), a następnie wykonuję swoje działanie. Zwykle próbuję użyć elementu po tym, który wpisuję.

0

Włączenie funkcji "multiWindow" rozwiązało problem, choć nie jestem do końca jasny.

SeleniumServer (int port, Boolean slowResources, logiczna multiokno)

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

Wszelkie wyjaśnienie byłoby pomocne.

0

Występują podobne problemy podczas korzystania z Selenium do testowania aplikacji z iFrames. Zasadniczo wydawało się, że po załadowaniu głównej strony (strony zawierającej ramki iframe) Selenium nie było w stanie określić, kiedy zawartość elementu iframe została załadowana.

Patrząc na źródło linku, który próbujesz wczytać, wygląda na to, że istnieje JavaScript, który tworzy dodatkowe elementy strony po wczytaniu strony. Nie mogę być tego pewien, ale możliwe, że to właśnie powoduje problem, ponieważ wydaje się podobny do sytuacji, którą spotkałem powyżej.

Czy pojawia się ten sam rodzaj błędów podczas ładowania strony statycznej? (tzn. coś z prostym html)

Jeśli nie możesz uzyskać lepszej odpowiedzi, wypróbuj fora selenowe, zazwyczaj są dość aktywne, a twórcy Selenium odpowiadają na dobre pytania.

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

Ponadto, jeśli jeszcze tego nie próbowałem, dodać wywołanie browser.WaitForPageToLoad („15000”), po wezwaniu do otwarcia. Zauważyłem, że robienie tego po każdej zmianie strony powoduje, że moje testy są trochę solidniejsze, mimo że nie powinny być technicznie wymagane. (Gdy Selen wykryje, że strona faktycznie został załadowany, to trwa, więc rzeczywista zmienna limitu czasu nie jest tak naprawdę problemem ..

1

Korzystanie „openAndWait” zamiast „open” rade.

z website.

wiele działań może być wywołana z „AndWait” przyrostek, np „clickAndWait” Ten przyrostek mówi selen, że akcja spowoduje, że przeglądarka, aby nawiązać połączenie z serwerem, a selen powinien Poczekaj na załadowanie nowej strony:

+1

Pytanie dotyczy interfejsu API Selenium RC, który nie obsługuje części "AndWait". To tylko w IDE Selenium. –

+0

Uzgodnione, to nie jest przydatna odpowiedź. Nie tylko metody "... AndWait" są niedostępne w interfejsie API języka Java, ale cały problem polega na tym, że Selenium nie wykrywa poprawnie po załadowaniu strony. Korzystanie z tych metod i tak by nie pomogło. http://release.seleniumhq.org/selenium-core/0.8.0/reference.html#waitForPageToLoad – Hovis

2

Ostatnio miałem do czynienia z tym problemem.

Wszystkie rozwiązania oparte na JS nie pasowały do ​​kombinacji ICEFaces 2.x + Selenium 2.x/Webdriver.

Co zrobiłem i co pracował dla mnie jest następująca:

W rogu ekranu, tam wskaźnik aktywności połączenia.

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

W moim badanej jednostki Java, czekam aż jej „bezczynności” obraz pochodzi z powrotem:

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

Można wyłączyć renderowanie tego wskaźnika w budowie produkcyjnej, czy pokazywanie go na stronie niepotrzebne, lub użyj puste obrazy 1x1 jako obrazy.

Działa w 100% (z wyskakującymi okienkami, komunikatami itp.) I zwalnia z piekła określania waitForElement (...) dla każdego elementu osobno.

Mam nadzieję, że to komuś pomaga.

0

Nie to idealne rozwiązanie, ale używam tej metody

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

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

Tak, to jest rodzaj sprawdzenia, czy strona nie został załadowany przez określony czas, więc to nie jest załadowany.

0

Jeśli strona nie ma AJAX, spróbuj szukać stopki strony (ja też użyć JUnit fail(""), można użyć System.err.println() zamiast):

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()' spowoduje zgłoszenie wyjątku, jeśli nie zostanie znaleziony element stopki. Nie dostaniesz 60 prób, które próbowałeś tam zaprogramować. – Alexander

0

Innym pomysłem jest modyfikacja AJAX API (aby dodać tekst po akcjach AJAX). Po ajax akcji została zakończona, przed powrotem ustawić niewidzialne pole PRAWDA, selen, znajdzie je i czytać jak zielone światła

w HTML:

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

w selen

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

Może to ci pomoże ....

Rozważmy następującą metodę na stronie o nazwie 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."); 
      } 
    } 

I możesz wywołać tę metodę w swojej funkcji. Ponieważ jest to metoda statyczna, możesz zadzwonić bezpośrednio z nazwą klasy.

public class Test(){ 
    WebDriver driver; 

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