derekmd / laravel-dusk-firefox
在Firefox浏览器中运行Laravel Dusk测试
Requires
- php: ^7.2|^8.0
- guzzlehttp/guzzle: ^6.0|^7.0
- laravel/dusk: ^6.0|^7.0
- php-webdriver/webdriver: ^1.11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^6.25|^7.0
- phpunit/phpunit: ^9.5.10
README
此包可以使Laravel Dusk浏览器测试在Mozilla Firefox中运行。而不是使用Chromedriver,Laravel应用测试将被发送到Firefox的Geckodriver代理服务器。
- 功能
- 要求
- 安装
- 更新Geckodriver
- 配置Geckodriver
- 同时运行Mozilla Firefox和Google Chrome
- 与Laravel Sail一起运行
- 仅使用Laravel Sail进行开发
- 将其他开发环境与Laravel Sail混合
- 开发
- 常见问题解答
- 贡献
- 鸣谢
- 许可证
功能
- 下载适用于您的操作系统的最新稳定版Geckodriver二进制文件。
- 处理Geckodriver代理服务器进程的启动和关闭的自动化。
- 当测试失败时捕获Mozilla Firefox浏览器截图。
- 当发生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
常见问题解答
-
如何修复错误“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()
方法更改为配置其他端口号。
- 运行
-
我的测试套件在Chromedriver下通过了100%的测试,但现在在Mozilla Firefox中失败了。我该如何修复我的测试?
您可能会发现,在调用Laravel Dusk方法
visit()
或在不同网页间导航时,Mozilla Firefox更为易变。对于HTTP重定向和表单提交,您可能希望避免首先调用assertPathIs()
、assertPathIsNot()
或assertPathBeginsWith()
方法。如需延迟测试直到下一个网页加载完成,等待元素方法,如waitForText()
方法,是最适合的。当其他所有方法都失败时,可以通过添加尝试错误的pause($milliseconds)
调用,使测试在所有环境中都是确定性的。 -
您能帮我让测试在Mozilla Firefox中运行吗?
对不起,不行。这超出了本软件包的支持范围。您可以尝试Laravel社区支持渠道,例如https://laracasts.com/和https://community.laravel.net.cn/论坛。
-
为什么保存的浏览器错误日志没有显示脚本警告,例如由于CORS(跨源资源共享)限制而无法加载.js文件?
Chromedriver实现了Selenium的
commands.GetLog
端点,该端点提供了更广泛的测试反馈。不幸的是,此端点目前不是W3C WebDriver API的一部分,因此Geckodriver不支持它。这是Mozilla Firefox支持没有内置到官方Laravel Dusk软件包中的原因之一。
-
为什么运行命令
php artisan dusk:install-firefox
或php 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"
-
为什么每个测试用例都失败并显示这个错误信息?
cUrl error (#28): Operation timed out after ... milliseconds with 0 bytes received`?
Xdebug可能正在等待用户交互以从代码断点继续。应在php.ini中禁用PHP扩展Xdebug以运行浏览器测试。
贡献
在提交pull请求时
- 编写与Laravel生态系统相同的样式的新PHP代码和docblock。#NoTimeForTypehints
- 运行命令
./vendor/friendsofphp/php-cs-fixer/php-cs-fixer fix
将自动纠正代码风格。
- 运行命令
- 向测试套件添加用例以确保代码覆盖率永不降低。
- 请不要尝试支持除Chrome和Mozilla Firefox之外的更多浏览器stubs。
当这个软件包值得时,我会完成贡献指南。然而,我预计这个代码库的占地面积很小,因为它具有狭窄的关注点。
鸣谢
- Derek MacDonald
- Jonas Staudenmeir,PHP类
FirefoxDriverCommand
基于他在Laravel Dusk第三方软件包"staudenmeir/dusk-updater"中的代理下载。 - 所有贡献者
许可证
麻省理工学院许可证(MIT)。请参阅许可证文件获取更多信息。