Reputation: 279
I am a Software Quality Assurance Engineer and I am trying to create an Automated test for a webpage.
Some background:
The framework of Selenium that my company uses ONLY allows you to use X paths saved as an object then you use pre-existing methods like "click (someobject)" or "enter (someobject)" etc.
Problem:
I'm currently trying to create a test that selects multiple buttons that are on the same class. There are 6 set buttons that I need to be able to select. Now I can do this but using:
`//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[1]/div/a
//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[2]/div/a
//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[3]/div/a
//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[4]/div/a
//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[5]/div/a
//*[@id="tenant-details-accordion"]/div[1]/div[2]/div/div[2]/div[6]/div/a`
-However this is only temporary because the test will fail later down the road when a button is removed... I have talked to the Development team about adding Unique ID's to each button. But it does not seem like that is a path they want to go down...
Possible Solution:
Is it possible to narrow the ‘scope’ of Selenium?
For example telling Selenium to look through a specific class instead of the entire page?
-My thought is to have it search for a class, match a specific text, then select Set.
If yes, then also is it possible to combining multiple X path's Something like....
//div[@class='col-sm-4'].... //div[contains(.,'Birth Date: Set +')]
My thought is that I could create an Xpath that narrows what Selenium will actually be looking through.
Searching for the class
Searching for Text "Birth Date"
Selecting Set Button
Here is some HTML when I inspect the page
Upvotes: 2
Views: 134
Reputation: 910
In order to first locate the div with class 'col-sm-4' and text as 'Birth Date:' and then find the link with text 'Set +' under it, any of the following XPATHs can be used:
//div[@class='col-sm-4' and contains(text(),'Birth Date')]/descendant::a[1]
Or
//div[@class='col-sm-4' and contains(text(),'Birth Date')]/descendant::a[contains(text(),'Set +')][1]
Or
//div[@class='col-sm-4' and contains(text(),'Birth Date')]/descendant::a[text()='Set +'][1]
Upvotes: 1
Reputation: 373
I believe you've already asked this and we've answered it.
But here are multiple solutions:
//div[@class='col-sm-4' and contains(text(),'Birth Date')]/div/a
//div[contains(@class,'col-sm-4') and contains(text(),'Birth Date']//a
there are many more options. Try and visit w3schools.com to learn more about xpath.
Upvotes: 1
Reputation: 4173
You would want something like this:
//div[@class='col-sm-4'][.//*[contains(text(), 'Birth Date')]]//a
Meaning select the link from the div
that has a class
with value col-sm-4
and contains the specified text.
Or it could also work like this:
//div[contains(text(), 'Birth Date')]/a
Upvotes: 1