我正在尝试使用Phantomjs登录网站。当我在填充表单元素后单击loginButton时,我试图在setInterval函数中找到一些元素id,因为我希望首先加载页面(给出2秒)然后只搜索元素但这里的问题是:我的setInterval中的语句没有被执行。这是phantomjs代码:
var url = "http://www.someUrl.com";
var page = require('webpage').create();
page.onConsoleMessage = function(msg, lineNo, sourceId){
console.log('console: ' + msg);
};
page.onLoadFinished = function(status){
console.log("Loading finished");
page.render('webpage.png');
};
page.open(url, function(status){
page.evaluate(function(){
arr = document.getElementsByClassName('formLabel');
if (typeof arr !== 'undefined'){
arr[0].value = 'Login-id';
arr[1].value = 'Password';
}
document.getElementById('loginButton').click();
setInterval(function(){
console.log("Downloading the file");
document.getElementById('downloadButton').click();
}, 2000);
});
});
当我执行上面的代码时,我得到的输出为: -
Loading finished
Loading finished
出于调试目的,我在setInterval函数中写了console.log('Downloading the file')
但是这个语句没有被执行。
我还将网页呈现为图像page.render('webpage.png')
,以检查我是否能够成功登录。我看到登录成功了。所以,我在这里几乎没有问题: -
setInterval
函数中的那些语句没有被执行?事实上,当我在loginButton.click()
语句之后编写这些语句时,我得到了这个错误 - TypeError:'null'不是一个对象(靠近'downloadButton')。click();. ..'),这意味着当时页面没有加载。因此,我在setInterval函数中写了它们,并将等待时间设为2秒。
PS:我的click
声明没有问题,因为我的loginButton.click
正在运作。
先谢谢。
答案 0 :(得分:1)
当我开始尝试使用PhantomJS时,我遇到了同样的问题。 我意识到问题可能是page.evaluate()在打开的页面的上下文中运行。因此,当您单击登录按钮时,页面将被重定向,因此click()之后的语句不会被执行或输出不再可见。
我通过创建另一个page.run()块并在前一个完成后运行它(即超时)来解决这个问题 - 因为我想在登录后执行该部分脚本。