我想在docker容器中使用nodejs和phantomjs进行一些测试。 所有这些测试都直接在centos或debian服务器上完美运行
npm run test
smart-tv-portal-tests@1.0.0 test / data / SmartTVPortal / tests 摩卡测试 - * .js
测试套件 XXX ✓对xxx应回复200或304 (173ms) ✓应断言响应是application / json ✓应该能够解析json ✓应该验证JSON的完整性(videos.length === 6) ✓应该用phantomjs验证http状态(160ms) ✓应验证旋转木马是否装载(761ms) ✓应检查最后的轮播元素 ✓应在主旋转木马(121ms)中进行交互式导航
8次传球(1s)
但如果我在docker容器中运行相同的测试(基于alpine / centos / ubuntu),则会因超时问题而失败
docker run -ti --net=host --rm --volume /data/SmartTVPortal/:/srv --workdir /srv/tests arte/hbbtv bash
我得到了
bash-4.3 #npm run test
smart-tv-portal-tests@1.0.0 test / srv / tests 摩卡测试 - * .js
测试套件 XXX ✓对xxx应回复200或304 (2534ms) ✓应断言响应是application / json ✓应该能够解析json ✓应该验证JSON的完整性(videos.length === 6) ✓应使用phantomjs验证http状态(89ms) 1)应该验证轮播是否已加载未处理的拒绝文本evaluatePage
全局代码evaluateJavaScript @ [本机代码] 评估@ phantomjs://platform/webpage.js:390:39 phantomjs://code/bridge.js:121:61 at /srv/tests/node_modules/node-horseman/lib/actions.js:989:36 在tryCatcher(/srv/tests/node_modules/bluebird/js/release/util.js:16:23) 在Function.Promise.fromNode.Promise.fromCallback(/srv/tests/node_modules/bluebird/js/release/promise.js:179:30) 在骑士。 (/srv/tests/node_modules/node-horseman/lib/actions.js:987:29) 在Horseman.tryCatcher(/srv/tests/node_modules/bluebird/js/release/util.js:16:23) 在Promise._settlePromiseFromHandler(/srv/tests/node_modules/bluebird/js/release/promise.js:510:31) 在Promise._settlePromise(/srv/tests/node_modules/bluebird/js/release/promise.js:567:18) 在Promise._settlePromiseCtx(/srv/tests/node_modules/bluebird/js/release/promise.js:604:10) at Async._drainQueue(/srv/tests/node_modules/bluebird/js/release/async.js:143:12) at Async._drainQueues(/srv/tests/node_modules/bluebird/js/release/async.js:148:10) 在Immediate.Async.drainQueues(/srv/tests/node_modules/bluebird/js/release/async.js:17:14) 在runCallback(timers.js:574:20) 在tryOnImmediate(timers.js:554:5) at processImmediate [as _immediateCallback](timers.js:533:5)
未处理的拒绝TimeoutError:在.waitFor()之后超时 15038毫秒 在Timeout.waitForCheck(/srv/tests/node_modules/node-horseman/lib/actions.js:1643:13) 在Timeout.wrapper(timers.js:425:11) 在tryOnTimeout(timers.js:232:11) 在Timer.listOnTimeout(timers.js:202:5)
2) should check last carousel element Unhandled rejection text evaluatePage
全局代码evaluateJavaScript @ [本机代码] 评估@ phantomjs://platform/webpage.js:390:39 phantomjs://code/bridge.js:121:61 at /srv/tests/node_modules/node-horseman/lib/actions.js:989:36 在tryCatcher(/srv/tests/node_modules/bluebird/js/release/util.js:16:23) 在Function.Promise.fromNode.Promise.fromCallback(/srv/tests/node_modules/bluebird/js/release/promise.js:179:30) 在骑士。 (/srv/tests/node_modules/node-horseman/lib/actions.js:987:29) 在Horseman.tryCatcher(/srv/tests/node_modules/bluebird/js/release/util.js:16:23) 在Promise._settlePromiseFromHandler(/srv/tests/node_modules/bluebird/js/release/promise.js:510:31) 在Promise._settlePromise(/srv/tests/node_modules/bluebird/js/release/promise.js:567:18) 在Promise._settlePromiseCtx(/srv/tests/node_modules/bluebird/js/release/promise.js:604:10) at Async._drainQueue(/srv/tests/node_modules/bluebird/js/release/async.js:143:12) at Async._drainQueues(/srv/tests/node_modules/bluebird/js/release/async.js:148:10) 在Immediate.Async.drainQueues(/srv/tests/node_modules/bluebird/js/release/async.js:17:14) 在runCallback(timers.js:574:20) 在tryOnImmediate(timers.js:554:5) at processImmediate [as _immediateCallback](timers.js:533:5)
3) should navigate interactive in the main carousel
5次传球(30s)3失败
1)测试套件 XXX 应验证轮播是否已加载: 错误:超出10000毫秒的超时。对于异步测试和挂钩,请确保" done()"叫做;如果返回Promise,请确保它已解决。
2)测试套件 XXX 应检查最后的轮播元素: 错误:超出7000毫秒的超时。对于异步测试和挂钩,请确保" done()"叫做;如果返回Promise,请确保它已解决。
3)测试套件 XXX 应该在主旋转木马中进行交互式导航: 错误:超出10000毫秒的超时。对于异步测试和挂钩,请确保" done()"叫做;如果返回Promise,请确保它已解决。
测试的下降部分是
it('should validate carousel is loaded', function(done) {
this.timeout(10000);
horseman
.open(WEBAPP_URL)
.waitFor(function() {
return document.querySelector('#loadingPanel').style.visibility === 'hidden';
}, true)
.waitFor(function() {
return document.querySelectorAll('.videosCarouselItem').length === 4;
}, true)
.then(function(res) {
done();
});
});
我猜这个问题来自幻影无法解释jquery,因此无法找到选择器,但问题只出现在docker容器中。
使用casperjs
时问题是一样的我挖了一点) “超时”的部分是'在docker容器中是
.waitForSelector('.videosCarouselItem')
.count('.videosCarouselItem')
并给我错误
Unhandled rejection TimeoutError: timeout during .waitFor() after 15059 ms
at Timeout.waitForCheck (/srv/tests/node_modules/node-horseman/lib/actions.js:1643:13)
at Timeout.wrapper (timers.js:425:11)
at tryOnTimeout (timers.js:232:11)
at Timer.listOnTimeout (timers.js:202:5)
在码头外面,没关系,我得到一个4(这是正确的)
答案 0 :(得分:0)
很抱歉给您带来不便,问题与我们经过测试的applciation有关,我不得不通过添加一些查询参数来更改网址。 我不知道为什么它在Windows内部使用浏览器,或者直接在虚拟机上使用phantomjs而不是在docker中,但是现在没关系。
我使用快照功能发现错误。