【问题标题】:Selenium issue when trying to scrape a JSP page: 'element is not attached'尝试抓取 JSP 页面时出现 Selenium 问题:“未附加元素”
【发布时间】:2021-04-13 14:33:01
【问题描述】:

我正在尝试从 JSP 页面获取一些数据,该页面有一个带有分页的表格,我正在尝试从每个表格页面获取值。

正如我所见,每个元素都是使用由服务器设置的类和名称以及时间戳和其他内容动态创建的,因此我必须在 DOM 上使用尽可能多的通用数据来获取它们。

点击第一个页面后,页面会生成第二个分页器,这将是真正的分页器..

问题是,在我从分页器处理 3 页后,我收到以下错误:

'stale element reference:元素未附加到页面文档 (会话信息:chrome=89.0.4389.114)'

但实际上 DOM 元素存在于页面上,但它是用其他名称和类重新创建的,但无论如何都应该得到它......

这是我的代码:

    var pages = searchResult.FindElements(By.ClassName("custom-pagination"));

    foreach (var page in pages[0].FindElements(By.TagName("input")))
    {
        
        var PageValue = page.GetAttribute("value");
        if (PageValue == "<<") continue;
        if (PageValue == ">") break;
        if (PageValue != "1")
        {
            page.Click();
            WaitUntilElementNotVisible(SelectorByAttributeValue("iawaitpanel", "true"), 30000, driver);
        }

        foreach (var azienda in driver.FindElements(By.ClassName("item_list")))
        {
            DataRow row = table.NewRow();
            row["REGIONE"] = NomiRegioni[IndexRegione];
            row["NOME AZIENDA"] = azienda.FindElement(By.ClassName("txtGreen")).Text;
            var indirizzo = azienda.FindElement(By.ClassName("sede")).Text.Replace("Sede Legale", "").Trim();
            row["INDIRIZZO"] = indirizzo;
            row["CAP"] = indirizzo;
            row["CITTA"] = indirizzo;
            row["MAPS"] = azienda.FindElement(SelectorByAttributeValue("title", "Vai a Google Maps")).GetAttribute("href");
            table.Rows.Add(row);
        }


    }

这里是一个小的fiddle 页面的样子..

我已经阅读了这个question 并且我还尝试在CATCH 中再次设置我获取元素但没有效果的代码...

【问题讨论】:

    标签: c# selenium web-scraping


    【解决方案1】:

    不要在你的 foreach 循环中每次调用 FindElements,而是调用它并将你的输入元素存储在一个变量中。然后遍历这些输入,似乎每次都在同一页面上调用 FindElements?

    【讨论】:

    • 我试图将它们存储在一个变量中,但是在每个元素上单击页面会再次生成按钮,它们是相同但不同的,所以我将无法找到该输入..
    • 手动单步浏览页面时元素标识符会发生什么变化?您在上面提到的类和名称发生了变化,我会在您循环并调用点击时注销输入发生的事情,这可能是在一定数量的点击后该页面发生的事情。可能正在重新加载数据或发生其他不可预见的事件。
    • 我通过在一个 do 中通过 xpath 获取元素来解决它,同时通过更改所有的一个静态值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2021-08-18
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多