Getting WebElement by Text using XPath in Selenium

2020-02-28 18:27发布

I would like to find any WebElement based on text using XPath.

WebElement that I am interested to find,

WebElement that I am interested in

Its HTML,

Its CSS

Basically my WebElement that I am trying to retrieve by Text contains an input element.

I currently use,

driver.findElement(By.xpath("//*[normalize-space(text()) = 'Own Hotel']"));

which does not find the WebElement above, but it usually works to retrieve all other web elements.

Even,

By.xpath("//*[contains(text(),'Own Hotel')]")

did not give me any results. Although I am interested in exact text match.

I am looking for a way to find web element by text immaterial of the elements that are present inside the web element. If text matches, it should return the WebElement.

Thanks!

2条回答
Rolldiameter
2楼-- · 2020-02-28 18:34

It seems text is wrapped inside a label and not input. Try this

driver.findElement(By.xpath(".//label[text()[normalize-space() = 'Own Hotel']]"));

There is nice explanation about this xpath pattern here

查看更多
爷的心禁止访问
3楼-- · 2020-02-28 18:39

In the HTML below:

HTML

The innerText Own Hotel within the <input> node contains a lot of white-space characters in the beginning as well at the end. Due to the presence of these leading and trailing white-space characters you can't use the location path text() as:

text() selects all text node children of the context node


As an alternative, you need to use the String Function string normalize-space(string?) as follows:

driver.findElement(By.xpath("//*[normalize-space()='Own Hotel']"));

However, it would a better idea to make your search a bit more granular adding the tagName and preferably an unque attribute as follows:

  • Using tagName and normalize-space():

    driver.findElement(By.xpath("//input[normalize-space()='Own Hotel']"));
    
  • Using tagName, and normalize-space():

    driver.findElement(By.xpath("//input[@name='ownHotel' and normalize-space()='Own Hotel']"));
    

References

you can find a couple of relevant discussions using normalize-space() in:

查看更多
登录 后发表回答