如何在按钮不可见之前单击按钮?

时间:2014-07-09 02:36:52

标签: javascript casperjs

我正在尝试编写一个单击更多按钮的步骤,直到该按钮变为display: none;

澄清:我正在使用的网页是Google+ business page。还有一个按钮,一次加载大约10个评论,直到它们全部加载。完成后,Google会将按钮设置为display: none;

我已经玩了很多不同的方法来实现它。现在我正在使用类似的东西:

这个不起作用,我确信有一种优雅的方法来实现这一目标。

casper.then(function() {
  while (this.visible('.d-s.L5.r0')){
    console.log("Click");
    this.click('.d-s.L5.r0');
  }
});

这个新代码正在运行,但是我必须设置它重复的次数,这是非常hacky:

casper.repeat(15, function() {
   console.log("Click");
   this.click('.d-s.L5.r0');
   this.wait(400);
});

1 个答案:

答案 0 :(得分:2)

您需要正确处理按钮的状态。通过单击 more 按钮,它将不可见,但在下一个项目加载之前,将显示另一个加载 span。然后再次交换。您需要反映代码中的更改。

if (this.visible(moreButton)) { // synchronous
    // asynchronous steps...
    this.thenClick(moreButton);
    this.waitUntilVisible(loadingButton);
    this.waitUntilVisible(moreButton);
    this.then(function(){
        this.capture("business.png"); // overwrite the current screenshot
        // recursion here
    });
}

此外,最好将事物写为递归,因为在尝试这些步骤之前,您不知道步骤的数量。所以完整的代码将是:

var casper = require('casper').create({
    waitTimeout: 10000,
    viewportSize: {
        width: 900,
        height: 720
    }
});

var moreButton = '[id*="about-page"] span.d-s.L5.r0',
    loadingButton = moreButton + ' + span.dP.PA';

function clickMore(max, i){
    i = i || 0;
    if ((max == null || i < max) && this.visible(moreButton)) { // synchronous
        // asynchronous steps...
        this.thenClick(moreButton);  // sometimes the click is not properly dispatched
        this.waitUntilVisible(loadingButton);
        this.waitUntilVisible(moreButton, null, function onTimeout(){
            // only placeholder so that the script doesn't "die" here if the end is reached
        });
        this.then(function(){
            this.capture("business_"+i+".png");
            clickMore.call(this, max, i+1); // recursion
        });
    }
}

casper.start("https://plus.google.com/101200069268247335090/about?hl=en").then(function(){
    clickMore.call(casper);
}).then(function(){
    this.capture("business_end.png");
}).run(function(){
    this.echo("DONE");
    this.exit();
});

您还可以使用参数设置最大点击次数来调用clickMore,如下所示:

clickMore.call(casper, 10);

问题仍然存在。有时不会调度点击 more 按钮。您应该探索点击该按钮的其他方法。