在 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;
}
}
}
虽然我同意@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。