zombie.js-触发的 AJAX 请求未完成
zombie.js-triggered AJAX requests don't complete
我正在尝试用 Zombie.js 编写单元测试。我的问题是 AJAX 请求在使用 browser.evaluate
启动时没有完成,即使它们在包含脚本标签的页面上执行得很好。
我有三个文件:
index.html
: 僵尸加载的HTML页面
hello.txt
:内容为hello, world
的纯文本文件
main.js
:一个 zombie.js 程序加载 index.html
index.html
和 hello.txt
使用命令 python -m SimpleHTTPServer 8009
提供。 (请注意,我使用的是 dev.local
,这是我主机文件中 127.0.0.1
的同义词)
这里是index.html
。它发出 AJAX 请求以检索 hello.txt
。这很好用:
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8' />
<title></title>
</head>
<body>
<script type='text/javascript' src='https://code.jquery.com/jquery-2.2.0.min.js'>
</script>
<script type='text/javascript'>
$.support.cors = true;
var doRequest = function(msg) {
$.support.cors = true;
return $.ajax({
url: "http://dev.local:8009/hello.txt",
success: function(v) { console.log("success ", msg, v); }
});
};
</script>
<script type="text/javascript">
console.log("page loaded");
doRequest('script');
</script>
</body>
</html>
这是main.js
。它导航到 index.html
并尝试评估 doRequest
函数,这应该会导致 AJAX 请求。但是,请求永远不会完成,而是超时。
var Browser = require("zombie");
const browser = new Browser({debug: true});
const rootURL = "http://dev.local:8009/"
browser.visit(rootURL, function(err) {
browser.evaluate('console.log("browser.evaluate ✔");');
browser.evaluate('doRequest("zombie");');
});
这是来自 运行 DEBUG=zombie node ./main.js
的日志:
zombie Opened window http://dev.local:8009/ +0ms
zombie GET http://dev.local:8009/ => 200 +38ms
zombie Loaded document http://dev.local:8009/ +36ms
zombie GET https://code.jquery.com/jquery-2.2.0.min.js => 200 +55ms
page loaded
zombie XHR readystatechange http://dev.local:8009/hello.txt +64ms
zombie XHR loadstart http://dev.local:8009/hello.txt +1ms
zombie GET http://dev.local:8009/hello.txt => 200 +9ms
zombie XHR readystatechange http://dev.local:8009/hello.txt +1ms
zombie XHR readystatechange http://dev.local:8009/hello.txt +0ms
zombie XHR readystatechange http://dev.local:8009/hello.txt +1ms
zombie XHR progress http://dev.local:8009/hello.txt +0ms
success script hello, world
zombie XHR load http://dev.local:8009/hello.txt +2ms
zombie XHR loadend http://dev.local:8009/hello.txt +0ms
zombie Fired setTimeout after 0ms delay +1ms
zombie Event loop is empty +0ms
browser.evaluate ✔
zombie XHR readystatechange http://dev.local:8009/hello.txt +4ms
zombie XHR loadstart http://dev.local:8009/hello.txt +0ms
zombie GET http://dev.local:8009/hello.txt => 200 +6ms
奇怪的是,僵尸似乎实际上已经完成了请求:日志的最后一行显示收到了 HTTP 200
响应,但事件从未提供给处理程序。
为什么僵尸发起的请求没有正确完成?
我遇到了与 zombie.js 相同的问题,所以我查看了源代码并找到了以下几行:
// -- Event processing --
// Grabs next event from the queue, processes it and notifies all listeners.
// Keeps processing until the queue is empty or all listeners are gone. You
// only need to bootstrap this when you suspect it's not recursing.
//... more lines ...
// Is there anybody out there?
if (this.waiting === 0)
return;
因此,如果没有人在等待,则不会触发任何事件,您需要添加 browser.wait()
browser.visit(rootURL, function(err) {
browser.evaluate('console.log("browser.evaluate ✔");');
browser.evaluate('doRequest("zombie");');
browser.wait();
});
以上回答正确。使用 wait
,您可以获得 ajax 的数据。通过创建一个接受浏览器作为参数的函数来适应的另一个例子:
async function getAjaxedData(url, browser) {
return browser.visit(url).wait().then(() => {
// Do stuff
// e.g. browswer.queryAll(selector)
});
}
我正在尝试用 Zombie.js 编写单元测试。我的问题是 AJAX 请求在使用 browser.evaluate
启动时没有完成,即使它们在包含脚本标签的页面上执行得很好。
我有三个文件:
index.html
: 僵尸加载的HTML页面hello.txt
:内容为hello, world
的纯文本文件
main.js
:一个 zombie.js 程序加载index.html
index.html
和 hello.txt
使用命令 python -m SimpleHTTPServer 8009
提供。 (请注意,我使用的是 dev.local
,这是我主机文件中 127.0.0.1
的同义词)
这里是index.html
。它发出 AJAX 请求以检索 hello.txt
。这很好用:
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8' />
<title></title>
</head>
<body>
<script type='text/javascript' src='https://code.jquery.com/jquery-2.2.0.min.js'>
</script>
<script type='text/javascript'>
$.support.cors = true;
var doRequest = function(msg) {
$.support.cors = true;
return $.ajax({
url: "http://dev.local:8009/hello.txt",
success: function(v) { console.log("success ", msg, v); }
});
};
</script>
<script type="text/javascript">
console.log("page loaded");
doRequest('script');
</script>
</body>
</html>
这是main.js
。它导航到 index.html
并尝试评估 doRequest
函数,这应该会导致 AJAX 请求。但是,请求永远不会完成,而是超时。
var Browser = require("zombie");
const browser = new Browser({debug: true});
const rootURL = "http://dev.local:8009/"
browser.visit(rootURL, function(err) {
browser.evaluate('console.log("browser.evaluate ✔");');
browser.evaluate('doRequest("zombie");');
});
这是来自 运行 DEBUG=zombie node ./main.js
的日志:
zombie Opened window http://dev.local:8009/ +0ms
zombie GET http://dev.local:8009/ => 200 +38ms
zombie Loaded document http://dev.local:8009/ +36ms
zombie GET https://code.jquery.com/jquery-2.2.0.min.js => 200 +55ms
page loaded
zombie XHR readystatechange http://dev.local:8009/hello.txt +64ms
zombie XHR loadstart http://dev.local:8009/hello.txt +1ms
zombie GET http://dev.local:8009/hello.txt => 200 +9ms
zombie XHR readystatechange http://dev.local:8009/hello.txt +1ms
zombie XHR readystatechange http://dev.local:8009/hello.txt +0ms
zombie XHR readystatechange http://dev.local:8009/hello.txt +1ms
zombie XHR progress http://dev.local:8009/hello.txt +0ms
success script hello, world
zombie XHR load http://dev.local:8009/hello.txt +2ms
zombie XHR loadend http://dev.local:8009/hello.txt +0ms
zombie Fired setTimeout after 0ms delay +1ms
zombie Event loop is empty +0ms
browser.evaluate ✔
zombie XHR readystatechange http://dev.local:8009/hello.txt +4ms
zombie XHR loadstart http://dev.local:8009/hello.txt +0ms
zombie GET http://dev.local:8009/hello.txt => 200 +6ms
奇怪的是,僵尸似乎实际上已经完成了请求:日志的最后一行显示收到了 HTTP 200
响应,但事件从未提供给处理程序。
为什么僵尸发起的请求没有正确完成?
我遇到了与 zombie.js 相同的问题,所以我查看了源代码并找到了以下几行:
// -- Event processing --
// Grabs next event from the queue, processes it and notifies all listeners.
// Keeps processing until the queue is empty or all listeners are gone. You
// only need to bootstrap this when you suspect it's not recursing.
//... more lines ...
// Is there anybody out there?
if (this.waiting === 0)
return;
因此,如果没有人在等待,则不会触发任何事件,您需要添加 browser.wait()
browser.visit(rootURL, function(err) {
browser.evaluate('console.log("browser.evaluate ✔");');
browser.evaluate('doRequest("zombie");');
browser.wait();
});
以上回答正确。使用 wait
,您可以获得 ajax 的数据。通过创建一个接受浏览器作为参数的函数来适应的另一个例子:
async function getAjaxedData(url, browser) {
return browser.visit(url).wait().then(() => {
// Do stuff
// e.g. browswer.queryAll(selector)
});
}