如何在 CircleCI 中获得 Nightwatch 测试 运行?

How to get Nightwatch tests running in CircleCI?

我正在尝试在 CircleCI 中进行 Nightwatch 测试 运行,这有点……噩梦

CricleCI 似乎没有设置为 运行 PHP 应用程序的网络服务器。

CircleCI 版本的 Chrome 浏览器 ~54 与要求 >= ~55

的 Nightwatch 不兼容

CircleCI 的 Chrome 找不到我的 local.webapp.dev 域,并给出错误 ERR_ICANN_NAME_COLLISION

我已经设置了 web 服务器,使用以下 apache 配置,修改自 CircleCI docs 中的推荐版本:

<VirtualHost *:80>
  LoadModule php5_module /opt/circleci/php/5.6.17/libexec/apache2/libphp5.so

  DocumentRoot /home/ubuntu/phpwebapp
  ServerName local.webapp.dev
  <FilesMatch \.php$>
    SetHandler application/x-httpd-php
  </FilesMatch>
</VirtualHost>

经过反复试验,我终于有了这个工作:

文件示例:

测试由 Circle 使用 package.json:

自动 运行
"test": "./node_modules/.bin/nightwatch --env circleci"

这会从您的 Nightwatch.json:

中提取并 运行s 测试
"circleci" : {
  "output_folder" : "${CIRCLE_TEST_REPORTS}",
  "launch_url" : "http://local.phpwebapp.dev",
  "selenium_host" : "localhost",
  "selenium_port" : 4444,
  "screenshots" : {
    "enabled" : false,
    "path" : ""
  },
  "desiredCapabilities" : {
    "browserName" : "chrome",
    "marionette": true
  }
}

CircleCI 机器使用的是旧版本的 Chrome,它与当前版本的 Selenium/Nightwatch 不兼容。 Chrome 需要在 circle.yamlpre 依赖项中更新:

dependencies:
  pre:
  # Update Google Chrome.
  - google-chrome --version
  - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
  - sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb stable main" >> /etc/apt/sources.list.d/google.list'
  - sudo apt-get update
  - sudo apt-get --only-upgrade install google-chrome-stable
  - google-chrome --version

Circle docs forget an important piece in the apache conf file, you must set the allow/deny rules for your webroot directory,端口也改为使用默认端口80:

<VirtualHost *:80>
  LoadModule php5_module /opt/circleci/php/5.6.17/libexec/apache2/libphp5.so

  DocumentRoot /home/ubuntu/phpwebapp
  ServerName local.phpwebapp.dev
  <FilesMatch \.php$>
    SetHandler application/x-httpd-php
  </FilesMatch>
  <Directory /home/ubuntu/phpwebapp>
    AllowOverride all
    Require all granted
  </Directory>
</VirtualHost>

然后您必须激活所有必需的 Apache 模块并将您的 conf 加载到 Apache,使用 circle.yaml:

dependencies:

    ...  

    post:
        # circle seems to expect this but doesnt install it
        - sudo apt-get install libapache2-mod-php5
        # copy apache config file
        - sudo cp ~/phpwebapp/circleApache.conf /etc/apache2/sites-available
        # give phpwebapp to apache
        - sudo chown -R www-data:www-data ~/phpwebapp
        - sudo a2enmod rewrite
        - sudo a2enmod headers
        - sudo a2ensite circleApache
        # DocumentRoot doesnt work, so symlinking instead
        - sudo rm -r /var/www/html
        - sudo ln -s /home/ubuntu/phpwebapp /var/www/html
        - ls /var/www/html
        - sudo service apache2 restart
        # add local.phpwebapp.dev to /etc/hosts
        - sudo sh -c "echo 127.0.0.1 local.phpwebapp.dev >> /etc/hosts"

a2enmod 行为 PHP 应用程序启用了必要的 apache 模块重写和 header。

a2ensite 启用配置文件和您的域。某些域,例如 *.dev 还需要在 /etc/hosts 中添加一行:

- sudo sh -c "echo 127.0.0.1 local.phpwebapp.dev >> /etc/hosts"

这是在 Circle Chrome 浏览器给出错误 ERR_ICANN_NAME_COLLISION 时实现的。通过 Nightwatch 打印 source of the test page 发现了错误:

browser
    .url("http://www.local.phpwebapp.dev")
    .source(function (result){
        // Source will be stored in result.value
        console.log(result.value);
    })