How does dot(.) in xpath to take multiple form in identifying an element and matching a text

懵懂的女人 提交于 2020-01-28 12:31:51

问题


I have the below dom structure:

<h3 class="popover-title">
 <div class="popup-title">
   <div class="title-txt">Associated Elements&nbsp;&nbsp(5)</div>
 </div>
</h3>

I am trying to write an xpath which will identify the title "Associated Elements" under h3 tag.

When my xpath is

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

the element is identified.

However when my xpath is

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

the element is not identified. As per my understanding the dot(.) is a replacement for text(), but then why does it not identify the element when I use the text() function.

However, for another dom structure:

<h3 class="popover-title">
   <a class="btn-popover" href="#">x</a>
   "Associated Elements"
</h3>

The xpath :

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

&

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

works fine.

Can someone please explain the behaviour of dot(.) under both these scenarios?

Is there a better way to write an xpath that holds good for both the exmaples? Please suggest.


回答1:


As selenium is tagged so this answer would be based on xpath-1.0 and the associated XML Path Language (XPath) Version 1.0 specifications.


contains(string, string)

The function boolean contains(string, string) returns true if the first argument string contains the second argument string, and otherwise returns false. As an example:

//h3[contains(.,'Associated Elements')]

Text Nodes

Character data is grouped into text nodes. As much character data as possible is grouped into each text node. The string-value of a text node is the character data. A text node always has at least one character of data. In the below example, text() selects all text node children of the context node:

//h3[text()='Associated Elements']

In your usecase, within the HTML the text Associated Elements &nbsp(5) have &nbsp; which is alternatively referred to as a fixed space or hard space, NBSP (non-breaking space) used in programming to create a space in a line that cannot be broken by word wrap. Within HTML, &nbsp; allows you to create multiple spaces that are visible on a web page and not only in the source code.


Analyzing your code trials

Your first code trial with:

//h3[contains(.,'Associated Elements')]

locates the element as it successfully identifies with partial text Associated Elements

Your second code trial with:

//h3[contains(text(),'Associated Elements')]

fails as the element contains some more characters e.g. &nbsp; in addition to the text Associated Elements.


Reference

You can find a couple of relevant discussions in:

  • How to locate the button element using Selenium through Python
  • What does contains(., 'some text') refers to within xpath used in Selenium
  • While fetching all links,Ignore logout link from the loop and continue navigation in selenium java



回答2:


The text() in contains(text(),'Associated Elements') is a selector that matches all of the text nodes that are children of the context node - it returns a node-set. That node-set is converted to string and passed to the contains() function.

text() isn't a function but a node test. It is used to select all text-node children of the context node. So, if the context node is an element named x, then text() selects all text-node children of x.

When you use contains(., 'Associated Elements') only an individual text node is passed to the function and it is able to uniquely match the text.

Note: copied and edited from this and this post.



来源:https://stackoverflow.com/questions/58114813/how-does-dot-in-xpath-to-take-multiple-form-in-identifying-an-element-and-mat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!