views:

987

answers:

2

I want to get the xpath count of all the divs/links/.. that have text matching some regular expression. For example:

<span> day 2 night </span>
<span> day 4 night </span>
<span> day 17 night</span>

I would like to be able to call:

sel.get_xpath_count('regexp:day \d night')

and have it return 2. (This is a simple example of course, I would like to use all kinds of regular expressions)

Is this possible, and how to do it?

+1  A: 

Use the dom= protocol which allows you to use javascript. And javascript has regexp:

# sorry, example in Perl:
$sel->get(qq{dom=(function(){
    var x = document.getElementsByTagName('span');
    var result = [];
    for (var i=0;i<x.length;i++) {
        var txt = x[i].innerHTML;
        if (txt.match(/day \d night/)) {
            result.push(x[i]);
        }
    }
    return result;
})()});
slebetman
+1  A: 

Regular expressions are only available in XPath 2. If XPath 2 is available in the browser you're using, then the following should work:

get_xpath_count("xpath=//div*[matches(text(), \"day \\d night\")]");

However, I believe the Javascript implementation of XPath baked into Selenium implements XPath 1.0. Therefore, it's probably easier to write a small Javascript function to grab all of the elements in the page, and use regular expression in Javascript, and just have this function return the number of matches. You can then call this Javascript function using get_eval.

Michael Williamson