【发布时间】:2013-04-06 04:50:53
【问题描述】:
我在 PhantomJS 中运行 jQuery 时遇到问题。我找到了this 答案,它谈到在评估函数内部没有可用的变量,但问题是关于节点模块,在我的示例中,我只在评估函数内部调用console.log。我已经把这个问题放在GitHub too。
以前,对于某些页面,以下evaluate 代码没有执行。现在@b1f56gd4 提供了一些帮助,现在它会打印消息;我无法执行它,但现在我可以看到:
https://login.yahoo.com/ 的页面运行来自http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js 的不安全内容。
我无法从不同的域加载 jQuery,--local-to-remote-url-access=true 或 --web-security=false 选项没有区别。
我会尝试在本地加载 jQuery。代码如下:
console.log('Loading a web page');
var url = 'https://login.yahoo.com/';
var page = require('webpage').create();
console.log('Setting error handling');
page.onConsoleMessage = function (msg) {
console.log(msg);
};
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
phantom.exit();
}
console.log('Error handling is set');
console.log('Opening page');
page.open(url, function (status) {
if (status != 'success') {
console.log('F-' + status);
} else {
console.log('S-' + status);
//-------------------------------------------------
var jsLoc = '';
jsLoc = 'jquery.min.js'; // to load local
//jsLoc = 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'; // to load remote
var func = function(pg){
console.log('Function called');
console.log('Page evaluating');
console.log(pg);
pg.evaluate(function() {
console.log('Page evaluate started');
//---
var loginVar = 'ih5d4hf65465fd45h6@yahoo.com.br';
var pwdVar = 'itsmypass_445f4hd564hd56f46s';
//---
$("#login_form #username").value = loginVar;
$("#login_form #passwd").value = pwdVar;
//---
});
console.log('Rendering');
pg.render('ystsA.png');
console.log('Rendered');
}
if (typeof jQuery == 'undefined') {
console.log('JQuery Loading'); // <<<<==== Execute only until here
console.log('Source:['+jsLoc+']');
var rs = page.includeJs(jsLoc, function() // <<<<===== Fail here, jsLoc was changed to load locally and after tried remotely, i tried use page.injectJs but fail too
{
console.log('JQuery Loaded'); // <<<< ===== Never reach here, no matter if loading local or remote script in include above
func(page);
});
page.render('ystsB.png');
} else {
console.log('JQuery Already Loaded');
func(page);
page.render('ystsC.png');
}
//-------------------------------------------------
}
phantom.exit();
});
阅读@g4d564w56 的答案后,我在没有 JQuery 的情况下完成了所有操作,然后我可以填写文本框但无法单击按钮以在登录表单上发布。
查看新代码:
console.log('Loading a web page');
var url = 'https://login.yahoo.com/';
var page = require('webpage').create();
console.log('Setting error handling');
page.onConsoleMessage = function (msg) {
console.log(msg);
};
page.onError = function (msg, trace) {
console.log(msg);
trace.forEach(function(item) {
console.log(' ', item.file, ':', item.line);
})
phantom.exit();
}
console.log('Error handling is set');
console.log('Opening page');
page.open(url, function (status) {
if (status != 'success') {
console.log('F-' + status);
} else {
console.log('S-' + status);
//-------------------------------------------------
var jsLoc = '';
jsLoc = 'jquery.min.js'; // to load local
//jsLoc = 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'; // to load remote
var act01 = function(pg){
console.log('Function called');
console.log('Page evaluating');
console.log(pg);
pg.evaluate(function() {
var getElmById = function(id){
return document.getElementById(id);
}
console.log('Page evaluate started');
//---
var loginVar = 'ih5d4hf65465fd45h6@yahoo.com.br';
var pwdVar = 'itsmypass_445f4hd564hd56f46s';
//---
getElmById("username").value = loginVar;
getElmById("passwd").value = pwdVar;
getElmById("login_form").submit(); /// <<<<==== now its dont work !!!
//---
});
console.log('Rendering');
pg.render('ystsA.png');
console.log('Rendered');
}
act01(page);
//-------------------------------------------------
}
phantom.exit();
});
【问题讨论】:
-
@b1f56gd4 非常感谢 b1f56gd4。问题是 phantmJs 默认情况下不会在评估块内执行 console.log,上面的页面显示了这个技巧。现在我可以看到很多“页面在运行不安全的内容”和“不安全的 JavaScript 尝试从具有 URL 域、协议和端口必须匹配的框架访问具有 URL 的框架。”。谢谢,现在我可以看到和调试了。
-
我知道这个问题已经有一年了,但是对于那些通过谷歌搜索找到这个问题的人来说,在这种特殊情况下的问题是 https 页面中正在使用 http 资源。为了加载 jquery,你所要做的就是使用 https url。
标签: javascript phantomjs evaluate