Selenium for循环导致"元素未附加到页面文档"

时间:2017-11-20 21:35:21

标签: c# selenium xpath

我从表格可以显示的元素中获取页数。然后我创建一个循环,单击下一个按钮,直到当前页面元素读取最后一页。

每次单击下一个按钮selenium的问题都无法实现我指的是已加载的新元素。我已经尝试了一切。

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 个答案:

答案 0 :(得分:0)

元素未附加到页面似乎是陈旧元素异常。我建议在findElement调用上使用通用的包装器方法,并添加特定的catch块来处理这种异常情况。请参阅下面的代码段。

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;

    }