我正在尝试使用phantomjs自动化浏览器。我加载页面,提供登录凭据,然后单击提交按钮。作为第一步,我加载了一个页面,修改了表单值并将输出传送到.html文件以查看是否有效。这是我的代码:
var page = require('webpage').create();
var fs = require('fs');
page.onConsoleMessage = function(msg) {
fs.write("/home/phantom/output.html", msg, 'w');
};
page.settings.userAgent = 'SpecialAgent';
//page.open('http://google.com', function(status) {
page.open('https://somewebsitehavingaform.com', function(status) {
if (status !== 'success') {
console.log('Unable to access network');
} else {
var ua = page.evaluate(function() {
document.getElementsByName('id').value="id";
document.getElementsByName('name').value="name";
document.getElementsByName('password').value="password";
console.log(document.body.innerHTML);
});
}
phantom.exit();
});
当我打开output.html时,它会向我显示表单但它是空的。我希望预先填写id,name和密码。我在哪里错了?
答案 0 :(得分:1)
首先,getElementsByName
将返回一个数组。为了设置使用该名称找到的第一个输入的值,您需要选择其中的特定元素,即第一个:
getElementsByName('foo')[0].value = 'bar'
然后,如果您更改分配以使用setAttribute
,它似乎正常工作:
var ua = page.evaluate(function() {
document.getElementsByName('id')[0].setAttribute("value", "id");
document.getElementsByName('name')[0].setAttribute("value", "name");
document.getElementsByName('password')[0].setAttribute("value", "password");
console.log(document.body.innerHTML);
});
根据Mozilla docs,
使用
setAttribute()
修改某些属性,最值得注意的是值 在XUL中,工作不一致,因为属性指定了默认值 值。要访问或修改当前值,您应该使用 属性。例如,使用elt.value
代替elt.setAttribute('value', val)
。
虽然您只是将生成的HTML写入文件,但我认为在这种情况下我不会认为它会引起您的问题。
不确定Phantom JS现在是否在内部使用QJSEngine,但请注意其待办事项上的this open ticket,这可能与您使用点符号获得的问题有关:
QJSEngine
是V8的简单包装器,主要用于QtQml
。 使用QJSEngine作为PhantomJS主要上下文可能会更多 可扩展/可定制的当前实现。问题:
...
使用点表示法时自动创建属性不适用于添加到QJSEngine的QObject
(这表明QJSEngine不是当前正在使用的实现,但是在9个月前被提出,所以不确定它是否自那时起被引入,所以认为值得标记)