我想登录Web应用程序并开始模拟 - 即访问某些页面并更改某些值。
我的代码是:
var Browser = require("zombie");
fail = function (error) {console.log(error)}
function login(browser){
//console.log("login")
return browser.visit("http://example.com/login").then(function(){
browser.fill('input[name="email"]', 'example@example.com')
browser.fill('input[name="password"]', 'example')
browser.pressButton("#login")
return browser.wait().then(function() {
return browser;
})
})
}
function simpleScenario(browser, id) {
//browser.wait().then(function() {
browser.visit("http://example.com/next_page")
.then(function () {
browser.wait(function() {
var n = 5;
var step = function () {
var period = 100 + n;
browser.evaluate("m.productvalue(" + period + ")");
if(n > 0) {
setTimeout(step, 1000);
}
n--;
};
step()
})
.fail(fail)
});
//});
}
function sampleScenario(id) {
var browser = new Browser({debug:false})
login(browser)
.then(function () {
console.log("logged in");
simpleScenario(browser, id);
})
.fail(fail);
}
function loadTest(numberOfThreads) {
for(i = 0; i < numberOfThreads; i++) {
sampleScenario(i)
}
}
loadTest(50);
我的问题是:当我在循环中执行一次我的函数时,一切正常,但是当numberOfThreads为10或更多时,我收到错误:
[TypeError:无法使用'in'运算符在null中搜索'compareDocumentPosition']
似乎如果创建了许多Browser对象,那么僵尸无法使用它进行管理。
也许僵尸库太慢而无法与许多线程一起工作?我可以在不使用Zombie.js的情况下执行相同的操作,只能使用node.js吗?或者也许我的脚本的某些部分需要优化以与Zombie.js一起运行?
答案 0 :(得分:1)
错误消息[TypeError: Cannot use 'in' operator to search for 'compareDocumentPosition' in null]
表示僵尸尝试将响应内容加载到Document对象中,但响应内容为null
,这意味着内容尚未响应。
请注意,您的login
功能并非旨在正确处理登录过程,因为无法衡量登录是否成功。至少你应该向wait
函数添加一些东西:
function login(browser) {
return browser.visit('http://example.com/login').then(function() {
browser.fill('input[name="email"]', 'example@example.com')
.fill('input[name="password"]', 'example')
.pressButton("#login").then(function() {
// check if h1 tag is there in 7 seconds.
return browser.wait({waitDuration: '7s', element: "h1"});
});
})
}
根据您的simpleScenario
,它必须返回wait
中没有假值的内容。或者僵尸会一直等到5秒。
答案 1 :(得分:0)
我也有类似的问题,它通过删除调试选项,在创建浏览器实例时得到解决。 同样降级到v1.4.1,因为2.0处于alpha阶段