【问题标题】:How to Create CSS Selector Element including index如何创建包含索引的 CSS 选择器元素
【发布时间】:2014-09-22 12:12:00
【问题描述】:

我正在构建一个使用 CSS 选择器或 XPath 字符串的基于 selenium 的测试应用程序,并尝试测试悬停时出现的菜单项。通过右键单击在 Chrome 和 FireFox 中使用“检查元素”,可以验证正确的 html 是否被突出显示,但是当我复制 CSS 选择器或 XPath 时,它有时会选择多个元素。例如:

"#myId > li:nth-child(2) > a"

是 Chrome 给我的,但它代表 DOM 中的 13 个元素(每个元素在不同的子菜单中)。我需要的选择器是选择器结果的第九个元素:

$("#myId > li:nth-child(2) > a")[9]

我的主要问题是这是否可以表示为 CSS 选择器?我搜索了一个示例,但没有找到这个特定问题。

$("#myId > li:nth-child(2) > a(9)")

不起作用 - 返回空数组。

【问题讨论】:

  • 如果你发布一些 html 会容易很多
  • @Huangism - 是的,但是页面是内部页面,并且 DOM 非常庞大且不具体。我不确定这个 id 是否是唯一的,或者说实话。我相信 BoltClock 的答案是我需要的,现在正在检查。

标签: javascript jquery selenium jquery-selectors css-selectors


【解决方案1】:

CSS 没有为匹配某些复杂选择器的第 n 个元素提供选择器。 jQuery 用:eq() selector 弥补了这一点:

$("#myId > li:nth-child(2) > a:eq(8)")

请注意,:eq() 是 0-indexed,不像 :nth-child() 是 1-indexed,因此这将返回与选择器 #myId > li:nth-child(2) > a 匹配的第九个元素。

如果您选择使用它,等效的 XPath 是:

(id('myId')/li[2]/a)[9]

但是,您的情况是独一无二的,因为如果我们假设 #myId 是唯一的,那么您可以使用 CSS 伪类 :nth-of-type() 找到第二个 @ 的第九个 a 子级987654331@子元素#myId:

$("#myId > li:nth-child(2) > a:nth-of-type(9)")

请注意,:nth-of-type():eq() 并不相同。 :nth-of-type() 的行为与 :nth-child() 非常相似,因为它考虑了同一父级的子级,除了它查看元素类型或标签名称。在这种情况下,我们关注的元素类型是a

在现有选择器中使用> 组合子意味着lia 元素之间存在父子关系,这与:nth-of-type() 选择器兼容。这就是为什么我相信它可以用于您的特定情况。

【讨论】:

  • #myId > li:nth-child(2) > a:nth-child(9) 不行吗?或者你不能把第n个孩子加倍吗?
  • @Huangism:不,那不一样——a:nth-child(9)表示第九个孩子,也就是说每个li必须至少有9个孩子,第9个孩子是a
  • 哦,我现在明白了,我错过了阅读问题,并没有意识到 :eq 适用于结果而不是单独的锚
  • @Huangism:我刚才又看了一遍选择器,还有>组合符被使用了。假设 ID 是唯一的,#myId > li:nth-child(2) > a:nth-child(9) 不可能匹配多达 13 个 DOM 元素。但我认为使用 CSS 可以解决这个问题。
  • OP 提到 "#myId > li:nth-child(2) > a" 匹配了 13 个元素。我现在真的不知道该怎么想,因为我认为这些问题不够精确,我无法理解。如果我们有 html 并且 OP 准确地提到了需要什么,这会更容易
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2020-04-20
  • 2020-08-19
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多