如何使用CasperJS循环并找到所有tr id

时间:2015-11-27 19:51:14

标签: javascript casperjs

我正在尝试找到一种方法来逐个获取一些id并为每个人做一些修改:

enter image description here

上面的id列表没有固定,所以我可以没有或最多。 15!

我开始使用重复,但是我有一个问题来获取下一个(我总是拿到第一个)。我假设因为我不能在xp中使用变量count:

casper.then(function() {
    var numTimes = 6, count = 0;
    casper.repeat(numTimes, function(count) {
        var name = this.evaluate(function(count) {
        var xp = '//*[contains(@id, "connectedToNeType[' + count + ']")]'
        var element = __utils__.getElementByXPath(xp).getAttribute('id');
            return element;
        });
        this.echo(JSON.stringify(name));
    }, ++count);
});

每个tr id都有以下代码:

enter image description here

我最终的目标是获取复选框ID并选择/取消选择。 一旦我得到正确的id名称,这部分应该很容易!

BTW,我也尝试使用getElementByXPath搜索包含文字'ABC_'的文字,因为每个文字都有'ABC_xxx'的标题3.

1 个答案:

答案 0 :(得分:1)

正确的缩进可能会使问题更加明显。 casper.repeat()有两个参数,但不是三个。第三个参数应该传递给casper.evaluate(),因此count总是undefined,这意味着由于某种原因第一个元素匹配。

casper.then(function() {
    var numTimes = 6, 
        count = 0;
    casper.repeat(numTimes, function() {
        var name = this.evaluate(function(count) {
            var xp = '//*[contains(@id, "connectedToNeType[' + count + ']")]'
            var element = __utils__.getElementByXPath(xp).getAttribute('id');
            return element;
        }, ++count);
        this.echo(JSON.stringify(name));
    });
});

另外,你不需要XPath来做到这一点。 CSS选择器支持属性选择器:

var name = this.evaluate(function(count) {
    var sel = '[id*="connectedToNeType[' + count + ']"]';
    var element = document.querySelector(sel).id;
    return element;
}, ++count);