使用CSS";:包含:“;在Python中使用WebDriver
我正在将一些Selenium WebDriver测试用例从unittest迁移到py.test,并在尝试在CSS选择器上使用*:contains()命令时发现了一个问题。下面是一个失败的线路示例:使用CSS";:包含:“;在Python中使用WebDriver,python,css,selenium-webdriver,webdriver,contains,Python,Css,Selenium Webdriver,Webdriver,Contains,我正在将一些Selenium WebDriver测试用例从unittest迁移到py.test,并在尝试在CSS选择器上使用*:contains()命令时发现了一个问题。下面是一个失败的线路示例: WebDriverWait(driver, 60).until( expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "body.yui-skin-sam div[id=Navigation] ul[id=
WebDriverWait(driver, 60).until(
expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "body.yui-skin-sam div[id=Navigation] ul[id=mainNav] li span:contains(Home)"))
)
每当我尝试使用不包含*:contains()的CSS选择器执行此命令时,它都可以正常工作。否则,我会得到一个TimeoutException或一个InvalidElementStateException。我还尝试使用以下方法:
expected_conditions.element_located_to_be_selected
" .element_to_be_clickable
" .element_to_be_selected
" .presence_of_element_located
" .text_to_be_present_in_element
" .visibility_of_element_located
我确信我的问题与尝试使用*:contains()有关。尝试使用By.NAME、By.XPATH或任何其他对象名,都可以正常工作。以下是关于页面上HTML源代码的内容:
</div>
<div id="HeaderBox">
<div id="Content">
<div id="Header">
<div id="Left">
<img src="/images/header_logo.png" />
</div>
<div id="Right">
<div id="Text">
<div id='active_conf'> running... </div><br>
Profile is unlocked. ( <a href="/Auth/Lock/">Lock</a>
| <a href="/Auth/Logout/">Logout</a> )<br>
</div>
</div>
</div>
<div id="Navigation">
<ul id="mainNav">
<li><a href="/"><span>Home</span></a></li>
<li><a href="/DataValues/"><span>DataValues</span></a></li>
<li><a href="/Devices/"><span>Devices</span></a></li>
</ul>
运行
配置文件已解锁。(
|)
有没有人知道我可以用什么方法让它工作?提前谢谢 首先,我要说我不太熟悉Selenium的Python绑定(我使用Java)。。。然而,不久前我也遇到了同样的问题。我通过在DOM中注入Sizzle.js来帮助元素定位,从而解决了这个问题。Sizzle附带了
:contains()
psuedo类,还支持其他JQuery选择器
我能够找到一些关于Python的信息,但我确信还有更全面的信息。我能够找到解决这个问题的方法。首先,正如上面提到的@Mark Rowlands,contains()不能使用。我还需要对CSS语法进行一些更改,这样它可以更好地指向我想要验证的对象。最后,由于我有一个属性、一个located和一个value[其中value是contains()]中的文本,所以我需要一个允许所有3个元素的方法,在本例中是text\u to\u present\u in\u元素中的方法。因此,要找到主页,我需要执行以下操作:
WebDriverWait(driver, 60).until(
expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR, "css=ul[id='mainNav'] > li:nth-of-type(1) > a > span"), "Home")
)
WebDriverWait(driver, 60).until(
expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR, "ul[id='mainNav'] > li:nth-of-type(2) > a > span"), "DataValues")
)
我还可以使用a>span来代替所列的长格式,并且可能可以用第n个类型来代替第一个孩子。现在,如果我想找到其他值之一,例如,devices,我需要执行以下操作:
WebDriverWait(driver, 60).until(
expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR, "css=ul[id='mainNav'] > li:nth-of-type(1) > a > span"), "Home")
)
WebDriverWait(driver, 60).until(
expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR, "ul[id='mainNav'] > li:nth-of-type(2) > a > span"), "DataValues")
)
虽然我确信还有其他解决方案,但这些都是对我有用的。希望这对将来的人有所帮助。不幸的是,你不能将
contains()
与ccsselector一起使用,但你可以使用另一种[attribute~=value]
,因此在你的情况下,我可以想象span[value~=Home]
@Mark Rowlands:谢谢你的回复。我尝试了一下你说的,但收到了TimeoutException错误。根据您的建议,我尝试了以下操作:WebDriverWait(driver,60)。直到(
预期的条件。元素可点击((By.CSS\u选择器,“body.yui-skin-sam div[id=Navigation]ul[id=mainNav]li span[value~=Home])
我还尝试将~=添加到所有其他属性中,但收到了相同的错误。可能我的css代码不正确吗?@Mark Rowlands:我在上面的描述中添加了HTML代码,以便您查看,以防出现问题。请尝试使用xpath选择器而不是css://ul[@id='mainNav']//span[contains(,'Home')]
啊,我知道了,这是您试图通过的文本来定位的。我尽量避免这样做,相反,我会使用一个定位器,比如#mainNav>li:nth child(1)>a>span
,这意味着的第一个子元素id为mainNav,这是一个li,然后沿着DOM向下移动到锚点。