在casperjs步骤中启用/禁用javascript?

时间:2016-02-22 14:30:56

标签: javascript redirect web-scraping phantomjs casperjs

我正在使用casper.open加载包含一些帖子数据的网址。

我需要解析html以从html获取用户ID并插入js代码,在html评估之前将window.name设置为该ID。

我在url加载后无法执行此操作,因为如果未设置带有ID的window.name,则会将其重定向到anorher url(通过js)。

casper.open('http://example.com', {
    method: 'post',
    data:{
        'somefield': 'somevalue',
    },
});

更新:

我已经成功在js重定向之前获取了页面html,禁用js casper.options.pageSettings.javascriptEnabled = false;将其放在casper.start()之前,但是js在其他每一步都保持禁用状态。

我可以在步骤中启用/禁用js吗?

这是我的代码:

casper.start().then(function () {

    // some work

}).then(function () {

    // Disable js
    this.options.pageSettings.javascriptEnabled = false;

}).then(function () {

    // POST call
    casper.open('http://example.com', {
        method: 'post',
        data:   {
            'field': 'value'
        }
    });

}).then(function () {

    // Enable js
    this.options.pageSettings.javascriptEnabled = true;

}).then(function () {

    var content = this.page.content;
    var changedContent = content.replace("some text", "with text");

    this.page.setContent(changedContent, this.getCurrentUrl());

});

来自phantomjs文档:

  

这些设置仅适用于对page.open的初始调用   功能。设置对象的后续修改将不会   任何影响。

2 个答案:

答案 0 :(得分:3)

您可以挂钩到表示initialization of the page的事件(PhantomJS event周围的包装器):

casper.on("page.initialized", function(){
    this.evaluate(function(){
        window.name = "whatever";
    });
});

casper.start(url).run();

如果您确实需要访问该页面,则可以注册"page.resource.requested"事件并使用casper.open加载该页面。通过此事件,您可以中止重定向请求等请求。由于重定向发生在同一个URL,因此您必须找到区分第一个请求和第二个请求到该URL的不同方法。例如:

var firstUrlRequestDone = false;
var url = "some url";
casper.on("page.resource.requested", function(requestData, request) {
    if (requestData.url.indexOf(url) === 0) {
        if (!firstUrlRequestDone)
            firstUrlRequestDone = true;
        else
            request.abort();
    }
});
casper.start()
    .thenOpen(url)
    .thenEvaluate(function(){
        // TODO: read DOM and change window.name
    })
    .thenOpen(url)
    .run();
  

或者,我可以在上一步中禁用页面JavaScript并在下一步启用它吗?

不,您需要启用JavaScript才能访问和更改DOM。但是,您可以停用JavaScript,加载页面,更改页面(通过replace),重新启用JavaScript和load the page from the changed string

示例:

casper.options.pageSettings.javascriptEnabled = false;
var changedContent, actualURL;
casper.start(url)
    .then(function(){
        var content = this.page.content;
        changedContent = content.replace("something", "with something");
        actualURL = this.getCurrentUrl();

        this.page.settings.javascriptEnabled = true;
    })
    .thenOpen("http://example.com") // this is a dummy page to force re-evaluation of `page.settings`
    .then(function(){
        this.page.setContent(changedContent, actualURL);
    })
    .then(function(){
        // TODO: do whatever you need
    })
    .run();

答案 1 :(得分:0)

如果要从按钮中删除已禁用的属性,请尝试此

document.querySelector('#btnLogin').removeAttribute('disabled');