22

在下面的情况下,是否可以在 page.evaluate 中传递变量?

function myFunction(webpage, arg1, arg2){

var page = require('webpage').create();

page.viewportSize = { width: 1920, height: 1080 };

page.open(webpage, function (status){

    if (status == 'success') {

            page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js", function(){

                page.evaluate(function(){

                    arg = arg1 + arg2;
                    console.log(arg);

                });

            });

    } 

    else { phantom.exit(); }

});

}

我尝试了在互联网上找到的几种方法,但实际上没有什么是不可能得到它的变量的。

预先感谢您的帮助 :)

4

3 回答 3

70

像往常一样,答案在函数文档中明确说明evaluate

从 PhantomJS 1.6 开始,可以将 JSON 可序列化参数传递给函数。在以下示例中,提取了 DOM 元素的文本值。以下示例实现了与前一个示例相同的最终目标,但元素是基于传递给评估调用的选择器选择的:

下面的示例演示了用法:

var title = page.evaluate(function(s) {
    return document.querySelector(s).innerText;
}, 'title');
console.log(title);
于 2013-03-12T08:48:32.693 回答
2

我有 phantomjs 1.5.0,所以我没有编译 1.6 或更高版本,而是选择了另一种解决方案:

所以我将参数保存到 selectors.js 文件

-------------selectors.js starts----------------
var selectors = "div.nice"
-------------selectors.js   ends----------------

然后将它们注入页面:

page.injectJs("selectors.js");

更多细节可以在这里找到:http: //phantomjs.org/api/webpage/method/inject-js.html

于 2013-10-17T13:40:33.847 回答
0

我使用 phantom 4.0.4,以下适用于我,https://www.npmjs.com/package/phantom

var arg = 'test'
page.evaluate(function(arg) {
    console.log(arg)
}, arg);
于 2019-05-06T07:09:25.137 回答