2

I want to click the parent of an element if the text within the child matches a certain string. I am using contains to find the text and :xpath,"../../" to find the parent. Here is ruby code:

 [email protected]_element(:xpath,"//*[contains(.,'602384710')]")
puts test
 puts test.find_element(:xpath, "../..").click

The HTML snippet of the element I want to target is:

<a class="tv-card-link" href="/my-account/tv/overview?ban=7AhDHZ0ZYFVI1m8B2HmvrQ&tv_instance_id=_A5Xvou4fk-WsIWSnSkG2A">
 <div class="tv-card-wrapper">
 <div class="tv-card-icon"></div>
 <div class="tv-card-details">
 <div class="tv-card-id">
 602384710
 </div>
 </div>
 </div>
</a>

From the code, I want to click on the <a> if I find the text 602384710. When I was testing, the puts test prints out the address of Selenium WebElement so I know that works. However, selenium is unable to find the parent of the element. The error I get is:

Unable to locate element: {"method":"xpath","selector":"../.."} (Selenium::WebDriver::Error::NoSuchElementError)
[remote server] file:///C:/Users/X169804/AppData/Local/Temp/webdriver-profile20150407-7120-6gmcur/extensions/fxdriver@go
oglecode.com/components/driver-component.js:10271:in `FirefoxDriver.prototype.findElementInternal_'
[remote server] file:///C:/Users/X169804/AppData/Local/Temp/webdriver-profile20150407-7120-6gmcur/extensions/fxdriver@go
oglecode.com/components/driver-component.js:603:in `fxdriver.Timer.prototype.setTimeout/<.notify'
./features/step_definitions/ss-login_step.rb:26:in `/^I click on plan number (\d+)$/'
features\ss-login.feature:16:in `Then I click on plan number 602384710'

I think I may be missing a simple thing. Any help appreciated :)

asked Apr 7, 2015 at 18:23

3 Answers 3

1

You have two options.

If you're using findElement relative to another WebElement, your XPath needs to start with a dot (the element as your starting point). See the accepted answer in this topic.

Alternatively, the XPath contains goes looking in child nodes too. You could try to immediately target the link element like so: "//a[@class='tv-card-link' and contains(.,'602384710')]"

answered Apr 7, 2015 at 18:41
2
  • Hey! Thank you so much for your answer. I used the . as in test.find_element(:xpath, "./../..").click but that gives me the same error. Commented Apr 7, 2015 at 19:39
  • I think that your first XPath is wrong, why do you use the * symbol? This will likely return the topmost html tag (because the html itself also contains that value). Do you have a link to this page for testing purposes? Commented Apr 8, 2015 at 5:19
0

I have tested this XPath online. Please try:

//a[contains(.//div,602384710)]
answered Apr 8, 2015 at 15:30
0

Just a wild guess without any testing, but shouldn't it just be:

find_element(:xpath,"//*[contains(.,'602384710')]../..").click

The problem is that when searching with the results of a find_element it cannot go back up the tree anymore, from then on it will only search within the already found results.

answered Apr 8, 2015 at 15:39

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.