You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Selenium返回原页面后获取href属性报错问题

问题分析与解决

问题原因

你遇到的是Selenium典型的过时元素引用异常(StaleElementReferenceException)。当调用driver.Navigate().Back()回到原页面后,页面DOM已重新加载,之前获取的ar数组里的WebElement对象会和当前DOM中的元素失去关联——哪怕视觉上是同一个链接,内存里的元素引用已失效,所以第二次调用GetAttribute会报错。

解决方案

最稳妥的方式是提前提取所有链接的href值,保存为字符串数组,之后遍历这个数组进行页面跳转,完全避开WebElement失效的问题。

修改后的代码示例:

IWebDriver driver = new ChromeDriver();
driver.Url = @"https://forrest-med.ru/#services";

// 提前提取所有href属性值,存入字符串列表
var hrefList = driver.FindElements(By.XPath("//a[contains(@href,'service/')]"))
                     .Select(el => el.GetAttribute("href"))
                     .ToList();

StringBuilder sb = new StringBuilder();

foreach (var href in hrefList)
{
    if (string.IsNullOrEmpty(href)) continue;

    driver.Navigate().GoToUrl(href);
    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

    try
    {
        var el = driver.FindElement(By.ClassName("service-title"));
        sb.Append(el.Text + "\n");
    }
    catch
    {
        // 处理找不到元素的情况
    }

    driver.Navigate().Back();
    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
}

parsingText.Text = sb.ToString();

补充说明

如果必须在回到页面后操作原元素(比如需要点击而非直接跳转href),那每次回到列表页后都需要重新定位所有元素,不能复用之前保存的WebElement对象,但这种方式效率较低,不如提前提取href高效。

内容的提问来源于stack exchange,提问作者kokon231

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:33:34