2013-03-11 8 views
21

Mam problem z PHPUnit_Selenium w Operze. Jeśli kliknę element na moim kodzie testowym, strona się nie załaduje. W innych przeglądarkach, takich jak Firefox, IE, Chrome i Safari, działa poprawnie.PHPUnit Selenium, funkcja clickAndWait() nie działa w Operze

Kod:

$browser->clickAndWait(link); 

To kolejne kroki od SELENU pilota:

click(link) 
waitForPageToLoad(120000) 

Po tym czasie, jeśli klikam na link w przeglądarce strona jest przeładowana.

Mam Selenium RC v. 2.31.0 i Opera w wersji 12.41, ale testuję także w Operze 11.50.

Czy masz pojęcie, co jest nie tak?

+0

pan przeszukać bug tracker selen? – cweiske

+0

Tak, szukałem na tropiku błędów selenu, ale nie znalazłem rozwiązania mojego problemu. – Szymon

+0

Czy to możliwe, że link jest powiązany z wydarzeniem JavaScript, które nie jest obsługiwane poprawnie przez Operę? Czy możesz ręcznie kliknąć link w Opera? –

Odpowiedz

0

W oryginalnym poście nie było wystarczającej ilości informacji, aby zasugerować ostateczne rozwiązanie, ale powiązanie z komentarzem @Andre pod warunkiem, że "odkażające" przeglądarki działają, a z kolei zapewniają takie funkcje, jak "Copy xPath" być bardzo mylącym i prowadzić do wielu problemów podczas testowania, w zależności od struktury xPath.

Na przykład:

<html> 
    <head></head> 
    <body> 
     <div> 
      <table> 
       <tr> 
        <td>test</td> 
       </tr> 
       <tr> 
        <td>value</td> 
       </tr> 
      </table> 
     </div> 
    </body> 
</html> 

Chociaż powyższy kod jest bardzo minimalne, przeglądarki będzie raportować XPath testu jako jeden z następujących:

  • /html/ciała/div/stołu/tr/td (co w wielu przypadkach zwróci ci zarówno test, jak i wartość)
  • /html/body/div/table/tr [1]/td [1] (dokładniejszy test do przetestowania)
  • /html/body/div/table/tbody/tr/td (no tice the added tbody)

I tak dalej. Oczywiście, nie napotkasz tego problemu z bardziej unikalnym identyfikatorem (IE an id -> // * [@ id = "someElement"]), ale w wielu projektach, które przejęliśmy, gdzie testy jednostkowe były pierwotnie wykonywane tylko na jednej przeglądarce, widzieliśmy błędy podobne do przedstawionego, a okazało się, że „odkażania” przeglądarek zrobić tworzą jeden z dwóch problemów:

  • ścieżka została pobrana w przeglądarce, że „oczyszczone ", a następnie uruchomić w przeglądarce, która nie może i nie może znaleźć elementu.
  • Ścieżka została pobrana w przeglądarce, która nie została "oczyszczona", a następnie uruchomiona w przeglądarce, która oczyszcza.

Obie sprawy powodują niezgodność.

0

Miałem podobny problem i niestety jedynym rozwiązaniem, które wymyśliłem, było dodanie "snu". Brzydki, ale działa.

-1

Po kliknięciu czegoś wyskakującego okienka lub po utworzeniu, potrzebujesz po prostu funkcji call "clickForElementPresent" lub "waitForChange".

clickAndWait = click() + jakaś funkcja Wait .... dobra praktyka to funkcja oczekiwania przed kliknięciem, która pozwala na zaoszczędzenie połączeń asynchronicznych.

selenium.waitForElementPresent(“myFooElement”); 
selenium.click(“myFooElement”); 
1

Miałem ten problem w FF jak dobrze, było to rozwiązanie, które wymyśliłem:

def wait_for_element_by_id(eid): 
    "Wait for an element to be present" 
    element = WebDriverWait(driver, 10).until(
     EC.presence_of_element_located((By.ID, eid)) 
    ) 
    return []