如何在c#中使用带有“not”的css选择器?

Posted

技术标签:

【中文标题】如何在c#中使用带有“not”的css选择器?【英文标题】:How to use css selector with "not" in c#? 【发布时间】:2015-12-25 07:37:38 【问题描述】:

我想通过css选择器查​​找元素,但是我想跳过其中一些,我该怎么做?

driver.FindElements(By.CssSelector("a[href]")) 

但我不需要使用其中包含注销和客户端/合同的 href

【问题讨论】:

你真的不需要 LINQ。只需使用 :not() 伪。阅读它。 但是如果我想跳过不止一件事会怎样?像“a[href]:not(apple orbanana)” 如果是not(apple or banana),那么它既是not(apple)又是not(banana),因此是:not(apple):not(banana) 【参考方案1】:

您可能不需要 LINQ。您可以使用:not() 伪类,一个用于您要排除的每个值(注意每个否定中的*=;我假设这里的子字符串匹配):

driver.FindElements(By.CssSelector("a[href]:not([href*='logoff']):not([href*='client'])"))

如果您有要排除的值的动态列表,则例外:您可以使用string.Join() 或循环以编程方式构建选择器,然后将其传递给By.CssSelector(),或者您可以按照Richard Schneider 的回答使用 LINQ 保持整洁。

【讨论】:

【参考方案2】:

使用 CSS 获取元素后,使用 LINQ 过滤 href

Using System.Linq;

string[] blackList = new string[]  "logoff, "client",... ;
string[] urls = driver
  .FindElements(By.CssSelector("a[href]"))
  .Select(e => e.GetAttribute("href"))
  .Where(url => !blackList.Any(b => url.Contains(b)))
  .ToArray();

检查 URL 区分大小写,因为那是 W3C states。您可能需要更改此设置。

【讨论】:

以上是关于如何在c#中使用带有“not”的css选择器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CSS 中正确使用 not 选择器 [重复]

Scrapy:: 如何在 CSS 选择器中使用“not”来跳过元素

带有 :not 的 CSS 选择器未按预期运行

带有所选元素的子级的 JQuery 选择器 not()

在 IE 8 中加速 ":not" jQuery CSS 选择器?

# react css模块中的id选择器