23 Apr '13, 2am
XPath kind of sucks, but you'd think it might be good at the one thing it was designed for. But no:
I’m writing Selenium tests again, which means a lot of XPath. Here’s a trick I learned thanks to this article on Push Button Paradise. The problem is, how do you write XPath that matches one class in a multi-class element like <div class='foo bar'> ? The standard XPath equality operator matches a full string, so //div[@class='foo'] won’t work. The solution is arcane but I promise it works: //div[contains(concat(' ',normalize-space(@class),' '),' foo ')] Note that there must be spaces on either side of the class name ‘foo’. Since this is quite a mouthful, I’ve extracted it into a helper method. Here it is in Java: /** * Generates a partial xpath expression that matches an element whose 'class' attribute * contains the given CSS className. So to match <div class='foo bar'> you would * say "//div[" + containingClass("foo") + "]". * * @param className CSS class name * @r...