Xpath正在动态变化

时间:2016-02-11 07:09:14

标签: selenium dom

我目前正在使用selenium框架来启动Web应用程序。使用xpath定位元素。对于应用程序中的特定下拉(其中包含过滤器),xpaths会经常更改(对于下拉列表中的可用选项)。下拉列表中的选项位于span部分内。有没有办法处理动态xpath?目前我正在使用firebug来获取xpath。

2 个答案:

答案 0 :(得分:0)

如果您知道会发生什么,可以随时使用XPATH文本匹配。

const https = require('https');

var apiCall = function(url, callback) {
    var apiUrl = {
        host: 'abc.com',
        path: '/' + url,
        headers: {
            'X': 'Y'
        }
    };
    https.get(apiUrl, function (res) {
        var body = '';
        res.on('data', function(data) {
            body += data;
        });
        res.on('end', function() {
            if (res.statusCode !== 200 && res.statusCode !== 201) {
                console.log('we shouldnt be in here if status is 200');
                console.log('status is: ' + res.statusCode);
                console.log('the end point we want to hit is: ' + url);
                callback({ reason: 'the api did not respond OK 200', data: { head: res.headers, statusMessage: res.statusMessage } }, null);
                return;
            }
            var rateLimitRemaining = res.headers['x-ratelimit-remaining'];
            if (rateLimitRemaining > 0) {
                console.log("Calls Left: " + rateLimitRemaining);
                callback(null, JSON.parse(body));
            } else {
                callback({ reason: 'we are out of API calls', data: res }, null);
            }
        });
    }).on('error', function(error) {
        callback({ reason: 'there is an error with the api', data: error }, null);
    });
};

module.exports = apiCall;

如果您在下拉列表中有列表元素:

  //*[text()='DropdownValue'] 

如果您可以提供下拉结构的示例或仅提供案例的HTML代码,那么找到合适的解决方案会更容易。

答案 1 :(得分:0)

您可以获取下拉列表中的每个元素,获取包含该文本的元素的索引,然后单击它:

List<WebElement>elems = driver.findElements(By.xpath("xpath from every element"));
elems.get(getIndex(elems, "Abereen District")).click();



private int getIndex(List<WebElement>elems, String elemText) {

        for(int i = 0; i < elems.size(); i++)
        {
            if(elems.get(i).getText().contains(elemText))
                return i;
        }

        return -1;
    }