在 C# 中使用 Selenium WebDriver 仅查找非隐藏元素

本文关键字:查找 隐藏 元素 WebDriver Selenium | 更新日期: 2023-09-27 18:31:16

我在网页上有一个记录集合,当单击记录时,会显示一个"删除"链接(实际上是"未隐藏",因为它实际上总是在那里)。

尝试访问此"删除"链接时,我正在使用其值。

当我使用 Driver.FindElement 时,它会返回第一个 Delete 链接,即使它是隐藏的,因此无法单击它(并且不应该,因为它不是正确的链接)。

所以,我基本上想做的是只找到非隐藏的链接。下面的代码有效,但是当它遍历每个删除链接时,恐怕效率低下。

有没有更好的方法?

public class DataPageModel : BasePageModel
{
    private static readonly By DeleteSelector = By.CssSelector("input[value='"Delete'"]");
    private IWebElement DeleteElement
    {
        get
        {
            var elements = Driver.FindElements(DeleteSelector);
            foreach (var element in elements.Where(e => e.Displayed))
            {
                return element;
            }
            Assert.Fail("Could not locate a visible Delete Element");
            return null;
        }
    }
}

在 C# 中使用 Selenium WebDriver 仅查找非隐藏元素

虽然我同意@Torbjorn你应该对花时间优化感到厌倦,但我确实认为这段代码有点低效。

基本上,减慢代码速度的是来回检查每个元素以查看其是否显示。为了加快代码速度,您需要一次性获得所需的元素。

两个选项(都涉及javascript):

jQuery

看看将jQuery选择器引入Selenium的不同方法(我在这里写过)。一旦你有了它,你就可以使用jQuery的:visible选择器。

或者,如果您确定页面已经加载了jQuery并且您不想执行所有额外的代码,则可以简单地使用ExecuteScript

IWebElement element = (IWebElement)driver.ExecuteScript("return $('input[value='"Delete'"]:visible').first().get(0)");

爪哇语

如果你想避免jQuery,你可以写一个javascript函数来做你现在在C#中做的事情:获取所有可能的元素并返回第一个可见的元素。

然后你会做类似的事情:

string script = //your javascript
IWebElement element = (IWebElement)driver.ExecuteScript(script);

根据您选择的选项,您可以以不同的程度交换可读性,但它们都应该更有效率。当然,这些都需要在浏览器中启用javascript。