2016-03-25 15 views
2

私のコードは次のようになります。コードはxpath経由で要素を取得し、各要素のテキストをlist<String>要素集合内にある。しかし、各要素のテキストを新しいList<String>に追加するプロセスでは常に例外がスローされます。StableElementReferenceException:キャッシュ内に要素が見つかりません - ページが参照されてから変更されている可能性があります

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

結果は次のとおりです。

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 

誰かが、この場合に役立つことはできますか?ありがとう!

+0

缶のyを試してみてくださいあなたのWebページが新しいリストに要素のテキストを追加している間にWebページが更新されていないことを確認してください。 –

+0

こんにちはMrunal、コメントありがとう、実際に私はページが追加中に更新されていると思います。この場合、ヘッダー(List )を取得するためにとにかく知っていますか?私は要素のテキストを1つずつ追加するときにxpathですべての要素を取り戻すことはできないと思うので、これは「要素がキャッシュにない - おそらく...」のような他の問題と比較して違いです –

答えて

2

問題を処理する3つの方法があります。

最初の解決策はおそらく、ページが安定した状態になったら要素を見つけることです。それは、要素の存在を待つか、要素の数を待つことによって行うことができます。

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; 

そして第三の溶液では、JavaScriptの一片を持つすべての要素のテキストを取得するには、次のようになります:

StableElementReferenceExceptionが上昇したときに、第2の溶液を再び要素をリストするだろう

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

ここでのトリックです。
1. elements.size()を使用したい要素のリストのサイズを取得します。
2.次に、動的XPathを書き留めて、XPATH内のインデックスのみが変更され、個々の要素が得られるようにします。
3. i = 0〜i < elements.sizeのForループを開始し、forループで、インデックス付きの動的XPathを使用して個々の要素を1つずつ取り出し、次にそれらのテキストを検索してリストに追加します。
その他のアプローチ明示的にWebDriverWaitやその他のセレンを使用してページが読み込まれるまで待つことができます

0

のgetAttribute( "のinnerText")またはのgetAttribute( "値")

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