在 docker 上跑 laravel-dusk

最近因為要還債不得不寫測試,所以有了這篇文章

laravel-dusk是 laravel 官方推出的瀏覽器測試框架,整合了 selenium 以利進行各種奇形怪狀的測試

進入主題

我們的開發環境是一個 nginx + php 的 image 作為 base container,nginx 設定不同的 server_name 把 request 導到不同的專案

這邊使用的是 standalone 的架設方式,因為原本的 docker 上沒有跑瀏覽器測試的需求

關鍵是要讓 selenium 可以連到專案

docker-compose.yml

下面列的都是 docker-compose.yml 使用時記得加上 -f 或改名

  • develop-env.yml
version: "3.7"
services:
  container_name: local_dev
  image: your-dev-image:version
  command: ["/usr/sbin/init"]
  ports:
    - "80:80"
    - "443:443"
  privileged: true
  networks:
    mynetwork:
      # 要給固定 ip
      ipv4_address: 172.28.0.2
  • standalone-chrome.yml
version: "3.7"
services:
  chrome:
    container_name: local_selenium-chrome
    image: selenium/standalone-chrome:3.141.59
    ports:
      - "4444:4444"
    volumes:
      - /dev/shm:/dev/shm
    extra_hosts:
        # 這裡要指定這個 container 應該要看到的 hostname,看你的 nginx 設定
        - "local-project.dev:172.28.0.2"
networks:
  default:
    external:
      name: mynetwork

下面列出 laravel-dusk 要做的事

laravel-dusk

這邊是說開發環境

  • DuskTestCase.php
<?php
/**
 * Create the RemoteWebDriver instance.
 *
 * @return \Facebook\WebDriver\Remote\RemoteWebDriver
 */
protected function driver()
{
    $options = (new ChromeOptions)->addArguments([
        '--disable-gpu',
        '--headless',
    ]);
    // 這邊要能讓 dusk 連的到 standalone-chrome
    return RemoteWebDriver::create(
        'http://chrome:4444/wd/hub', DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY, $options
        )
    );
}
  • .env.dusk.local

獨立一個環境給 dusk 跑的時候吃,要注意的是 APP_URL

# 這邊是讓 standalone-chrome 可以連的到的專案 host
APP_URL=http://local-project.dev

成果

都設定成功的話直接下 php artisan dusk 應該會看到畫面如下

Reference

cmd + /