Selenium CSS定位器的所有属性选项(严格和非严格)

0 投票
2 回答
993 浏览
提问于 2025-04-17 09:42

我又需要你的帮助了。

这次是关于我在根据内嵌HTML构建Selenium CSS定位器时遇到的问题。我的问题很简单:在CSS定位器中允许使用哪些属性?我该如何确保它的严格性?

举个例子,对于以下HTML:

<input id="tbd" type="text" disabled="disabled">
<input type="submit" id="b1" value="b11" onclick="javascript: alert('button1')">

对于上面的HTML,可以很容易地构建相应的CSS:

css=input[id="tbd"][type="text"][disabled="disabled"]
css=input[id="b1"][value="b11"][onclick="javascript:alert('button1')"]

我发现onclick和disabled这些属性是不被支持的。那么,如何知道我该选择哪种定位器类型呢?

我的第二个问题是,我希望在查找定位器时能够非常严格。

例如,我希望这个定位器:

css=input[name="tbd"][type="text"]

能够匹配这个HTML:

<input name="tbd" type="text">

而不是这个:

<input name="tbd" type="text" disabled="disabled">

这就是我所说的严格。

有什么帮助吗?

谢谢,

Amit

2 个回答

0

对于被禁用的元素,有一个叫做 disabled伪类

css=input:disabled[id="tbd"][type="text"]

那份文档来看,似乎你真的不能通过onclick和其他事件来选择元素(这很合理,因为CSS负责的是样式展示,而不是处理JavaScript事件)。那为什么不使用XPath呢?

我想你的最后一个问题可以这样重写:

css=input[type="text"] 用来匹配这个HTML <input type="text">,而不是这个 <input type="text" disabled="disabled">

据我所知,没有这种“严格”的匹配方式。你需要指定一个完整的选择器,只匹配你需要的元素:css=input:enabled[type="text"] 或者 css=input:not(:disabled)[type="text"]

0

使用xpath来处理复杂的选择器,这样可以节省很多时间和代码。

下面是一个使用xpath选择器的例子,不过为了简洁起见,使用了不同的库(BY_ID_XPATHBY_ID_AND_NOT_DISABLED_XPATH的xpath表达式在你的selenium代码中是一样的):

from lxml import etree

HTML = """
<input id="tbd" type="text" disabled="disabled">
<input id="tbd" type="text">
"""

BY_ID_XPATH = '//input[@id="tbd"]'
BY_ID_AND_NOT_DISABLED_XPATH = '//input[@id="tbd" and not(@disabled)]'

elements_tree = etree.fromstring(HTML, parser=etree.HTMLParser())

elements_tree.xpath(BY_ID_XPATH)
# matches 2 elements: [<Element input at 102ea1d08>, <Element input at 102ea1db8>]

elements_tree.xpath(BY_ID_AND_NOT_DISABLED_XPATH)
# matches 1 element:  [<Element input at 102ea1d08>]

id属性在整个网页中应该是唯一的。不过,这并不总是如此,因为开发者可以随意使用多个相同的id值。

如果你在项目中有一定的发言权,可以把id作为唯一属性来保持自动化代码简洁清晰,并且可以提交类似“主页上有重复的id属性”的bug。

对于onclick的匹配,你的选择器看起来会是这样的:

BY_ONCLICK_XPATH = """//input[@onclick="javascript:alert('button1')"]"""

撰写回答