使用CSS";:包含:“;在Python中使用WebDriver

使用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=

我正在将一些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=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向下移动到锚点。