Selenium CSS定位器的所有属性选项(严格和非严格)
我又需要你的帮助了。
这次是关于我在根据内嵌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 个回答
对于被禁用的元素,有一个叫做 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"]
。
使用xpath来处理复杂的选择器,这样可以节省很多时间和代码。
下面是一个使用xpath选择器的例子,不过为了简洁起见,使用了不同的库(BY_ID_XPATH
和BY_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')"]"""