2012-05-03 20 views
10

Po zdarzenia click muszę czekać na przydzielać elementy do zmiany przed przejściem dalej (kliknij zdarzenie powoduje pewne elementy przenieść nieostry i niektóre inne uzyskać ostrość za pomocą JS)Najlepsza praktyka oczekiwania na zmianę za pomocą Selenium Webdriver?

Po spędzania czasu szukając wiarygodnym alternatywa dla "waitForAttribute" (polecenie selenu 1) w webdriverze ... Mógłbym uruchomić poniższy kod. Ale nie jestem pewien, czy to jest najlepsza implementacja ...

Jakieś inne lepsze rozwiązanie?

wait = new WebDriverWait(wedriver1, TimeSpan.FromSeconds(5)); 
..... 
button.Click(); 
wait.Until(webdriver1 => webdriver2.webelement.GetAttribute("style").Contains("display: block")); 

Czy ktoś może udostępnić link do tego, jak mogę obsługiwać zmiany zdarzeń AJAX za pomocą webdriver.

+0

http://assertselenium.com/2013/01/29/webdriver-wait-commands/ ma ładny listę możliwych metod czekać i jak odnoszą się one – Pat

+0

@Pat: the Wydaje się, że strona assertselenium.com zniknęła. –

+0

Zarchiwizowane wersje tej strony: http://web.archive.org/web/*/http://assertselenium.com/2013/01/29/webdriver-wait-commands/ – Pat

Odpowiedz

5

Jest to powtarzający się problem selenu. Nie jestem pewien, czy istnieje "najlepsza" implementacja. Uważam, że w dużej mierze zależy to od sytuacji.

Jeśli chodzi o zmiany kierowane AJAX, generalnie użyłbym waitForElementPresent lub waitForElementNotPresent w zależności od zmian, które wywoła AJAX na stronie.

+2

To zadziała, ale tylko w sytuacjach gdzie element pojawia się/znika. Istnieje wiele sytuacji, w których element pozostaje widoczny, ale zmienia atrybut, o czym, jak mi się zdaje, PO, którego te metody nie obejmują. –

0

Możesz użyć Thread.sleep, tak jak ludzie wdrożyli here.. Możesz użyć ich implementacji, aby odnieść się do twojego problemu.

public void waitFor(Webdriver driver,,WebElement welElem, String attributeValue){ 
    int timeout=0; 
    while(true){ 
     if(driver.webElem.getAttribute(attribute)!=null){ 
     break; 
     } 
     if(timeout>=10){ 
     break; 
     } 
     Thread.sleep(100); 
     timeout++; 
    } 

} 

Myślę, że można wprowadzić coś takiego. Nie sprawdziłem, ale masz pomysł.

+2

Wierzę, że cała ta pętla jest tym, co robi "wait.Until", który napisałem powyżej. Więc nie widzę sensu pisania tego wyraźnie podczas pętli. Przypuszczam, że moja implementacja działa znacznie czystiej – Adi

+1

'while (timeout <10)' i usuń instrukcję "if". Po prostu notka do twojego kodu. –

4

Można używać niejawny WebDriver wait:

driver.manage() limity czasu() implicitlyWait (10, TimeUnit.SECONDS);..

Niejawne oczekiwanie polega na poinformowaniu WebDriver, aby odpytał DOM przez określony czas, próbując znaleźć element lub elementy, jeśli nie są one natychmiast dostępne.

Więcej tutaj: http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits

+0

Przepraszam, nie sądzę, że zrozumiałeś moje pytanie. Moje elementy zmieniają atrybut w zdarzeniu kliknięcia (sterowanym przez JS). Nie widzę tutaj, w jaki sposób domyślne oczekiwanie jest użyteczne. Z mojego zrozumienia domyślne oczekiwanie jest bardziej odpowiednie w przypadku elementów widocznych po wydarzeniu. – Adi

2

czuję, że za pomocą WebDriverWait jest całkiem użyteczne. Jedną zmianą, którą możesz wprowadzić w swoim kodzie, jest użycie -

webelement.isDisplayed(); 

zamiast uzyskania atrybutu stylu.

4

Proponuję użyć org.openqa.selenium.support.ui.ExpectedConditions.attributeToBe(WebElement element, String attribute, String value).

np.

WebDriverWait wait = new WebDriverWait(driver, 5); // time out after 5 seconds 
someElement.click(); 
wait.until(ExpectedConditions.attributeToBe(someElement, "sort-attribute", "ascending")); 

(docs)

Powiązane problemy