robertfausk / behat-panther-extension
Symfony Panther 扩展,用于 Behat
v1.1.3
2024-05-07 07:14 UTC
Requires
- php: >=7.2
- behat/behat: ^3.0.5
- friends-of-behat/mink-extension: ^2.3.0
- robertfausk/mink-panther-driver: ^1.0
- symfony/config: ^3.4|^4.0|^5.0|^6.0|^7.0
Requires (Dev)
- g1a/composer-test-scenarios: ^3.0
- matthiasnoback/symfony-config-test: ^4.1|^5.1
- phpunit/phpunit: ~7.5|~9.3
- roave/security-advisories: dev-master
README
Symfony Panther 扩展,用于 Behat
安装
composer require --dev robertfausk/behat-panther-extension
使用示例
- 将
Robertfausk\Behat\PantherExtension: ~
添加到您的 behat.yml 文件中。 - 在
Behat\MinkExtension
中使用panther
会话。 - 默认情况下,该扩展将使用
symfony/panther
的选项。关于此,请参阅PantherTestCaseTrait::$defaultOptions
。 - 以下是一些使用 mink-panther-driver 的所有会话的示例
# in behat.yml extensions: Robertfausk\Behat\PantherExtension: ~ # no configuration here Behat\MinkExtension: javascript_session: javascript_chrome sessions: default: panther: ~ javascript: panther: options: ~ javascript_chrome: panther: options: browser: 'chrome' webServerDir: '%paths.base%/public' # your custom public dir javascript_firefox: panther: options: browser: 'firefox' javascript_with_all_options: panther: options: env: APP_ENV: 'dev' hostname: '127.0.0.1' kernel_options: ~ # unused by behat-panther-extension cause it does not extend KernelTestCase manager_options: connection_timeout_in_ms: 5000 request_timeout_in_ms: 120000
如何传递参数到 ChromeDriver 二进制文件的示例
另请参阅 https://chromedriver.chromium.org/logging
# in behat.yml enable logging extensions: Robertfausk\Behat\PantherExtension: ~ Behat\MinkExtension: javascript_session: javascript sessions: javascript: panther: manager_options: chromedriver_arguments: - --log-path=/var/www/html/chromedriver.log - --verbose
如何测试已下载文件的示例
# in behat.yml ensure that chrome saves files to the destination you want extensions: Robertfausk\Behat\PantherExtension: ~ Behat\MinkExtension: javascript_session: javascript files_path: '%paths.base%/tests/files' sessions: javascript: panther: manager_options: capabilities: goog:chromeOptions: prefs: download.default_directory: '/var/www/html/tests/files/Downloads'
# acme_download.feature Feature: Acme files can be downloaded Background: Given there is no file in download directory # additionally setup your database entries etc. if needed @javascript Scenario: As an user with role Admin i can download an existing acme file Given I am authenticated as "admin@acme.de" And I am on "/acme-file-list" Then I wait for "acme.pdf" to appear When I click on test element "button-acme-download" Then I can find file "acme.pdf" in download directory
<?php #AcmeContext.php use Assert\Assertion; use Behat\Mink\Element\NodeElement; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; /** * @When /^I click on test element "([^"]*)"$/ * * @param string $locator */ public function iClickOnTestElement(string $locator): void { $btn = $this->getTestElement($locator); $btn->click(); } /** * @Given /^there is no file in download directory$/ */ public function thereIsNoFileinDownloadDirectory(): void { $finder = new Finder(); $fs = new Filesystem(); $fs->remove($finder->in($this->getDownloadDirectory())->files()); } /** * @Then /^I can find file "([^"]*)" in download directory$/ */ public function iCanFindFileInDownloadDirectory($filename) { $fs = new Filesystem(); $path = \sprintf('%s%s%s', $this->getDownloadDirectory(), DIRECTORY_SEPARATOR, $filename); $this->spin( static function () use ($fs, $path): void { $isFileExisting = $fs->exists($path); Assertion::true($isFileExisting); }, ); Assertion::true($fs->exists($path)); } private function getDownloadDirectory(): string { return \sprintf('%s%sDownloads', $this->getMinkParameter('files_path'), DIRECTORY_SEPARATOR); } private function getTestElement(string $dataTestLocator, int $tries = 25): NodeElement { return $this->getNodeElement("[data-test='$dataTestLocator']", $tries); } private function spin(\Closure $closure, ?int $tries = 25): ?NodeElement { for ($i = 0; $i <= $tries; $i++) { try { return $closure(); } catch (\Throwable $e) { if ($i === $tries) { throw $e; } } \usleep(100000); // 100 milliseconds } }
如何升级?
有关详细信息,请参阅 CHANGELOG。
如何贡献?
使用您选择的 php 版本启动 docker-compose。目前可以通过 docker-compose 使用以下 php 版本:php7.2
、php7.3
、php7.4
、php8.0
、php8.1
、php8.2
和 php8.3
。
例如,您可以启动一个容器如下
docker-compose up php8.2
升级场景锁文件
docker-compose run php8.2 composer update
运行 phpunit 测试
docker-compose run php8.2 vendor/bin/phpunit
如果您想一次性启动所有容器并在后台运行,请运行以下命令
docker-compose up -d php7.2
docker-compose up -d php7.3
docker-compose up -d php7.4
docker-compose up -d php8.0
docker-compose up -d php8.1
docker-compose up -d php8.2
docker-compose up -d php8.3
如果您想执行 symfony6
和 php8.2
场景的测试,请运行以下命令
docker-compose run php8.2 composer scenario symfony6
docker-compose run php8.2 vendor/bin/bdi detect drivers
docker-compose run php8.2 vendor/bin/behat --config=tests/Behat/behat.yml
docker-compose run php8.2 vendor/bin/phpunit
或者,如果您想执行 symfony7
和 php8.3
场景的测试,请运行以下命令
docker-compose run php8.3 composer scenario symfony7
docker-compose run php8.3 vendor/bin/bdi detect drivers
docker-compose run php8.3 vendor/bin/behat --config=tests/Behat/behat.yml
docker-compose run php8.3 vendor/bin/phpunit
有关场景的更多信息,请参阅 https://github.com/g1a/composer-test-scenarios
鸣谢
由 Robert Freigang 创建 robertfausk。
BehatPantherExtension 是基于 symfony/panther 和 robertfausk/mink-panther-driver 构建的。它与 Behat 和 Mink 一起使用。