I am having a problem selecting nodes by attribute when the attributes contains more than one word. For example:
A 2.0 XPath that works:
//*[tokenize(@class,'\s+')='atag']
or with a variable:
//*[tokenize(@class,'\s+')=$classname]
To add onto bobince's answer... If whatever tool/library you using uses Xpath 2.0, you can also do this:
//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
count() is apparently needed because index-of() returns a sequence of each index it has a match at in the string.
Here's an example that finds div elements whose className contains atag
:
//div[contains(@class, 'atag')]
Here's an example that finds div elements whose className contains atag
and btag
:
//div[contains(@class, 'atag') and contains(@class ,'btag')]
However, it will also find partial matches like class="catag bobtag"
.
If you don't want partial matches, see bobince's answer below.
Be aware that bobince's answer might be overly complicated if you can assume that the class name you are interested in is not a substring of another possible class name. If this is true, you can simply use substring matching via the contains function. The following will match any element whose class contains the substring 'atag':
//*[contains(@class,'atag')]
If the assumption above does not hold, a substring match will match elements you don't intend. In this case, you have to find the word boundaries. By using the space delimiters to find the class name boundaries, bobince's second answer finds the exact matches:
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
This will match atag
and not matag
.
EDIT: see bobince's solution which uses contains rather than start-with, along with a trick to ensure the comparison is done at the level of a complete token (lest the 'atag' pattern be found as part of another 'tag').
"atag btag" is an odd value for the class attribute, but never the less, try:
//*[starts-with(@class,"atag")]
For the links which contains common url have to console in a variable. Then attempt it sequentially.
webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
driver.findelement(allLinks[i]).click();
}