Selenium:当文本出现多次时,如何定位精确的文本匹配

时间:2015-07-13 08:41:02

标签: python selenium xpath

我正在寻找这个小硒脚本的解决方案。当列表中出现超过1个文本时,就会出现问题。我正在寻找xpath命令[contains()。然后脚本停止。

正如您在我的脚本上看到的那样尝试使用css选择器(未注释)但它无效。我已经看到一些使用带有^和$的css选择器的正则表达式的解决方案,但我不知道它是如何工作的。

编辑:我希望只选择第三个元素" LIT"正如你所看到的那样,在列表中有LIT阻止脚本。

这是片段html

<div class="prodUnitCat">
<ul class="fixFacetZindex clearBoth" id="divChildrenCategoryFilter_0">
/ul>
<ul data-lvlcat="2">
<li data-idcat="1000015739"><span>ACCESSOIRES LITERIE</span> (9)</li>
<li data-idcat="1000015760"><span>ELEMENT DE LIT</span> (5)</li>
<li data-idcat="1000015773"><span>LIT</span> (9)</li>
<li data-idcat="1000015794"><span>LIT D'APPOINT</span> (2)</li>
</ul>
</div>

这里是我的代码

  prod = db.select(sql)
  for record in prod:


        cat1       = record[10]
        cat2       = record[11]
        cat3       = record[12]
        cat4       = record[13]

        # loading check
        WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_id(headerFieldID))


        # cat selection
        driver.find_element_by_xpath(u"//span[contains(text(),'" + cat1 +"')]").click()
        driver.find_element_by_xpath(u"//span[contains(text(),'" + cat2 + "')]").click()
        #driver.find_element_by_css_selector("span[contains('" + cat2 +"')]").click()
        driver.find_element_by_xpath(u"//span[contains(text(),'" + cat3 + "')]").click()
        driver.find_element_by_xpath(u"//div[@id=\"categContent\"]/div[4]/ul/li/span[contains(text(),'" + cat4 + "')]").click()
        loginButtonElement = WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath(loginButtonXpath))
        loginButtonElement.click()

2 个答案:

答案 0 :(得分:2)

使用//span[text()='" + cat3 +"'].。不要使用包含关键字,因为它会尝试搜索subString LIT。如果你删除contains,那么它将尝试仅匹配整个单词'LIT'与区分大小写。

答案 1 :(得分:0)

我没有足够的意见要发表,但我只是添加Vishal Jagtap的答案(这对我也有用-谢谢!)。他们的回复中的“代码”似乎有错字。应该是:

//span[text()='" + cat3 +"']

不是

//span[text()='" + cat3 +"'].

也许很明显,但是它使我(一个相对的初学者)感到困惑。也可以通过使字符串成为变量/对象来稍微简化代码:

search_string = "//span[text()='" + cat3 +"']"
driver.find_element_by_xpath(search_string).click()