2017-07-24 57 views
0

我在第二遍時收到以下錯誤,同時遍歷錶行有激活的刪除按鈕。
「結果堆棧跟蹤:OpenQA.Selenium.StaleElementReferenceException:陳舊元件參考:元件未連接到頁文件」c#Selenium Webdriver - 遍歷表格行並單擊每行中的按鈕

  IWebElement baseTable = Browser.Driver.FindElement(By.XPath("//*[@id='approvalsGrid']/table/tbody")); 
      ICollection<IWebElement> delButton = baseTable.FindElements(By.XPath("//*[@class = 'k-grid-remove lnkDelete']")); 
      foreach (var button in delButton) 
      { 
       button.Click(); 
       WaitForAjax(); 
       //2nd delete button in popup 
       Browser.Driver.FindElement(By.XPath("//a[text() = ' Delete']")).Click(); 
       WaitForAjax(); 
      } 

任何幫助將不勝感激。

+0

這是私人網頁還是我們能查看它? –

+0

這是dev服務器上的一個私人頁面。必須在網絡內才能訪問它。 – user1279586

+0

可能發生的情況是第二次迭代可能會找到上一個刪除按鈕,因爲它太快了。這是有道理的,你爲什麼會得到一個陳舊的元素例外。你可以嘗試在try catch中包裝你的點擊函數,或者在點擊刪除按鈕之前放入另一個sleep/wait命令(https://stackoverflow.com/questions/20798752/how-can-i-ask-the-selenium -wendriver-wait-for-seconds-seconds-send-key) –

回答

1

它看起來像按鈕集合過時,當你點擊刪除在一個,因此集合不再可用,一旦你刪除一個條目。

在這種情況下,您可能需要更改策略以在刪除新的刪除按鈕後查找新的刪除按鈕。像這樣的東西可能會奏效:

By delButtonsBy = By.XPath("//*[@class = 'k-grid-remove lnkDelete']"); 
bool delButtonExists = baseTable.FindElements(delButtonsBy).Count > 0; 

while (delButtonExists) 
{ 
    baseTable.FindElements(delButtonsBy)[0].Click(); 
    WaitForAjax(); 
    //2nd delete button in popup 
    Browser.Driver.FindElement(By.XPath("//a[text() = ' Delete']")).Click(); 
    WaitForAjax(); 
    delButtonExists = baseTable.FindElements(delButtonsBy).Count > 0; 
}  

這是更昂貴的,因爲你要查找的收集過過,但你必須這樣做,反正拿到的第一個元素,因爲頁面結構的變化和每次刪除一個時,收集過時。

你可以進一步改變這個來獲取第一個元素來檢查,而不是整個集合,這可能會提高性能略有下降,但除非你談論大量的按鈕,否則它應該是非常快的。

+0

這工作出色,謝謝你的幫助! – user1279586

相關問題