Reputation: 96554
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
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
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