Я пытаюсь написать модульные тесты с помощью Zombie.js. Моя проблема заключается в том, что запросы AJAX не заканчиваются при запуске с использованием browser.evaluate
, хотя они выполняются отлично, если они включены на странице с тегом скрипта.zombie.js-triggered запросы AJAX не заполняются
У меня есть три файла:
index.html
: HTML-страница, которая загружает зомбиhello.txt
: обычный текстовый файл с содержимымhello, world
main.js
: в zombie.js программу, которая загружаетindex.html
index.html
и hello.txt
are s с использованием команды 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
был получен, но событие никогда не было передано обработчику.
Почему запрос, инициированный зомби, не выполнен правильно?