gpt4 book ai didi

c# - 如何判断一个元素是否被CSS选择器匹配?

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:57 25 4
gpt4 key购买 nike

给定一个 Selenium WebDriver 元素实例,我想检查该元素是否与给定的 CSS 选择器匹配。功能类似于 jQuery 的 is() 函数。

我正在使用 .NET 绑定(bind)。

示例(假设该方法将被称为Is)

var links = _driver.FindElements(By.CssSelector("a"));
foreach (var link in links)
{
if (link.Is(".myclass[myattr='myvalue']"))
// ... do something
else
// ... do some other thing
}

是否有任何内置的东西可以实现这一点,或者如果没有,有人可以建议一个可能的实现吗?我是 Selenium 的新手,还不知道。

更新

我发现没有内置的方法可以做到这一点。我的最终目标是实现像 jQuery 的 parents(selector)closest(selector) 这样的方法,因此对于这种更特殊的情况,我们将不胜感激。

最佳答案

没有任何 Selenium 方法可以与 jQuery 的 $(...).is(...) 等效。但是,DOM 提供 matches .它不是 $(...).is(...) 的完全替代品,因为它不支持 jQuery 对 CSS 选择器语法的扩展,但是,再一次,Selenium 不支持这些扩展要么。

您可以通过将要测试的元素传递给您传递给 ExecuteScript 的 JavaScript 脚本来使用它。该元素将作为脚本中 arguments 的第一个元素出现。您只需对其调用 matches 并返回值。我不使用 C#,但根据文档,我相信它在 C# 中看起来像这样:

bool isIt = (bool)(driver as IJavaScriptExecutor).ExecuteScript(
"return arguments[0].matches(\".myclass[myattr='myvalue']\")", element);

isIt 包含测试的结果。 element 是您要测试的元素,driver 是您已经创建的驱动程序。参见 caniuse为了兼容性。在我的应用程序中,我使用 polyfill 在我关心的所有平台上提供匹配


话虽如此,我不建议遍历元素并逐一测试。问题是每个 ExecuteScriptGetAttribute 调用都是脚本和浏览器之间的往返。当您运行完整的测试套件时,这会加起来,尤其是当浏览器在远离您的脚本的服务器场上运行时。然后它真的做了广告。我会构建您的测试,以便它查询所有 a 元素的列表和所有 a.myclass[myattr='myvalue'] 元素的列表。这归结为两次往返。从这两个列表中,您可以获得进行 if() 测试所需的所有信息。

关于c# - 如何判断一个元素是否被CSS选择器匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com