derekmd/laravel-dusk-firefox

在Firefox浏览器中运行Laravel Dusk测试

v2.1.0 2023-02-10 02:36 UTC

This package is auto-updated.

Last update: 2024-09-03 09:13:33 UTC


README

此包可以使Laravel Dusk浏览器测试在Mozilla Firefox中运行。而不是使用Chromedriver,Laravel应用测试将被发送到Firefox的Geckodriver代理服务器。

功能

  1. 下载适用于您的操作系统的最新稳定版Geckodriver二进制文件。
  2. 处理Geckodriver代理服务器进程的启动和关闭的自动化。
  3. 当测试失败时捕获Mozilla Firefox浏览器截图。
  4. 当发生JavaScript console错误时生成调试日志文件。

要求

  • PHP 7.2+
  • Laravel框架6.0+
  • Laravel Dusk 6.0+
  • 本地安装的最新版Mozilla Firefox

安装

首先确保已运行Laravel Dusk命令 php artisan dusk:install。这将文件复制到您的应用中并生成所需的子目录。

composer require --dev derekmd/laravel-dusk-firefox
php artisan dusk:install-firefox

这将覆盖您的应用中tests/DuskTestCase.php文件以支持在Mozilla Firefox中运行。您的浏览器测试套件现在将在Mozilla Firefox而不是Google Chrome中打开。

php artisan dusk

更新Geckodriver

要下载适用于您的当前操作系统的最新稳定版Geckodriver二进制文件

php artisan dusk:firefox-driver

使用--all选项安装Linux、macOS和Windows的所有三个二进制文件。

php artisan dusk:firefox-driver --all

如果您希望下载旧版二进制文件,请将GitHub发布标签版本作为第一个命令行参数。请注意,Geckodriver的版本号与Mozilla Firefox的发布版本无关。

php artisan dusk:firefox-driver v0.19.1

该命令也可以通过本地代理服务器下载二进制文件

php artisan dusk:firefox-driver --proxy=tcp://127.0.0.1:9000 --ssl-no-verify

配置Geckodriver

tests/DuskTestCase.php复制到您的应用后,您可以按需更新该类。

namespace Tests;

use Derekmd\Dusk\Concerns\TogglesHeadlessMode;
use Derekmd\Dusk\Firefox\SupportsFirefox;
use Facebook\WebDriver\Firefox\FirefoxOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Laravel\Dusk\TestCase as BaseTestCase;

abstract class DuskTestCase extends BaseTestCase
{
    // ...

    protected function driver()
    {
        $capabilities = DesiredCapabilities::firefox();

        $capabilities->getCapability(FirefoxOptions::CAPABILITY)
            ->addArguments($this->filterHeadlessArguments([
                '--headless',
                '--window-size=1920,1080',
            ]))
            ->setPreference('devtools.console.stdout.content', true);

        return RemoteWebDriver::create('https://:4444', $capabilities);
    }
}
  • 为了生成JavaScript错误的调试日志,Mozilla Firefox配置文件布尔标志devtools.console.stdout.content必须开启。
  • --headless在没有任何窗口的情况下运行测试,这对于持续集成很有用。移除此选项可以在测试运行时查看浏览器视口。
  • --window-size控制浏览器视口的宽度和高度。如果您的UI断言失败,元素可能不在屏幕上,您可能需要更改此设置。
  • $this->filterHeadlessArguments()调用允许在本地开发期间运行php artisan dusk --browse命令时移除--headless参数。这允许在Laravel Dusk测试运行时显示Mozilla Firefox浏览器窗口。当不使用命令行参数--browse时,仍然启用无头模式。

阅读Geckodriver使用文档以查看哪些选项可用。

同时运行Mozilla Firefox和Google Chrome

您可能希望同时在Mozilla Firefox和Google Chrome中运行测试,以检查您的应用程序中的功能一致性。此软件包支持一个--with-chrome选项,用于生成tests/DuskTestCase.php,以便在两个浏览器中运行。

php artisan dusk:install-firefox --with-chrome

在本地环境中选择所需的浏览器

Laravel Dusk命令默认将在Mozilla Firefox中运行测试

php artisan dusk

已添加一个新命令,使测试能在Google Chrome中运行

php artisan dusk:chrome

您也可以将PHPUnit参数传递给命令

php artisan dusk:chrome tests/Browser/HomepageTest.php --filter testFooter

此命令将在您的.env.dusk文件中追加环境变量DUSK_CHROME=1,并在测试完成后将其删除。

如果Laravel Dusk崩溃或您使用CTRL+C取消测试套件进程,您可能需要手动从.env.dusk文件中删除剩余的行DUSK_CHROME=1

在持续集成中选择所需的浏览器

当通过Chipper CI、CircleCI、Travis CI或Github Actions等工具运行自动化测试流程时,您可以设置一个作业运行Google Chrome,并为Mozilla Firefox设置第二个作业。可以跳过自定义Artisan命令,而是设置环境变量。配置了DUSK_CHROME=1的作业将运行Google Chrome。缺少环境变量的第二个作业默认为Mozilla Firefox。

与Laravel Sail一起运行

Laravel Sail是用于与Laravel应用程序的Docker开发环境交互的命令行界面。一旦在Sail的配置文件中添加了额外的Docker镜像,Laravel Dusk测试就可以在Mozilla Firefox中运行。

您必须取消注释并编辑docker-compose.yml文件中的".selenium"服务,以安装用于Selenium的独立Mozilla Firefox

version: '3'
services:
    laravel.test:
        # ....
        depends_on:
            - mysql
            - redis
            - selenium
    selenium:
        image: 'selenium/standalone-firefox'
        volumes:
            - '/dev/shm:/dev/shm'
        networks:
            - sail

仅使用Laravel Sail进行开发

如果您仅使用Laravel Sail进行开发,可能不需要此软件包

此软件包的解决方案超过90%集中在通过PHPUnit的事件钩子管理本地Geckodriver进程。Laravel Sail用Selenium服务器替换Chromedriver/Geckodriver,因此您在应用程序中所需的唯一自定义代码是Mozilla Firefox的WebDriver配置。将此driver()方法复制到您的应用程序的tests/DuskTestCase.php文件中。然后使用上述docker-compose.yml指令安装Docker镜像"selenium/standalone-firefox"。

将其他开发环境与Laravel Sail混合

对于在多个环境中(本地原生开发、Laravel Valet、Laravel Homestead、Laravel Sail)拥有开发团队的团队或使用无Docker的持续集成项目,此软件包将允许Laravel Dusk在任何这些环境中运行Mozilla Firefox。

使用sail命令安装软件包

./vendor/bin/sail composer require --dev derekmd/laravel-dusk-firefox
./vendor/bin/sail artisan dusk:install-firefox

这将在您的应用程序中复制一个配置了识别Laravel Sail环境变量的tests/DuskTestCase.php文件。当Sail未安装时,Laravel Dusk将按正常方式运行。

通过执行命令运行Laravel Dusk测试以在Mozilla Firefox中运行

./vendor/bin/sail dusk

未使用Laravel Sail的其他开发者可以执行常规Dusk命令

php artisan dusk

此配置仅允许使用Mozilla Firefox运行Dusk测试。要使命令php artisan dusk:chrome与"selenium/standalone-chrome"镜像一起工作,还需要进行额外的服务和sail.sh文件更改,这些更改超出了Laravel Sail 80%的使用案例。

开发

要运行测试套件,需要下载每个64位操作系统的Geckodriver二进制文件

composer download

或调用PHP脚本。是的,使用PHPUnit运行Artisan命令是一种黑客技巧。软件包开发!

./vendor/phpunit/phpunit/phpunit tests/DownloadBinaries.php

通过Composer在命令行中运行测试

composer test

或直接调用PHPUnit

./vendor/phpunit/phpunit/phpunit

常见问题解答

  1. 如何修复错误“Failed to connect to localhost port 4444: Connection refused”?

    默认情况下,Geckodriver在本地端口4444上运行。进程可能未启动。

    • 运行php artisan dusk:firefox-driver以确保下载Geckodriver二进制文件。
    • Geckodriver代理服务器可能已经运行,这可能在崩溃后发生。终止冲突进程(在Windows中为“结束任务”)并再次尝试运行php artisan dusk
    • 如果其他服务正在使用端口4444,打开tests/DuskTestCase.php并将driver()方法更改为配置其他端口号。
  2. 我的测试套件在Chromedriver下通过了100%的测试,但现在在Mozilla Firefox中失败了。我该如何修复我的测试?

    您可能会发现,在调用Laravel Dusk方法visit()或在不同网页间导航时,Mozilla Firefox更为易变。对于HTTP重定向和表单提交,您可能希望避免首先调用assertPathIs()assertPathIsNot()assertPathBeginsWith()方法。如需延迟测试直到下一个网页加载完成,等待元素方法,如waitForText()方法,是最适合的。当其他所有方法都失败时,可以通过添加尝试错误的pause($milliseconds)调用,使测试在所有环境中都是确定性的。

  3. 您能帮我让测试在Mozilla Firefox中运行吗?

    对不起,不行。这超出了本软件包的支持范围。您可以尝试Laravel社区支持渠道,例如https://laracasts.com/https://community.laravel.net.cn/论坛。

  4. 为什么保存的浏览器错误日志没有显示脚本警告,例如由于CORS(跨源资源共享)限制而无法加载.js文件?

    Chromedriver实现了Selenium的commands.GetLog端点,该端点提供了更广泛的测试反馈。不幸的是,此端点目前不是W3C WebDriver API的一部分,因此Geckodriver不支持它。

    这是Mozilla Firefox支持没有内置到官方Laravel Dusk软件包中的原因之一。

  5. 为什么运行命令php artisan dusk:install-firefoxphp artisan dusk:firefox-driver会返回这个错误信息?

    cURL错误60:SSL证书问题:无法获取本地颁发者证书(参见https://curl.haxx.se/libcurl/c/libcurl-errors.html

    PHP环境可能没有配置为处理SSL证书。

    a. 这两个命令支持--proxy--ssl-no-verify选项,用于控制下载Geckodriver二进制文件的cURL配置。--ssl-no-verify将跳过检查证书,但是:b. 要确保为域名https://github.com的SSL证书验证通过,php.ini应该配置PHP扩展openssl启用。如果找不到操作系统管理的证书存储,可以将php.ini文件更新为使用https://curl.se/docs/caextract.html配置一个.crt文件。

    [openssl]
    # Mac, Linux
    openssl.cafile="~/ca-bundle.crt"
    # Windows
    # openssl.cafile="C:\xampp\apache\bin\curl-ca-bundle.crt"
    
  6. 为什么每个测试用例都失败并显示这个错误信息?

    cUrl error (#28): Operation timed out after ... milliseconds with 0 bytes received`?
    

    Xdebug可能正在等待用户交互以从代码断点继续。应在php.ini中禁用PHP扩展Xdebug以运行浏览器测试。

贡献

在提交pull请求时

  1. 编写与Laravel生态系统相同的样式的新PHP代码和docblock。#NoTimeForTypehints
    • 运行命令./vendor/friendsofphp/php-cs-fixer/php-cs-fixer fix将自动纠正代码风格。
  2. 向测试套件添加用例以确保代码覆盖率永不降低。
  3. 请不要尝试支持除Chrome和Mozilla Firefox之外的更多浏览器stubs。

当这个软件包值得时,我会完成贡献指南。然而,我预计这个代码库的占地面积很小,因为它具有狭窄的关注点。

鸣谢

许可证

麻省理工学院许可证(MIT)。请参阅许可证文件获取更多信息。