CSS选择器:href的锚文本包含

8
我目前正在使用Selenium,并且现在已经进入了有趣但非常困难的CSS选择器世界。
我目前正在查看如何选择Google工具栏上的不同选项。例如,当您搜索某些内容时,在结果页面上,您可以选择在图像、新闻、视频等下搜索相同的关键字。
我特别想选择“图片”链接。
我已经花了相当长的时间来研究它,最接近的选择器是下面这个:
div a.q.qs[href]

这个问题需要深入到正确的子类,但这里有16个子类。尽管我已经进行了数小时的漫无目的搜索,但我无法使用包含在锚文本中的contains方法完成查询,而该文本在目标子类中是唯一的。

我知道Selenium中有一个按LinkText选项,但我不确定锚文本是否在整个页面上都是唯一的。此外,我真的想了解CSS选择器的常规用法,即使锚文本是唯一的,我也想解决这个特定的问题,以便将其应用到未来的问题中。

我正在寻找类似于下面伪CSS选择器的东西:

div a.q.qs[href].Anchorcontains("Images")

有人可以帮忙吗?


这是一个有趣的问题。我建议你添加一些代码块使它更易读(CSS 选择器),并删除 Selenium 和 Java 标签,因为即使对你来说是一个 Java&Selenium 问题,但问题本身只关注 CSS 选择器。 - Clijsters
1
所有链接都有一个称为tbm的独特参数:它的值对于图像是 isch,所以我会选择使用 a[href*="isch"]。在浏览器上可以工作,但不确定Selenium是否可以。 - BackSlash
这是一个很好的想法。或者你可以假设“图像”项始终是列表中的第二项。如果你确定在你想选择图片的时候,“全部”被选中,那么它就是包含链接的第一项。 - Clijsters
如果您想按锚点的实际文本内容进行选择,则无法这样做:https://dev59.com/pHI_5IYBdhLWcg3wHfOr - Serg Chernata
1
以下是一些 CSS 参考链接,可以帮助您入门:W3C 参考SauceLabs CSS 选择器技巧Taming Advanced CSS 选择器 - JeffC
@RustyShackleford 很高兴看到你找到了解决方案,但我相信你仍然不知道 isch 到底是什么,明天在 href 属性中完全无法使用 isch 也不要感到惊讶。 - undetected Selenium
2个回答

24

所有链接都有一个唯一的参数叫做tbm: 它的值是isch(图片), 所以我会选择

a[href*="tbm=isch"]

我喜欢你的想法,只是有一个小缺点:如果搜索文本是“Witzisch”,它将匹配任何搜索链接。难道不应该是“tbm=isch”吗? - Clijsters
2
谢谢,这就是我所寻找的。它还让我清楚地意识到,未来我应该调查 hrefs 以获取唯一的子字符串。 - Rusty Shackleford

3

有时候可以使用CSS选择器来获取想要的元素,但如果你想通过包含的文本来查找一个元素,你需要使用链接文本/部分链接文本(如果是链接)或XPath(如果不是链接)。

你想要的XPath是:

//div[@id='hdtb-msb-vis']//a[.='Images']

您可以使用//a[.='图片'],但这会返回两个元素,其中一个不可见。
将其分解如下:
在任何级别上的//
查找一个DIV
它包含一个ID为“hdtb-msb-vis”的属性
//a 拥有一个子节点A 在任何级别上
[.='图片'] 包含文本(.)等于'图片'
如果您想通过链接文本进行探索,可以编写以下内容:
int count = driver.findElements(By.linkText("Images")).size();

并打印计数。我猜它将是2,其中一个不可见。如果您想要进一步筛选仅可见的链接,可以使用Selenium。

您将遇到与BackSlash的CSS选择器答案相同的问题。您可以稍微调整它,并使用CSS选择器定位器解决此问题。

#hdtb-msb-vis a[href*='tbm=isch']

以下是一些 CSS 参考链接,可以帮助您入门:W3C 参考SauceLabs CSS 选择器技巧驯服高级 CSS 选择器。请注意保留 HTML 标签,但不要写解释。

感谢@JeffC - 我已经接受了BackSlashes的答案,因为CSS更易读。然而,我认为你的答案提供了一种更有针对性的方法。我很矛盾!我希望我能够接受两个答案。 - Rusty Shackleford
没问题。易读性在于读者的眼睛。一旦您更熟悉它们,它们将变得更容易阅读。如果没有更具体的定位器,您需要编写更多的Java / Selenium代码来处理不可见元素以避免问题。 - JeffC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接