簡體   English   中英

無法找到頁面元素,因為“元素不再有效”

[英]Unable to find page elements because “Element is no longer valid”

Selenium在查找頁面上的元素時引發異常。 它抱怨“元素不再有效”。

例如,在帶有下拉列表的頁面上,當我選擇一個選項時,需要查找一些表。 對於前幾個選項,我找到了表,但是最終搜索元素會導致異常。

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(25));

IList<IWebElement> tableTRCollection = null;
IList<IWebElement> tableTDCollection;
bool exist = false;

while(!exist)
{
  try
  {
    tableTRCollection = driver.FindElements(By.XPath("//table[@id='t1']/tbody/tr"));
    exist = true;
  }
  catch(Exception ex)
  {
    Wait(1);
  }
}

for (int k = 0; k < tableTRCollection.Count; k++) 
{ 
  tableTDCollection = tableTRCollection[k].FindElements(By.TagName("td")); // -> Element is no longer valid
}

我為每個下拉選項循環遍歷整個代碼塊。 頭幾次都沒關系。 下次通過我看到以下內容:

  • 它退出while循環(找到了table和tableTRCollection
  • 進入for循環( tabletTRCollection至少包含一行)
  • tableTRCollection[k].FindElements(By.TagName("td"))引發“元素不再有效”異常。

我嘗試了Selenium的wait函數,但是結果是一樣的。 是什么導致tableTRCollection[k]元素不再有效? 頁面沒有變化。

在從下拉列表中進行選擇會導致DOM(JavaScript魔術,AJAX請求等)更改的頁面上,選擇后立即找到的元素可能會在您使用它們查找更多元素時消失。 簡單的時間表可能是:

  1. 從下拉菜單中選擇項目
  2. 查找元素X
  3. 做一些工作
  4. DOM變更
  5. 呼叫X.FindElement(...)
  6. 發生異常。

該頁面看起來好像沒有更改,但是Selenium對所有DOM更改都很敏感並且會抱怨。

通常,您可以直接使用driver.FindElements()而不是element.FindElements() 如果您使用的是By.CssSelector()By.Xpath() ,則可能要聰明一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM