【问题标题】:Selenium: stale element reference: element is not attached to the page documentSelenium:过时的元素引用:元素未附加到页面文档
【发布时间】:2021-12-15 15:12:17
【问题描述】:

我正在使用 C# 和 Selenium Chromedriver 做一个抓取 Google 地图的测试项目。

它运行良好,直到它到达这里的第二个循环:

var companyurl = company.GetAttribute("href");

返回:

OpenQA.Selenium.StaleElementReferenceException:过时的元素引用:元素未附加到页面文档

我认为这是由于我的列表这样做,出于某种原因:

这是我所有的代码:

var chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriverService.HideCommandPromptWindow = true;
ChromeOptions options = new ChromeOptions();

options.AddExcludedArgument("excludeSwitches");
options.AddExcludedArgument("useAutomationExtension");
options.AddArguments("ignore-certificate-errors");
options.AddArguments("start-maximized");
options.AddArguments("enable-automation");
options.AddArguments("--log-level=OFF");
//options.AddArguments("headless");
options.AddArguments("--disable-blink-features=AutomationControlled");

var driver = new ChromeDriver(chromeDriverService, options);
Actions builder = new Actions(driver);

driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(15);

driver.Navigate().GoToUrl("https://www.google.co.uk/maps/search/lincoln+plumbers/");

try
{
    driver.FindElement(By.CssSelector("#yDmH0d > c-wiz > div > div > div > div.NIoIEf > div.G4njw > div.AIC7ge > form > div > div > button > span")).Click();
}
catch
{

}

IList<IWebElement> companies = driver.FindElements(By.XPath("//*[@id=\"pane\"]/div/div[1]/div/div/div[4]/div[1]/div/div/a"));

foreach (var company in companies)
{
    try
    {
        var companyurl = company.GetAttribute("href");
        driver.Navigate().GoToUrl(companyurl);
        var companyName = driver.FindElement(By.TagName("h1")).Text;
        Console.WriteLine(companyName);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}
Console.ReadLine();

任何帮助将不胜感激!

【问题讨论】:

  • print companyurl 在那个 try 块中,我相信这应该打印第一个并且对于第二次迭代它会得到那个异常?
  • 改成那个和完全相同的结果@cruisepandey
  • 有输出吗?我期待打印第一个公司 URL。
  • 是的,第一次打印。然后错误来了。

标签: c# selenium selenium-chromedriver


【解决方案1】:

只要你这样称呼:

driver.Navigate().GoToUrl(companyurl);

...您使您收集的所有元素引用“陈旧”,包括companies。我猜您想重新设计您的算法,以便在通过导航到其他页面使其元素引用过时之前从第一页提取并保存您需要的所有信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2015-02-07
    • 2023-03-24
    • 1970-01-01
    • 2022-08-17
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多