如何在PhantomJS中使用page.open之外的变量

How to use variables outside page.open in PhantomJS

本文关键字:open 变量 page PhantomJS      更新时间:2023-09-26

我想做的是访问page.open之外的一些变量,但它似乎不起作用。

让我们看看这段代码:

var page = require('webpage').create();
var url = 'http://www.bing.com';
var Tester;
page.open(url, function(status) {
    var cont = page.content;
    var patt = /Bing/;
    Tester = patt.test(cont);
    console.log ("Inside " + Tester);
    phantom.exit();
});
console.log ("Outside " + Tester);

输出为:

外部未定义内部真实

我希望这两个值都是真的,并且顺序是Inside first和Outside after。发生了什么事?

外部代码似乎是在内部代码之前执行的。

这是预期行为,因为page.open是异步的。这意味着一旦调用page.open,它就会打开指定的URL。这将需要一些时间,并且在加载页面和执行page.open回调之前执行下一条语句(console.log ("Outside " + Tester);)。

这是具有异步函数的正常JavaScript行为。如果您想在外部使用Tester,您需要让它等待一段时间,直到页面加载并执行回调。

例如,像这样的静态超时为3秒,并希望页面在该时间内加载:

page.open(...);
setTimeout(function(){
    console.log ("Outside " + Tester);
}, 3000);

你可以增加超时时间,这样你就安全了。

另一种可能性是使用示例中的waitFor,并明确等待设置Tester

page.open(...);
waitFor(function testFx(){
    return Tester;
}, function onReady(){
    console.log ("Outside " + Tester);
}, 10000); // something big, if it's ready earlier, then it is executed earlier