首页 > 解决方案 > 使用 Selenium 查找网页的所有元素并忽略错误

问题描述

我在这里这里做了一些研究,但是当我使用这个随机 url 应用给定示例时:https ://www.ibm.com/support/pages/it-possible-use-upper-or-lowercase-function-xpath -expression我使用Selenium WebDriver for .NET得到以下错误:

OpenQA.Selenium.StaleElementReferenceException: '{script src="https://example.com/"} 的元素引用已过时;要么元素不再附加到 DOM,它不在当前框架上下文中,要么文档已被刷新'

我的目的是在这个通用函数中获取当前网页上的所有元素:

Function FindElementsByText(drv As IWebDriver, text As String, 
                            stringComparison As StringComparison) As ReadOnlyCollection(Of IWebElement)

    Return (From element As IWebElement In drv.FindElements(By.CssSelector("*"))
            Where element.Text.Equals(text, stringComparison)
           ).ToList().AsReadOnly()

End Function

在我指示驱动程序导航到我在开头指定的 url 之后,哪里drv.FindElements(By.CssSelector("*"))(或drv.FindElementsByXPath("//*"))是导致上述异常的原因。

对于受XPath 1.0的翻译功能限制的其他通用功能,上述功能将是一个很大的改进:

Function FindElementsByText(drv As RemoteWebDriver, text As String, 
                            ignoreCase As Boolean) As ReadOnlyCollection(Of IWebElement)

    Const translateUpperText As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÑÇ"
    Const translateLowerText As String = "abcdefghijklmnopqrstuvwxyzáéíóúàèìòùäëïöüâêîôûñç"

    If ignoreCase Then
        Return drv.FindElementsByXPath($"//*[contains(translate(text(), {translateUpperText}, {translateLowerText}),'{text.ToLower()}')]")

    Else
        Return drv.FindElementsByXPath("//*[contains(text(),'{text}')]")

    End If

End Function

我的问题是:我怎样才能摆脱以正确方式获取网页中所有元素的错误?

标签: c#.netvb.netseleniumselenium-webdriver

解决方案


推荐阅读