2017-07-26 9 views
1

これは私の初めてのセレンでの作業であり、ウェブ技術の経験もありません。(StaleElementException:Selenium)これをどうすれば処理できますか?

私はDOM上の特定のオブジェクトにアクセスしようとしている間、私はStaleElementExceptionに直面していました。

メソッドは、すべてのタスクハンドルを以下に示します。

private void extract(WebDriver driver) { 
    try { 

     List<WebElement> rows = driver.findElements(By.xpath("//*[@id='gvSearchResults']/tbody/tr")); 

     for (WebElement row : rows) { 
      WebElement columns = row.findElement(By.xpath("./td[1]/a")); 

      if (assertAndVerifyElement(By.xpath("//*[@id='gvSearchResults']/tbody/tr/td[1]/a"))) { 
       columns.click(); 
      } 

      List<WebElement> elements = driver 
        .findElements(By.xpath("//*[@id='ctl00_MainContent_pnlDetailsInd']/table/tbody/tr")); 

      for (WebElement element : elements) { 
       WebElement values = element.findElement(By.xpath("./td[1]")); 
       System.out.print(values.getText() + " "); 
       WebElement values2 = element.findElement(By.xpath("./td[2]")); 
       System.out.println(values2.getText()); 
      } 
      if(assertAndVerifyElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']"))) 
       driver.findElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']")).click(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

アサーションロジックはここに行く:

public boolean assertAndVerifyElement(By element) throws InterruptedException { 
    boolean isPresent = false; 

    for (int i = 0; i < 5; i++) { 
     try { 
      if (driver.findElement(element) != null) { 
       isPresent = true; 
       break; 
      } 
     } catch (Exception e) { 
      // System.out.println(e.getLocalizedMessage()); 
      Thread.sleep(1000); 
     } 
    } 
    Assert.assertTrue("\"" + element + "\" is not present.", isPresent); 
    return isPresent; 
} 

私が期待した条件になるまで待機を使用するために私を求めて、いくつかの解決策を試してみましたが、それらのどれも働いていないが。

また、私が上記のサンプルで使用しているかもしれない悪い設計方法を指摘していただければ幸いです。

+0

を試してみてください

あなたはwebelementを検索することができますか? – DebanjanB

+0

'StaleElementException'要素が出現し、' WebDriverWait'と 'ExpectedConditions'を使ってその要素を待つ。 – sen4ik

答えて

0

私は、あなたの陳腐化を克服するアイデアを与えることができます。

一般に、要素の属性などがweb要素を開始した後に変更された場合、古くなった例外が発生します。たとえば、ユーザーが同じページ上の同じ要素をクリックしようとしたが、ページを更新した後で、staleelement例外が発生する場合があります。

これを解決するには、ページが変更または更新された場合に新しいWeb要素を作成することができます。以下のコードはあなたにいくつかのアイデアを与えることができます。

例:

webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']")); 
element.click(); 
//page is refreshed 
element.click();//This will obviously throw stale exception 

はこれを克服するために、我々はいくつかの文字列でXPathを格納し、私たちが行くように、それは新鮮なwebelementを作成し使用することができます。

String xpath = "//*[@id='StackOverflow']"; 
driver.findElement(by.xpath(xpath)).click(); 
//page has been refreshed. Now create a new element and work on it 
driver.findElement(by.xpath(xpath)).click(); //This works 

もう一つの例:

for(int i = 0; i<5; i++) 
{ 
    String value = driver.findElement(by.xpath("//.....["+i+"]")).getText); 
    System.out.println(value); 
} 

が、これはあなたのお役に立てば幸いです。ありがとう

0

StaleElementExceptionは、問題のWeb要素がdomで変更され、そのWeb要素の初期参照が失われたときに発生します。再び

がラインあなたが `StaleElementException`を見ている時に、この

try: 
element = self.find_element_by_class('') 
element.click() 
except StaleElementReferenceException: 
element = self.find_element_by_class('') 
element.click() 
関連する問題