标签: casperjs

我如何在CasperJS中使用jQuery?

casper.start(URL, function() {

    casper.page.injectJs('C:/Users/Mike/Documents/n1k0-casperjs-bc0da16/jquery-1.10.2.min.js');
    var names = $('span.author-name');
    this.echo(names);
    this.exit();
}
Run Code Online (Sandbox Code Playgroud)

ReferenceError:找不到变量:$

我该怎么办?我在创建casper实例时也尝试过这个:

var casper = require('casper').create({

    // I've tried both commented lines below

    // clientScripts: ['C:/Users/Mike/Documents/n1k0-casperjs-bc0da16/jquery-1.10.2.min.js']
    // clientScripts: ['includes/jquery-1.10.2.min.js']
});
Run Code Online (Sandbox Code Playgroud)

javascript jquery casperjs

22
推荐指数
1
解决办法
2万
查看次数

输出带有casper/phantomjs的客户端控制台

通过casperjs文档我无法找到从客户端javascript中看到console.log的位置.这可能吗?

javascript console headless-browser phantomjs casperjs

20
推荐指数
1
解决办法
1万
查看次数

获取CasperJS或PhantomJS中的资源内容

我看到CasperJS有一个"下载"功能和一个"on resource received"回调,但我没有在回调中看到资源的内容,我不想将资源下载到文件系统.

我想获取资源的内容,以便我可以在我的脚本中使用它.这可能与CasperJS或PhantomJS有关吗?

phantomjs casperjs

20
推荐指数
3
解决办法
1万
查看次数

phantom.js与zombie.js的表现

我正在评估phantom.jszombie.js.我期望权衡是幻影有更广泛的文档支持(因为它使用真实的渲染器),而僵尸更快(因为没有使用渲染引擎).然而僵尸似乎在我做的测试中慢得多.这有意义吗?

我想也许zombie在visit()返回之前等待整页加载(包括运行所有脚本和加载css),而phantom在start()之后立即返回(我使用了casperjs),允许我继续而不等待整页.

Phantom.js

casper.userAgent("Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13");

casper.test.begin('bing search', 2, function(test) {
    casper.start('http://www.bing.com/', function() {
        this.waitUntilVisible('#sb_form_q', function() {
            this.sendKeys('#sb_form_q', "book", true);
            this.click('#sb_form_go');
            this.waitUntilVisible('#count', function() {        
                var val = this.evaluate(function() {
                     return document.getElementById('count').innerText
                });

                console.log(val)
            });
        });
    }).run(function() {
        test.done();
    });
});
Run Code Online (Sandbox Code Playgroud)

Zombie.js

var Browser = require("zombie");
var browser = new Browser()

browser.userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13"

browser.visit("http://www.bing.com/", function() { …
Run Code Online (Sandbox Code Playgroud)

performance zombie.js phantomjs casperjs

20
推荐指数
1
解决办法
6689
查看次数

使用casperjs中的--ignore-ssl-errors = true运行phantomjs

我的https页面有问题.页面完全正常,它存在,但phantomjs告诉我别的东西:'加载资源失败,状态失败'.我读了一段时间,现在我知道它是phantomjs的bug,这个问题的解决方案是:

--ignore-ssl-errors=true
Run Code Online (Sandbox Code Playgroud)

所以我知道解决方案,但不知道如何使用它.我如何将这个传递给casper的phantomjs?我该怎么办?

编辑:

整个代码:

var casper = require('casper').create({
        verbose: true,
        logLevel: 'warning',
        pageSettings: { javascriptEnabled:  true },
        viewportSize: {width: 1024, height: 768}
    });

    var url = 'http://us3.php.net/manual/en/function.explode.php',
        xp = require('casper').selectXPath;

    // ### AKCJE PODSTAWOWE ###
        casper.start(url);

            casper.userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0');

            casper.then(function(){this.captureSelector('logi/img1.png', 'body');});

            casper.then(function(){ this.sendKeys(xp('/html/body/nav/div/div/div/form/span/input[2]'),'test18');});

            casper.then(function(){this.captureSelector('logi/img2.png', 'body');})

            casper.thenClick(xp('/html/body/div[3]/div/section/div/div[2]/a[1]'));

            casper.wait(2000);
            casper.then(function(){this.captureSelector('logi/img3.png', 'body');})

            casper.run(function(){ this.exit(); }); 
Run Code Online (Sandbox Code Playgroud)

javascript ssl phantomjs casperjs

19
推荐指数
1
解决办法
2万
查看次数

什么必须包含在CasperJS的then()语句中?如何确定同步/异步功能的执行顺序?

我正在努力确定什么是异步,什么不是在运行CasperJS时,什么必须包含在then()语句中,以及什么时候将被评估.

我将遇到一个问题,与一个直通破坏语句,变量范围或evaluate()语句有关,我将开始在then()语句中包装我的所有代码......结果证明不成问题.

我注意到,当我单步执行时,我的代码运行在两个级别上,一个解析代码的评估级别,然后是then()语句.此外,我的打印语句有时会出现无法解释的顺序.

我的问题:这些then()语句如何实际排队?我已经阅读了文档,我有点理解.我想了解规则,并有一些切割和干燥的方法来确定什么是同步和什么是异步.

我甚至阅读过关于异步编码的书的部分内容,但似乎没有什么能真正解决CasperJS结构问题.有资源吗?

另外,在什么地方放置then()语句的最佳做法是什么?它们是应该在整个过程中自由地加上,还是应该在控制主要的casper.begin()函数中调用其他函数?

谢谢大家,我已经习惯了PHP.

javascript asynchronous casperjs

19
推荐指数
1
解决办法
7244
查看次数

假导航属性

我想假冒CasperJS(/ PhantomJS)的Navigator平台属性.我找到了在页面加载时覆盖Navigator对象的简单解决方案,这在Web上的许多其他地方都是建议的:

    casper.on('page.initialized', function(){
    this.evaluate(function(){
        (function(oldNav){
            var newNav = {};
            [].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){
                 if (prop === 'platform') {
                    Object.defineProperty(newNav, prop, {
                        value: 'Win64'
                    }); }else {
                    Object.defineProperty(newNav, prop, {
                        get: function(){
                            return oldNav[prop];
                        }
                    });
                }
            });
            window.navigator = newNav;
        })(window.navigator);
    });
});
Run Code Online (Sandbox Code Playgroud)

但问题是,如果我们从Iframe获取Navigator属性,则值仍然是原始值,因为page.initialized仅将其设置为主页面.所以我选择在源代码中更改它并再次构建它.我从git repo下载了Phantomjs,我搜索了一个硬编码的平台值(对于我的情况,Linux x86_64).我找到了硬编码的字符串./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

我把它改成了我想要作为navigator.platform返回的字符串,但它没有影响navigator.platform.我应该在哪里改变它?它(平台)是一个带编码的字符串还是动态创建的?

javascript overwrite navigator phantomjs casperjs

19
推荐指数
1
解决办法
1029
查看次数

如何通过命令行将变量作为参数传递给CasperJS脚本?

我在一个js文件中使用PhantomJs,CasperJs和Js来运行cmd.

想象一下,我们有两个文件(test1.js和test2.js).这两个文件都有一个url/site变量,用于将测试定向到特定地址.每当环境发生变化或目标位置发生变化时,我们都需要更新此变量.

为了避免更新文件,我想通过命令行传递值,以测试它的位置.

有没有办法在运行文件时通过cmd声明字符串变量?

例如:

casperjs test.js "var site='http://google.com';"
Run Code Online (Sandbox Code Playgroud)

javascript jquery cmd phantomjs casperjs

18
推荐指数
2
解决办法
1万
查看次数

casperjs click()一个表单元素,用于提交,等待,在下一页运行查询?

我想单击一个提交按钮,等待下一页加载,然后在第二页上获取html ..我开始,然后运行,但后面的步骤仍在第一页上运行.有任何想法吗?

var casper = require('casper').create();
var site = 'http://www.example.com';
var data = {}; 

casper.start(site, function() {
     this.evaluate(function() {
        $('input[type="submit"]:first').click();
    }); 
});

casper.then(function() {
    data.body = this.evaluate(function() {
        var rows = $('#content table:first tbody tr');
        var listings = rows.eq(3).text();
        var count = rows.eq(4).text();
        return {
            listings: listings,
            count: count
        };  
    }); 
});

casper.run(function() {
    this.echo(data.body.listings);
    this.exit();            
});
Run Code Online (Sandbox Code Playgroud)

casperjs

17
推荐指数
1
解决办法
2万
查看次数

如何模块化CasperJS测试步骤?

我是CasperJS的新手,我已经开始创建一个测试套件了.一些步骤(如登录到应用程序)将被重复使用,因此我们希望在库文件(包含在测试文件中)中管理它们.

此外,我们有多个环境运行(开发,集成,生产等),因此我们需要为此参数化测试步骤,因此应该可以将参数传递给模块.

我搜索了文档和stackoverflow(我知道有类似的问题),但我的Javascript技能显然太有限,我无法启动并运行.

这是我的示例测试文件:

// googletesting.js
casper.test.begin('Google search retrieves 10 or more results', 5, function suite(test) {
    casper.start("http://www.google.fr/", function() {
        test.assertTitle("Google", "google homepage title is the one expected");
        test.assertExists('form[action="/search"]', "main form is found");
        this.fill('form[action="/search"]', {
            q: "casperjs"
        }, true);
    });

    casper.then(function() {
        test.assertTitle("casperjs - Recherche Google", "google title is ok");
        test.assertUrlMatch(/q=casperjs/, "search term has been submitted");
        test.assertEval(function() {
            return __utils__.findAll("h3.r").length >= 10;
        }, "google search for \"casperjs\" retrieves 10 or more results");
    });

    casper.run(function() {
        test.done();
    });
}); 
Run Code Online (Sandbox Code Playgroud)

这就是它应该是(或类似的):

// …
Run Code Online (Sandbox Code Playgroud)

javascript automated-tests casperjs

17
推荐指数
2
解决办法
6162
查看次数