使用dockerized phantomjs

时间:2016-12-01 13:22:26

标签: node.js docker phantomjs alpine

我想在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(这是正确的)

1 个答案:

答案 0 :(得分:0)

很抱歉给您带来不便,问题与我们经过测试的applciation有关,我不得不通过添加一些查询参数来更改网址。 我不知道为什么它在Windows内部使用浏览器,或者直接在虚拟机上使用phantomjs而不是在docker中,但是现在没关系。

我使用快照功能发现错误。