首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用casperjs单击一个随机链接并导航到另一个页面?

如何使用casperjs单击一个随机链接并导航到另一个页面?
EN

Stack Overflow用户
提问于 2014-09-14 23:34:35
回答 2查看 2.3K关注 0票数 1

我正在尝试编写一个脚本,它将执行以下操作:

  1. 加载网站并拍摄截图
  2. 从所有具有相同类名的<a>标记中选择一个随机的<a>标记
  3. 单击链接
  4. 等待新页面的加载
  5. 捕捉第二张截图

我被困在选择一个随机的<a>元素并点击它。有人能帮帮我吗?这是我第一天吃咖啡。到目前为止,我的情况如下:

代码语言:javascript
复制
var casper = require('casper').create({
     verbose: true,
     logLevel: 'debug',
     userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',
     pageSettings: {}
});
casper.options.viewportSize = {width: 1600, height: 950};


casper.start('http://www.myurl.com/', function() {
    this.echo(this.getTitle());
    this.capture('home.png');
});

casper.then(function() {
        this.echo("Second test");
        var random = Math.floor(Math.random() * document.querySelector(".showall").length);
        var clicker = document.querySelector('.showall').eq(random);
        this.mouseEvent('click', clicker);

        this.wait(5000, function() {
            this.capture('second.png');
       });

});

casper.run();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-19 11:41:33

我没能让Artjom的解决方案奏效。我认为我使用querySelectorAll的方式是错误的(不知道为什么)。我找到了解决办法。

代码语言:javascript
复制
function getElem() {
    var arr = document.querySelectorAll('a.showall');
    return Array.prototype.map.call(arr, function(elem) {
        return elem.getAttribute('href');
    });
}

casper.then(function() {

        var elem_arr = this.evaluate(getElem);
        //this.echo(elem_arr);
        this.echo(elem_arr.length);

        for (var index = 0; index < elem_arr.length; index++) {
            this.echo(elem_arr[index]);
        }

        var random = Math.floor(Math.random() * elem_arr.length);
        this.echo(random);

        var clicker = elem_arr[random];
        this.echo("Random link: " + clicker);

        casper.open(clicker).then(function() {
            this.echo('Got it! You navigated to a random link subpage.');
        });


});

诀窍是从所有a.showall元素创建一个链接数组,然后选择一个随机链接并打开它。

票数 1
EN

Stack Overflow用户

发布于 2014-09-15 05:00:14

不能在页面上下文之外使用DOM函数。为此,您必须使用casper.evaluate。请记住,evaluate是沙箱化的,您只能将原始对象传递到和传递到页面上下文。DOM元素不是原始对象,因此不能将它们传递到casper上下文中。documentevaluate之外没有任何意义。

来自文档

注意:参数和计算函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON进行序列化,那么就可以了。

您必须在页面上下文中单击带有DOM方法的链接。如果简单的clicker.click()不能工作,则必须在页面上下文中使用类似的内容。

如果该链接实际上是一个立即导航到页面的链接,则可以删除this.wait。如果页面被导航到,CasperJS可以自己感知,所以您只需使用另一个casper.then步骤即可。

顺便说一下,eq是jQuery语法,但是querySelector的结果不是jQuery对象,而是DOM元素。如果要选择一个随机元素,则必须使用querySelectorAll,然后选择其中之一:

代码语言:javascript
复制
var clicker = document.querySelectorAll('.showall')[random];

而不是。

完整解决方案:

代码语言:javascript
复制
casper.then(function() {
    this.echo("Second test");
    this.evaluate(function() {
        var elements = document.querySelectorAll(".showall");
        var random = Math.floor(Math.random() * elements.length);
        var clicker = elements[random];

        // either this type of click
        clicker.click();
        // or the following
        var ev = document.createEvent("MouseEvent");
        ev.initMouseEvent(
            "click", true, true, window, null, 0, 0, 0, 0, 
            false, false, false, false, 0, null
        );
        clicker.dispatchEvent(ev);
    });
});
casper.then(function() {
    this.capture('second.png');
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25839046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档