XPath: Find element that contains text X and not Y

11,226

Solution 1

Please try following XPath and let me know if any errors occurs:

//*[contains(text(), "Chocolate")][not(contains(text(), "Dark"))]

Solution 2

Here is the syntax with using just one set of square brackets.

For elements containing the word 'Chocolate' but not 'Dark', use:

//*[contains(text(), 'Chocolate') and not(contains(text(), 'Dark'))]

For just the text of the elements, use:

//text()[contains(., 'Chocolate') and not(contains(., 'Dark'))]

Given the following XML:

<doc>
  <e>Dark Chocolate</e>
  <e>Chocolate</e>
</doc>

The first expression results in:

> xpath -e "//*[contains(text(), 'Chocolate') and not(contains(text(), 'Dark'))]" test.xml 
<e>Chocolate</e>

The second expression results in:

> xpath -e "//text()[contains(., 'Chocolate') and not(contains(., 'Dark'))]" test.xml 
Chocolate
Share:
11,226
P A N
Author by

P A N

Updated on June 15, 2022

Comments

  • P A N
    P A N almost 2 years

    I'm attempting to find a web element using XPath in Selenium for Python. The web element should contain the text "Chocolate" but not include "Dark".

    I've tried this syntax but not gotten it to work (be mindful of parantheses):

    choco = driver.find_element_by_xpath("//*[text()[contains(., 'Chocolate')] and not[[contains(., 'Dark')]]]")
    

    Here is the same code using line breaks and concatenation for readability:

    choco = driver.find_element_by_xpath((
                                        "//*[text()[contains(., 'Chocolate')]" + 
                                        "and not[[contains(., 'Dark')]]]"
                                        ))