6

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!

Ripon Al Wasim
  • 36,924
  • 42
  • 155
  • 176
LINGS
  • 3,560
  • 5
  • 34
  • 47
  • No iframes on page. Throws `NoSuchElementException` – LINGS Oct 01 '15 at 20:43
  • It is not a wait issue. I tested this xpath on chrome when the page was loaded, it does not find the element. Hence my xpath is not correct for this case. I need alternative xapth. – LINGS Oct 01 '15 at 20:47
  • Please post the HTML code as text instead of a picture. At some future point the picture will no longer be available and this question won't be as helpful. – JeffC Oct 01 '15 at 22:13

2 Answers2

6

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

Community
  • 1
  • 1
nilesh
  • 14,131
  • 7
  • 65
  • 79
1

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:

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352