Selenium CSS Locator所有属性选项有和没有严格

时间:2012-01-06 21:38:33

标签: python selenium

我需要你的帮助。 所以,这是关于我正在构建的Selenium CSS Locator,它基于我在innerHTML中看到的内容。我的问题很简单: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作为属性。所以,你去!我如何知道要选择哪个locatorType?

我的第二个问题,我希望找到定位器非常严格。 例如, 我希望这个定位器

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

匹配此HTML

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

而不是这个

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

这就是我所说的严格意义。

任何帮助?

谢谢, 阿米特

2 个答案:

答案 0 :(得分:0)

对于已停用的元素,有disabled pseudo-class

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

来自that document似乎你真的不能通过onclick和其他事件来选择(这是合乎逻辑的,css负责表示,而不是js事件)。为什么不使用XPath?

我猜想你的最后一个问题可以改写如下:

css=input[type="text"]与此HTML <input type="text">相匹配,而非此<input type="text" disabled="disabled">

AFAIK没有这种“严格”匹配。您需要指定仅匹配所需元素的完整选择器:css=input:enabled[type="text"]css=input:not(:disabled)[type="text"]

答案 1 :(得分: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作为唯一属性来保持自动化代码的简洁和清洁,并在主页和#34;上提交类似&#34;重复ID属性的错误。

对于onclick匹配您的选择器将如下所示:

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