早上好,
我在 Windows 10 上有一个项目。问题是,如果我通过 git bash 的“npm start”运行它,我没有问题,而且效果很好。如果它从 Windows 服务启动,它会返回有问题的错误。(它使用通过“node-windows”创建的 Windows 服务启动。)
TypeError:null 不是对象(评估'document.querySelector("input[id$='auth_login_submit']").click')
我使用 phantomjs,这是脚本代码
"use strict";
var phantom = require('phantom');
var http = require('http');
var db = require('../database/users_db');
var loadInProgress =false;
var _ph;module.exports = function(url, number) {
var _page;
console.log("auto-confirm...");
console.log(url);
phantom
.create(["--ignore-ssl-errors=yes"])
.then( ph => {
_ph=ph;
return ph.createPage()
})
.then( page => {
console.log("dovrei aver creato la pagina...");
_page = page;
return page.open(url);
})
.then( status =>{
var page = _page;
console.log("inject");
page.injectJs('./mail/jquery.js');
page.on("onConsoleMessage",function(msg) {
console.log(msg);
});
page.on('onLoadStarted',function() {
loadInProgress = true;
console.log("load started");
});
var countload = 0;
var interval;
page.on('onLoadFinished',function(result) {
countload+=1;
if(countload>=2){
console.log(`chiamata onloadfinished ${countload}`);
clearInterval(interval);
return;
}
loadInProgress = false;
console.log("load finished");
console.log(result);
var conferma= function(result) {
console.log("sono nella funzione");
console.log(result);
var cont=0;
var ifSuccess = function() {
console.log("ifSuccess");
interval = setInterval(function() {
cont=cont+1;
var page = _page;
page.evaluate(function() {
console.log("sono nella page-evaluate");
if(!document)
{
console.log("documento non trovato");
return false};
if(!document.querySelector("button[id$='confirm_submit']"))
{
console.log("non ho trovato il tasto confirm");
//return new Error("ERRORE GRAVISSIMOOOOO");
//return false;
}
document.querySelector("button[id$='confirm_submit']").click();
return true;
})
.then(()=>{
console.log("sono nella .then");
clearInterval(interval);
})
.catch(e => {
console.log("sono nella catch");
console.error(e)});
if (cont>=3)
{
console.log("Sono nella if cont della then");
clearInterval(interval);
_ph.exit();
}
}, 5000);
};
var ifNotSuccess = function() {
console.log("not success");
interval = setInterval(function() {
cont=cont+1;
var page = _page;
page.evaluate(function() {
if(!document)
{
console.log("documento non trovato");
return false;}
if(!document.querySelector("button[id$='register_reject']"))
{
console.log("bottone reject non trovato");
return false;
}
document.querySelector("button[id$='register_reject']").click();
return true;
}, function(answer) {
console.log("callback ifNOTSuccess");
if(answer) {
clearInterval(object);
/* setTimeout(function() {
console.log("controllo seconda exit");
phhantom.exit();
},6000);*/
}
})
.then(()=>{
console.log("sono nella .then");
if (cont>=3)
{
console.log("Sono nella if cont della then");
clearInterval(interval);
_ph.exit();
}
})
.catch(e => {
console.log("sono nella catch ifnotsuccess");
console.error(e)});
}, 5000);
};
page.on('onLoadFinished',function() {
console.log("callback onloanfinished");
//console.log(phantom);
setTimeout(()=> {
console.log('timeout completed');
// console.log(_ph);
page.close();
_ph.exit();
},600);
});
db(number, ifSuccess, ifNotSuccess);
}
conferma(result);
});
var result= page.evaluate(function() {
console.log("Pagina credenziali...");
$("input[id$='auth_login_username']").val('XXXX');
console.log("username");
console.log($("input[id$='auth_login_username']").value);
$("input[id$='auth_login_password']").val('XXXX');
console.log("password");
document.querySelector("input[id$='auth_login_submit']").click();
console.log("login");
return true;
});
})
.catch(e => {
console.log("sono nella catch finale");
console.error(e)})
问题会出现在这里:
document.querySelector("input[id$='auth_login_submit']").click();
但我再说一遍,从 git bash 启动它一切正常!
注意
db(number, ifSuccess, ifNotSuccess);
这会对数据库进行查询以查看是否一切正常,然后调用这两个函数
编辑1:
经过一些调试后,我发现带有 Windows 服务的 phantomjs 不会创建页面.. 但是使用 git bash 的相同代码可以正确创建页面