我正在尝试使用PhantomJS从表单中获取属性'value':
<input type="text" name="uniq_num" value="2PskzYavnHJa">
这是我的剧本:
var page = require('webpage').create();
var url = 'http://example.com/';
page.open(url, function (status) {
if (status === 'success') {
page.injectJs('https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js');
var input = $(document).ready(function(){
return $('input[name="uniq_num"]').attr('value');
});
console.log(input);
phantom.exit();
}
但它不起作用。
答案 0 :(得分:2)
PhantomJS有一个沙盒DOM上下文(页面上下文),你只能通过page.evaluate()
访问它:
page.open(url, function (status) {
if (status === 'success') {
page.includeJs('https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js', function(){
var input = page.evaluate(function(){
return $('input[name="uniq_num"]').attr('value');
});
console.log(input);
phantom.exit();
});
}
}
请勿将page.injectJs()
与page.includeJs()
混淆。其中一个采用URL和回调,因为它是异步的,另一个采用本地文件名。你也不需要jQuery:
page.open(url, function (status) {
if (status === 'success') {
var input = page.evaluate(function(){
return document.querySelector('input[name="uniq_num"]').value;
});
console.log(input);
phantom.exit();
}
}
请注意:
注意:
evaluate
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!