2017-11-20 15 views
0

テーブルから表示できる要素からページ数を取得します。次に、現在のページ要素が最後のページを読み取るまで、次のボタンをクリックするループを作成します。Selenium forループが原因で "要素がページドキュメントに添付されていません"

問題は、次のボタンをクリックするたびにセレンが読み込まれた新しい要素を参照していることを認識できません。私はすべてを試しました。

string NumberOfPages = driver.FindElement(By.XPath("//*[@id=\"maxCA\"]")).Text; 
for (int i=0; i< Int32.Parse(NumberOfPages); i++) 
{ 
    driver.FindElement(By.XPath("//*[@id=\"BID_WINDOW_CONTAINER\"]/div[4]/div[3]/span[3]")).Click(); 
    WebDriverWait wait2 = new WebDriverWait(driver, System.TimeSpan.FromSeconds(3)); 
    var ready2 = wait.Until(ExpectedConditions.ElementExists(By.CssSelector(".AUCTION_ITEM"))); 
    Head_W = driver.FindElement(By.CssSelector(".Head_C")); 
    ScrapeProperties(Head_W); 
} 

私は何が起こっているのか知っています。私は、以前の要素ではなく作成された新しい要素を参照していることをSeleniumに認識させる方法についてはわかりません。私のループでは、ルート文書から始めているので、代わりに新しい要素を取り込むことができます。エラーは、私が何かをするとScrapeProperties(Head_W);で起こります。

IList<IWebElement> AuctionItems = Head_W.FindElements(By.CssSelector(".AUCTION_ITEM")).ToList(); 
//In a loop I do this; 
property.AuctionStatus = AuctionItemElement.FindElement(By.CssSelector("div.AUCTION_STATS > div.ASTAT_MSGB.Astat_DATA")).Text; 
+1

[PageFactoryでStaleElementReference例外](https://stackoverflow.com/questions/44838538/staleelementreference-exception-in-pagefactory) – DebanjanB

+0

の可能性のある重複したページの変更は、次のボタンをクリックした後、発見しようページ上の何かが以前とは異なるものになり、待っている間に何らかの古い要素の例外を確実に捕捉しながら、実際に要素が実際のものと異なっているかどうかを確認するカスタム待機を作成します。 – mrfreester

答えて

0

要素がページに添付されていないが古い要素例外のように思えます。 findElementの呼び出しに対して汎用のラッパーメソッドを使用し、そのような例外的な状況を処理する特定のキャッチブロックを追加することをお勧めします。以下のコードスニペットを参照してください。

public WebElement findFreshElement(By locator){ 
     WebElement webElement = null; 
     int attempts =0; 
     while(attempts < 10){ 
     try { 
      wait.hardWait(1); 
      webElement = driver.findElement(locator); 
      webElement.isDisplayed(); 
      break; 
     } catch (StaleElementReferenceException e) { 
      logMessage("⚠ Stale Element Reference Exception ... Refinding element after a second.. "); 
      attempts+=1; 
     }catch(NoSuchElementException e){ 
      logMessage("[ELEMENT NOT FOUND] : You might have to update the locator:-" + locator); 
     attempts+=1;  
     } 
     } 
     return webElement; 

    } 
関連する問題