2012-10-02 8 views
6

Ich arbeite an einem System, das ein Web-basiertes Frontend hat, das ich mit Selenium teste. Auf einer Seite wird der Inhalt beim Scrollen dynamisch geladen (vielleicht weißt du das von Facebooks Freundesliste), denn das ist eine der Voraussetzungen.Test dynamisch geladenen Inhalt mit Selenium Web Driver

Scrollen mit Selenium Webdriver (Ich benutze Chrome) sollte kein Problem sein über Javascript. Aber es gibt ein Problem mit dem dynamisch hinzugefügten Inhalt. Wie kann ich den Webdriver dazu bringen, diese Elemente zu finden?

Ich habe versucht, die folgenden blättern, bis nicht mehr Inhalt geladen wird:

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

Aber obwohl die Seite nach unten scrollt ersten Mal und einiger jetzt Inhalt korrekt geladen werden, werden sie nicht von den Fahrern zu finden 'findElementsBy (By) -Funktion.

Hat jemand jemals dieses Problem konfrontiert ?? Ich wäre sehr froh, wenn mir jemand helfen könnte, eine Lösung dafür zu finden!

Grüße, Benjamin

+0

ich haben, um nach unten scrollen, um die Elemente zu laden (über Ajax). Wie gesagt, ich benutze Chromedriver. –

Antwort

0

ich glaube, das Problem für den dynamischen Inhalt wartet geladen ist. Versuche 3 Sekunden zu warten, bevor findElementsBy? In C# wäre der Code Thread.Sleep (3000);

+0

gute Idee, es ausprobiert ... findElements liefert immer noch nur die Elemente, die von Anfang an auf –

+0

@Benjamin geladen wurden: Haben Sie eine längere Zeit wie 5 Sekunden versucht? Können Sie in SeleniumIDE überprüfen, dass der CSS-Selektor funktioniert, wenn das Element vorhanden ist?Ich würde einen Test in IDE machen, aber es ist schwierig, Scroll zu simulieren - Sie können keyPress | versuchen xpath =/html/Körper/| 34 (keycode 34 ist pagedown), dann waitForElementPresent ... – pellucid

+0

ich werde sowieso nicht mit SeleniumIDE arbeiten ... –

4

Ich würde WebDriverWait mit ExpectedConditons empfehlen.

//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() 

Werfen Sie einen Blick auf die von Selenium Offizielle Seite legte Leitlinien: http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

+1. nicht schlecht ansatz aber scheint mir besser flüssig zu wählen warte auf diesen fall. –

1

try insbesondere fließend Warte verwenden. Das Hauptmerkmal ist:

Eine Implementierung der Wait-Schnittstelle, die seine Zeitüberschreitung und Abfrageintervall im Fluge konfiguriert haben. Jede FluentWait-Instanz definiert die maximale Zeit, die auf eine Bedingung gewartet wird, sowie die Häufigkeit, mit der die Bedingung überprüft wird. Darüber hinaus kann der Benutzer das Warten konfigurieren, um bestimmte Arten von Ausnahmen während des Wartens zu ignorieren, z. B. NoSuchElementExceptions, wenn nach einem Element auf der Seite gesucht wird.

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

Das beschriebene Verfahren führt zurück Web-Element, das Sie mit arbeiten kann. So sei der Ansatz wie folgt vor: 1), um die Wähler der Elemente zu finden, müssen Sie nach dem Scrollen zum Beispiel zu erbringenden erwarten

String cssSelector = "blablabla" 

2) nach unten scrollen mit js 3)

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

Sie weitere Informationen über fließend Warte bekommen here

+1

Ich habe nur eine Frage - Wie macht man eine neue Funktion in Java, wenn man bedenkt, dass es kein Funktionstemplat gibt? Das obige Beispiel wird auch in selen javadocs erwähnt, aber Javac gibt mir ein Symbol, das man nicht finden kann: class Funktion - Ich würde gerne verstehen, welchen Teil ich beim Ergreifen vermisst habe, um es mir zu ermöglichen, den obigen Ansatz direkt zu verwenden. – Vatsala

+0

Könntest du mir ein kleines bisschen erklären: Was sprichst du mit Funktionstemplating in Java? –

+1

ich bin nicht sicher, was genau du sagst 'Funktion Templating', aber neue Funktion () {erstellt Instanz der anonymen Klasse, die an übergeben wird wait.until Funktion ist in Selnium API definiert. bis (com.google.common.base.Function isTrue) Wiederholt den Eingabewert dieser Instanz wiederholt auf die angegebene Funktion, bis einer der folgenden Fälle eintritt: Die Funktion gibt weder null noch false zurück. Die Funktion löst eine unignierte Ausnahme aus Timeout läuft ab, der aktuelle Thread wird unterbrochen Irgendwelche komplizierten Probleme - es scheint, dass Sie IDE-Einstellungen nicht richtig eingestellt haben (IMHO) –

Verwandte Themen