为什么PhantomJS无法在基于Travis CI容器的基础架构上工作?

时间:2015-09-12 10:32:11

标签: php phpunit phantomjs travis-ci

我使用Spiderling和PHPUnit对PHP项目进行功能测试,通常使用PhantomJS作为底层浏览器。这在使用传统基础设施的Travis CI中完全正常。

我已切换到sudo: false中的.travis.yml以尝试迁移到基于Docker的基础架构,并且所有基于PhantomJS的测试都失败了。事实上我已经添加了两个新的琐碎测试,并发现如果Spiderling切换到简单的基于cURL的提取,一切都很好:

/**
 * Check to see if any tests are working on Travis containers
 * 
 * (This succeeds)
 * 
 * @driver simple
 */
public function testAnythingAtAllSimple()
{
    $text = $this->visit(self::DOMAIN)->find('.container')->text();
    $this->assertContains('Questions about this site', $text);
}

/**
 * Check to see if any tests are working on Travis containers
 * 
 * (This fails - identical except for the driver)
 * 
 * @driver phantomjs
 */
public function testAnythingAtAllPhantom()
{
    $text = $this->visit(self::DOMAIN)->find('.container')->text();
    $this->assertContains('Questions about this site', $text);
}

我的Travis YAML配置因此:

language: php
sudo: false
php:
  - "5.6"
notifications:
  email: false
before_script:
  - phantomjs --help
  - composer self-update
  - COMPOSER=composer.travis.json composer install
  - git submodule init
  - git submodule update
  - npm install bower
  - bower install
  - mysql -u root < test/build/create-user.sql
  - export PATH=`pwd`/bin:$PATH
  - cp config/env-config.php.example config/env-config.php
  - touch /tmp/phantom-awooga.log
script:
  - phpunit --coverage-clover=coverage.clover
  - wget https://scrutinizer-ci.com/ocular.phar
  - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
  - cat /tmp/phantom-awooga.log
  - cat /tmp/awooga-screenshot-data.log

我已经添加了phantomjs --help来证明PhantomJS确实可以在这个新的基础架构中使用,并且这会提供正常的帮助输出。我不是自己安装它 - 它是Travis构建机器中的默认安装。

在另一项测试中,我在sleep(3)之后尝试了$this->visit(),这没有任何区别。我想知道幻影是否需要更多时间在新环境中安定下来。

我还尝试过制作屏幕截图的Spiderling / Phantom功能,我只是得到一个大的透明图像(它是一个有效的PNG,但它没有任何内容)。

我想知道Spiderling是否意外地抑制了导致这种困难的PhantomJS中的一些错误? PhantomJS确实启动正常,它只是不会渲染。我已经以编程方式打开了连接日志记录,并且它正在记录正常,但没有明显的错误消息:

Starting server on port 4516
Recieved command  POST /url http://localhost:8090
  Executing command  POST /url http://localhost:8090
http://localhost:8090 fail
Recieved command  POST /elements .//descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' container ')]
  Executing command  POST /elements .//descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' container ')]
Recieved command  POST /elements .//descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' container ')]
  Executing command  POST /elements .//descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' container ')]
Recieved command  POST /elements .//descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' container ')]
  Executing command  POST /elements .//descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' container ')]

http://localhost:8090 fail看起来并不好,但它无法解释问题所在。

我对新基础架构的有限理解仅仅是sudo是不允许的。但是,我不会在构建中的任何位置使用root权限。

此问题非常重要,因为测试在旧版基础架构上运行良好。然而,因为它是&#34;遗产&#34;我认为它会在某个时候被撤销,所以如果可能的话,让它工作是有意义的。

PhantomJS提供--debug开关,但不幸的是Spiderling没有提供一种干净的方式来添加它。因此,我使用后期编译器黑客来覆盖Travis配置中的必要文​​件,这种方法确实会在日志中生成附加的DEBUG信息。但是,我看不到任何有用的东西。

由于这可能是特拉维斯的问题,我raised a bug。与此同时,任何关于传统和容器环境中可能导致此问题的差异的观察都将受到欢迎。

1 个答案:

答案 0 :(得分:2)

对于遇到同样问题的人:

显然,测试中的客户端和Web服务器之间的任何地方似乎都存在错误,将主机名localhost解析为IP 127.0.0.1。这个错误可能在PhantomJS或PHP中,因为直接调用curl可以正常工作。

简单修复/解决方法是修改测试以调用http://127.0.0.1:port并修改服务器配置以侦听127.0.0.1。由于不需要将主机名解析为loopback-IP,因此客户端从PHP内置的Web服务器获取网页没有问题。