2016-03-25 5 views
2

Mein Code ist wie folgt, der Code besteht darin, die Elemente über Xpath zu setzen und einen list<String> mit den Texten jedes Elements zu generieren im Elementsatz. Es wird jedoch immer eine Ausnahme ausgelöst, wenn der Text jedes Elements zum neuen List<String> hinzugefügt wird.StableElementReferenceException: Element nicht im Cache gefunden - vielleicht hat sich die Seite seit der Suche geändert

protected List<String> getHeaders(String path){ 
    List<String> headers = new ArrayList<String>(); 
    int count = 0; 
    List<WebElement> elements = findAllByXpath(path); 
    LOG.info("The length is : " + String.valueOf(elements.size())); 

    for (WebElement c: elements) { 
     LOG.info("->> " + String.valueOf(count)); 
     count++; 
     headers.add(c.getText()); 
    } 
    return headers; 
} 

Das Ergebnis ist:

INFO com.xxx.test - The length is: 13 
INFO com.xxx.test ->> 0 
INFO com.xxx.test ->> 1 
INFO com.xxx.test ->> 2 
INFO com.xxx.test ->> 3 
INFO com.xxx.test ->> 4 
INFO com.xxx.test ->> 5 

com.xxx.test -> getHeaders FAILED org.openqa.selenium.StableElementReferenceException:Element not found in the cache - perhaps the page has changed since it was looked up 

kann jemand helfen in diesem Fall? Vielen Dank!

+0

Kann y o Sicherstellen, dass "Element nicht im Cache gefunden wurde - hat sich die Seite seit der Suche geändert?", dass Ihre Webseite zwischenzeitlich nicht aktualisiert wurde, während der Text des Elements der neuen Liste hinzugefügt wurde? –

+0

Hallo Mrunal, vielen Dank für den Kommentar, tatsächlich denke ich, die Seite wird während des Hinzufügens aktualisiert. Weißt du trotzdem, die Header (Liste ) in diesem Fall zu bekommen? Ich schätze, ich kann nicht alle Elemente von xpath wieder holen, wenn ich den Text eines Elements einzeln hinzufüge, also ist das der Unterschied zu anderen Problemen wie "Element nicht im Cache gefunden - vielleicht der ..." –

Antwort

2

Ich sehe 3 Möglichkeiten, um Ihr Problem zu behandeln.

Die erste Lösung und wahrscheinlich die zuverlässigste wäre es, die Elemente zu finden, sobald die Seite einen stabilen Zustand erreicht hat. Dies kann entweder durch Warten auf die Anwesenheit eines Elements oder durch Warten auf die Anzahl der Elemente geschehen.

Eine zweite Lösung würde wieder die Elemente aufzulisten, wenn StableElementReferenceException angehoben wird:

List<String> headers = new ArrayList<String>(); 
List<WebElement> elements = findAllByXpath(path); 
for(int i = 0; i < elements.size();) { 
    try { 
    headers.add(elements.get(i).getText()); 
    i++; 
    } catch (StableElementReferenceException ex) { 
    elements = findAllByXpath(path); 
    } 
} 
return headers; 

Und eine dritte Lösung wäre, den Text für alle Elemente mit einem Stück Javascript zu erhalten:

List<WebElement> elements = findAllByXpath(path); 

ArrayList headers = (ArrayList)((JavascriptExecutor)driver).executeScript(
    "var arr = [], elements = arguments[0];" + 
    "for(var i=0; i<elements.length; i++)" + 
    " arr.push(elements[i].textContent);" + 
    "return arr;", elements); 

return headers; 
2

Ok, hier ist der Trick.
1. Ermitteln Sie die Größe der Liste der gewünschten Elemente mit elements.size();
2. Schreiben Sie als nächstes einen dynamischen XPath, so dass nur die Indizes in XPATH geändert werden sollten, und das sollte Ihnen das einzelne Element geben.
3. Starten Sie eine For-Schleife mit i = 0 bis i < elements.size und in der for-Schleife mit dem dynamischen XPath mit Indizes einzelne Elemente nacheinander und anschließend deren Text abrufen und sie zur Liste hinzufügen kann warten, bis die Seite vollständig geladen wurde mit WebDriverWait oder andere Ansätze von Warten in selen

0

Versuchen getAttribute ("innertext") oder getAttribute ("value")

protected List<String> getHeaders(String path){ 
    List<String> headers = new ArrayList<String>(); 
    int count = 0; 
    List<WebElement> elements = findAllByXpath(path); 
    LOG.info("The length is : " + String.valueOf(elements.size())); 

    for (WebElement c: elements) { 
     LOG.info("->> " + String.valueOf(count)); 
     count++; 
     headers.add(c.getAttribute("innerText")); 
    } 
    return headers; 
} 
Verwandte Themen