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
相关产品推荐
相关产品推荐

