5

JavaでSelenium WebDriverを使用しています。

Webページからすべてのリンクを取得し、各リンクを1つずつクリックしようとしています。以下のエラーが表示されます:

エラー org.openqa.selenium.StaleElementReferenceException: 要素がキャッシュに見つかりません - おそらくページが検索されてから変更されました コマンドの実行時間またはタイムアウト: 30.01 秒 このエラーに関するドキュメントについては、http ://seleniumhq.org/ を参照してください。 exceptions/stale_element_reference.html ビルド情報: バージョン: '2.25.0'、リビジョン: '17482'、時間: '2012-07-18 21:09:54'

ここに私のコードがあります:

public void getLinks()throws Exception{
    try {
        List<WebElement> links = driver.findElements(By.tagName("a"));
        int linkcount = links.size(); 
         System.out.println(links.size()); 
          for (WebElement myElement : links){
         String link = myElement.getText(); 
         System.out.println(link);
         System.out.println(myElement);   
        if (link !=""){
             myElement.click();
             Thread.sleep(2000);
             System.out.println("third");
            }
            //Thread.sleep(5000);
          } 
        }catch (Exception e){
            System.out.println("error "+e);
        }
    }

実際、出力に表示されています

[[FirefoxDriver: XP 上の firefox (ce0da229-f77b-4fb8-b017-df517845fa78)] -> タグ名: a]

リンクとして、これらのフォーム結果を排除したい。

4

6 に答える 6

9

次のシナリオを持つのは良い考えではありません:

for (WebElement element : webDriver.findElements(locator.getBy())){
  element.click();
}

なんで?element.click();が他の見つかった要素に影響を与えないという保証はないため、DOMが変更される可能性があります。したがって、StaleElementReferenceException

次のシナリオを使用することをお勧めします。

int numberOfElementsFound = getNumberOfElementsFound(locator);
for (int pos = 0; pos < numberOfElementsFound; pos++) {
  getElementWithIndex(locator, pos).click();
}

WebElement前のクリックでさえいくつかの影響があったとしても、常に更新されるので、これはより良いです。

編集:例を追加

  public int getNumberOfElementsFound(By by) {
    return webDriver.findElements(by).size();
  }

  public WebElement getElementWithIndex(By by, int pos) {
    return webDriver.findElements(by).get(pos);
  }

十分であることを願っています。

于 2012-11-19T11:59:27.063 に答える
1

WebDriver.get()リンクをテストする代わりに使用しても問題ない場合は、別の方法として、見つかったそれぞれの値を別のリストWebElement.click()に保存します。このようにして、最初の で移動した後に後続の を再利用しようとしないため、 を回避できます。hrefWebElementStaleElementReferenceExceptionWebElementWebElement.click()

基本的な例:

List<String> hrefs = new ArrayList<String>();
List<WebElement> anchors = driver.findElements(By.tagName("a"));
for ( WebElement anchor : anchors ) {
    hrefs.add(anchor.getAttribute("href"));
}
for ( String href : hrefs ) {
    driver.get(href);           
}
于 2014-04-03T15:42:11.860 に答える