robertfausk/behat-panther-extension

Symfony Panther 扩展,用于 Behat

安装次数: 515,860

依赖者: 33

建议者: 0

安全性: 0

星标: 30

关注者: 2

分支: 5

开放问题: 2

类型:behat-extension

v1.1.3 2024-05-07 07:14 UTC

This package is auto-updated.

Last update: 2024-09-07 19:03:39 UTC


README

Latest Stable Version Latest Unstable Version Total Downloads Monhtly Downloads Daily Downloads Tests Scrutinizer Quality Score Code Coverage Software License PHP Version Require Open Issues Closed Issues Contributors Contributors Dependents

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.2php7.3php7.4php8.0php8.1php8.2php8.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

如果您想执行 symfony6php8.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

或者,如果您想执行 symfony7php8.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/pantherrobertfausk/mink-panther-driver 构建的。它与 Behat 和 Mink 一起使用。