Michael Durrant
Michael Durrant

Reputation: 96554

xpath - assertTextPresent isn't finding the text in the UL, why not?

If I have a list:

<html>
<head>
</head>
<body>
<ul>
  <li><span class="A">Vans</span></li>
  <li><span class="B">Cars</span></li>
  <li><span class="B">Trucks</span></li>
  <li><span class="C">Vans</span></li>
  <li><span class="C">Cars</span></li>
  <li><span class="C">Trains</span></li>
  <li><span class="C">Cars</span></li>
  <li><span class="C">Bikes</span></li>
</ul>
</body>
</html>

How can I check the last "Cars" item exists?

I am trying to use assertTextPresent

I am using //ul//li//span[contains(text(),'Cars')][last()] for the target, however this is selecting the first 'Cars' row as the span containing the text is inside the li

I also tried //span[last()][contains(text(),'Cars')] but this also select the first 'Cars' not the last.

I also tried //span[contains(text(),'Cars')][last()] but same result.

Upvotes: 0

Views: 409

Answers (2)

Phrogz
Phrogz

Reputation: 303401

If you are trying to find out if the text of the last <li> is "Cars", then:

//ul//li[last()][.="Cars"]

Testing using Nokogiri, which uses libxml2 (XPath 1.0):

require 'nokogiri'
doc = Nokogiri.HTML('<html><head></head><body>
<ul>
  <li><span class="A">Vans</span></li>
  <li><span class="B">Cars</span></li>
  <li><span class="B">Trucks</span></li>
  <li><span class="C">Vans</span></li>
  <li><span class="C">Cars</span></li>
  <li><span class="C">Trains</span></li>
  <li><span class="C">Cars</span></li>
  <li><span class="C">Bikes</span></li>
</ul>
</body></html>')

puts doc.at_xpath('//ul//li[last()]')
#=> <li><span class="C">Bikes</span></li>

puts doc.at_xpath('//ul//li[last()][.="Cars"]')
#=> nil

puts doc.at_xpath('//ul//li[last()][.="Bikes"]')
#=> <li><span class="C">Bikes</span></li>

Upvotes: 1

Ross Patterson
Ross Patterson

Reputation: 9569

Assuming that by "the last "Cars" item" you mean <li><span class="C">Cars</span></li>, you almost got it right. You want (//ul/li/span[contains(text(),'Cars')])[last()], which means "the last element in the set of elements that are <span>s containing "Cars" and contained within <li>s contained within <ul>s.

Upvotes: 1

Related Questions