2012-10-02 18 views
6

Pracuję nad systemem, który ma interfejs sieciowy, który testuję z Selenium. Na jednej stronie zawartość jest ładowana dynamicznie podczas przewijania w dół (może wiesz, że z listy znajomych na Facebooku), ponieważ jest to jeden z wymagań.Testuj dynamicznie ładowaną zawartość za pomocą sterownika sieciowego Selenium

Przewijanie w dół z Selenium Webdriver (używam Chrome) nie powinno stanowić problemu przez JavaScript. Istnieje jednak problem z dynamicznie dodawaną treścią. Jak mogę sprawić, że Webdriver znajdzie te elementy?

Próbowałem następujących czynności, aby przewinąć w dół, dopóki nie więcej treści jest ładowany:

int oldSize = 0; 
int newSize = 0; 
do { 
    driver.executeScript("window.scrollTo(0,document.body.scrollHeight)"); 
    newSize = driver.findElementsBy(By.cssSelector("selector").size(); 
} while(newSize > oldSize); 

Ale chociaż strona przewija się w dół po raz pierwszy, a niektóre już zawartość jest załadowany prawidłowo, nie zostaną one uznane przez kierowców "findElementsBy (By) function.

Czy ktoś kiedykolwiek stanął w obliczu tego problemu? Byłbym bardzo zadowolony, gdyby ktoś pomógł mi znaleźć rozwiązanie tego problemu!

Pozdrawiam, Benjamin

+0

będę musiał przewinąć w celu załadowania elementów (za pośrednictwem ajax). Jak już powiedziałem, używam Chromedrivera. –

Odpowiedz

0

Myślę, że problemem jest oczekiwanie na dynamicznej zawartości, aby zakończyć ładowanie. Postaraj się czekać 3 sekundy tuż przed FindElementsBy? W języku C# kod będzie Thread.leep (3000);

+0

Dobry pomysł, wypróbowałem to ... FindElements nadal dostarcza tylko te elementy, które zostały załadowane od początku na –

+0

@Benjamin: Czy próbowałeś już więcej czasu jak 5 sekund? Czy mógłbyś sprawdzić w SeleniumIDE, czy selektor css działa, gdy element się wyświetla?Zrobiłbym test w IDE, ale symulowanie przewijania jest trudne - możesz spróbować keyPress | xpath =/html/body/| 34 (keycode 34 PageDown), następnie waitForElementPresent ... – pellucid

+0

i przyzwyczajenie praca z SeleniumIDE tak ... –

4

Polecam przy użyciu WebDriverWait z ExpectedConditons.

//scroll down with Javascript first 
WebDriverWait wait = new WebDriverWait(driver, 30); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector"))); 
//interact with your element 
element.click() 

Spójrz na wytycznych podanych przez Selen Dzienniku strony: http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

+1. nie złe podejście, ale wydaje mi się, że lepiej wybrać płynnie czekać na tę sprawę. –

1

spróbuj płynnie czekać w szczególności. Główną funkcją jest:

Implementacja interfejsu Wait, który może mieć ustawiony czas oczekiwania i interwał sondowania w locie. Każda instancja FluentWait określa maksymalny czas oczekiwania na warunek, a także częstotliwość sprawdzania warunku. Ponadto użytkownik może skonfigurować oczekiwanie na ignorowanie określonych typów wyjątków podczas oczekiwania, takich jak NoSuchElementExceptions podczas wyszukiwania elementu na stronie.

public WebElement fluentWait(final By locator){ 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(5, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 

     WebElement foo = wait.until(
new Function<WebDriver, WebElement>() { 
      public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
       } 
       } 
); 
          return foo;    }  ; 

Opisana metoda powoduje powrót elementów WWW można pracować z. Tak więc podejście będzie następujące: 1) musisz znaleźć selektory elementów, które oczekują na renderowanie po przewinięciu np.

String cssSelector = "blablabla" 

2) przewinąć w dół z js 3)

WebElement neededElement = fluentWait(cssSelector); 
neededElement.click(); 
//neededElement.getText().trim(); 

można uzyskać więcej informacji o płynnym czekać here

+1

Mam tylko jedno pytanie - Jak zrobić nową funkcję w Javie, biorąc pod uwagę, że nie ma szablonów funkcji? Powyższy przykład jest wymieniona w Javadocs selenu, a także, ale javac da mi nie może znaleźć symbol: klasy funkcji - Chciałbym, aby zrozumieć, co część I zostały pominięte w celu umożliwienia chwytając mnie w użyciu powyżej podejścia prosto z bat. – Vatsala

+0

czy mógłbyś wyjaśnić mi trochę lil: co wspomniałeś mówiąc o szablonach funkcji w Javie? –

+1

nie jestem pewien, co dokładnie masz na myśli mówiąc „funkcja szablonów”, ale nowa funkcja () {tworzy instancję klasy anonimowej są przekazywane do wait.until Funkcja jest zdefiniowana w selnium API. aż (com.google.common.base.Function isTrue) Wielokrotnie odnosi wartość wejściową tym przypadku do danej funkcji, dopóki jedna z poniższych sytuacji: funkcja zwraca NULL ani, ani fałszywe, funkcja zgłasza unignored wyjątku, przeterminowanie, obecny wątek zostaje przerwany Wszelkie problemy complie - wydaje się, masz ustawienia IDE nie jest ustawiony prawidłowo (IMHO) –