Ein Browser -Test- und Web -Scraping -Bibliothek für PHP und Symfony
Panther ist eine bequeme eigenständige Bibliothek, um Websites zu kratzen und End-to-End-Tests mithilfe von echten Browsern durchzuführen.
Panther ist super mächtig. Es nutzt das Webdriver -Protokoll des W3C, um native Webbrowser wie Google Chrome und Firefox voranzutreiben.
Panther ist sehr einfach zu bedienen, da es Symfonys beliebtes Browserkit- und Domcrawler -APIs implementiert und alle Funktionen enthält, die Sie zum Testen Ihrer Apps benötigen. Es wird bekannt sein, wenn Sie jemals einen Funktionstest für eine Symfony -App erstellt haben: Da die API genau das gleiche ist! Denken Sie daran, dass Panther in jedem PHP -Projekt verwendet werden kann, da es sich um eine eigenständige Bibliothek handelt.
Panther findet automatisch Ihre lokale Installation von Chrome oder Firefox und startet sie, sodass Sie nichts anderes auf Ihrem Computer installieren müssen. Ein Selenium -Server wird nicht benötigt!
Im Testmodus startet Panther Ihre Anwendung automatisch über den integrierten PHP-Webserver. Sie können sich darauf konzentrieren, Ihre Tests oder Web-Scraping-Szenario zu schreiben, und Panther kümmert sich um alles andere.
Im Gegensatz zu Tests und Web -Scraping -Bibliotheken, an die Sie gewohnt sind, Panther:
Verwenden Sie einen Komponisten, um Panther in Ihrem Projekt zu installieren. Möglicherweise möchten Sie das Flag --dev
-Flag verwenden, wenn Sie Panther nur zum Testen verwenden möchten und nicht für Web -Scraping in einer Produktionsumgebung:
composer req symfony/panther
composer req --dev symfony/panther
Panther verwendet das Webdriver -Protokoll, um den Browser zu steuern, mit dem Websites kriechen.
Auf allen Systemen können Sie dbrekelmans/browser-driver-installer
verwenden, um Chromedriver und Geckodriver lokal zu installieren:
composer require --dev dbrekelmans/bdi
vendor/bin/bdi detect drivers
Panther erfasst und verwendet automatisch Fahrer, die im drivers/
Verzeichnis gespeichert sind.
Alternativ können Sie den Paketmanager Ihres Betriebssystems verwenden, um diese zu installieren.
Auf Ubuntu rennen Sie:
apt-get install chromium-chromedriver firefox-geckodriver
Auf dem Mac, mit Homebrew:
brew install chromedriver geckodriver
Unter Fenstern mit Schokoladen:
choco install chromedriver selenium-gecko-driver
Schließlich können Sie den manuell Chromedriver (für Chrom oder Chrom) und Geckodriver (für Firefox) herunterladen und sie überall in Ihren PATH
oder in das drivers/
Verzeichnis Ihres Projekts legen.
Wenn Sie Panther verwenden möchten, um Ihre Anwendung zu testen, empfehlen wir dringend, die Panther -Phpunit -Erweiterung zu registrieren. Diese Erweiterung ist zwar nicht streng obligatorisch, verbessert das Testerlebnis dramatisch, indem sie die Leistung steigert und den interaktiven Debugging -Modus verwenden kann.
Wenn Sie die Erweiterung in Verbindung mit der Umgebungsvariablen PANTHER_ERROR_SCREENSHOT_DIR
verwenden, erhalten Sie mit dem Panther -Client, das ausfällt, oder Fehler (nachdem der Client erstellt wurde) automatisch eine Screenshot, um das Debuggen zu unterstützen.
Um die Panther -Erweiterung zu registrieren, fügen Sie die folgenden Zeilen zu phpunit.xml.dist
hinzu:
<!-- phpunit.xml.dist -->
< extensions >
< extension class = " SymfonyComponentPantherServerExtension " />
</ extensions >
Ohne die Erweiterung wird der von Panther verwendete Webserver, der für die zu testende Anwendung verwendet wird, bei Bedarf gestartet und gestoppt, wenn tearDownAfterClass()
aufgerufen wird. Wenn die Erweiterung hingegen registriert ist, wird der Webserver erst nach dem allerletzten Test gestoppt.
<?php
use Symfony Component Panther Client ;
require __DIR__ . ' /vendor/autoload.php ' ; // Composer's autoloader
$ client = Client :: createChromeClient ();
// Or, if you care about the open web and prefer to use Firefox
$ client = Client :: createFirefoxClient ();
$ client -> request ( ' GET ' , ' https://api-platform.com ' ); // Yes, this website is 100% written in JavaScript
$ client -> clickLink ( ' Getting started ' );
// Wait for an element to be present in the DOM (even if hidden)
$ crawler = $ client -> waitFor ( ' #installing-the-framework ' );
// Alternatively, wait for an element to be visible
$ crawler = $ client -> waitForVisibility ( ' #installing-the-framework ' );
echo $ crawler -> filter ( ' #installing-the-framework ' )-> text ();
$ client -> takeScreenshot ( ' screen.png ' ); // Yeah, screenshot!
Mit der PantherTestCase
-Klasse können Sie problemlos E2E -Tests schreiben. Es startet Ihre App automatisch über den integrierten PHP-Webserver und lässt sie mit Panther kriechen. Um alle von Ihnen verwendeten Testwerkzeuge bereitzustellen, erweitert es TestCase
von Phpunit.
Wenn Sie eine Symfony -Anwendung testen, erweitert PantherTestCase
die WebTestCase
-Klasse automatisch. Dies bedeutet, dass Sie problemlos Funktionstests erstellen können, mit denen der Kernkern Ihrer Anwendung direkt ausgeführt und auf alle Ihre vorhandenen Dienste zugreifen kann. In diesem Fall können Sie alle von Symfony mit Panther bereitgestellten Crawler -Testbehauptungen verwenden.
<?php
namespace App Tests ;
use Symfony Component Panther PantherTestCase ;
class E2eTest extends PantherTestCase
{
public function testMyApp (): void
{
$ client = static :: createPantherClient (); // Your app is automatically started using the built-in web server
$ client -> request ( ' GET ' , ' /mypage ' );
// Use any PHPUnit assertion, including the ones provided by Symfony
$ this -> assertPageTitleContains ( ' My Title ' );
$ this -> assertSelectorTextContains ( ' #main ' , ' My body ' );
// Or the one provided by Panther
$ this -> assertSelectorIsEnabled ( ' .search ' );
$ this -> assertSelectorIsDisabled ( ' [type="submit"] ' );
$ this -> assertSelectorIsVisible ( ' .errors ' );
$ this -> assertSelectorIsNotVisible ( ' .loading ' );
$ this -> assertSelectorAttributeContains ( ' .price ' , ' data-old-price ' , ' 42 ' );
$ this -> assertSelectorAttributeNotContains ( ' .price ' , ' data-old-price ' , ' 36 ' );
// Use waitForX methods to wait until some asynchronous process finish
$ client -> waitFor ( ' .popin ' ); // wait for element to be attached to the DOM
$ client -> waitForStaleness ( ' .popin ' ); // wait for element to be removed from the DOM
$ client -> waitForVisibility ( ' .loader ' ); // wait for element of the DOM to become visible
$ client -> waitForInvisibility ( ' .loader ' ); // wait for element of the DOM to become hidden
$ client -> waitForElementToContain ( ' .total ' , ' 25 € ' ); // wait for text to be inserted in the element content
$ client -> waitForElementToNotContain ( ' .promotion ' , ' 5% ' ); // wait for text to be removed from the element content
$ client -> waitForEnabled ( ' [type="submit"] ' ); // wait for the button to become enabled
$ client -> waitForDisabled ( ' [type="submit"] ' ); // wait for the button to become disabled
$ client -> waitForAttributeToContain ( ' .price ' , ' data-old-price ' , ' 25 € ' ); // wait for the attribute to contain content
$ client -> waitForAttributeToNotContain ( ' .price ' , ' data-old-price ' , ' 25 € ' ); // wait for the attribute to not contain content
// Let's predict the future
$ this -> assertSelectorWillExist ( ' .popin ' ); // element will be attached to the DOM
$ this -> assertSelectorWillNotExist ( ' .popin ' ); // element will be removed from the DOM
$ this -> assertSelectorWillBeVisible ( ' .loader ' ); // element will be visible
$ this -> assertSelectorWillNotBeVisible ( ' .loader ' ); // element will not be visible
$ this -> assertSelectorWillContain ( ' .total ' , ' €25 ' ); // text will be inserted in the element content
$ this -> assertSelectorWillNotContain ( ' .promotion ' , ' 5% ' ); // text will be removed from the element content
$ this -> assertSelectorWillBeEnabled ( ' [type="submit"] ' ); // button will be enabled
$ this -> assertSelectorWillBeDisabled ( ' [type="submit"] ' ); // button will be disabled
$ this -> assertSelectorAttributeWillContain ( ' .price ' , ' data-old-price ' , ' €25 ' ); // attribute will contain content
$ this -> assertSelectorAttributeWillNotContain ( ' .price ' , ' data-old-price ' , ' €25 ' ); // attribute will not contain content
}
}
Um diesen Test durchzuführen:
bin/phpunit tests/E2eTest.php
Panther erhalten Sie außerdem sofortigen Zugriff auf andere browserkit-basierte Implementierungen von Client
und Crawler
. Im Gegensatz zu Panthers nativem Kunden unterstützen diese alternativen Clients JavaScript, CSS und Screenshot-Erfassungen nicht, aber sie sind superschnell !
Zwei alternative Kunden sind verfügbar:
WebTestCase
bereitgestellten Symfony -Kernel. Es ist der schnellste verfügbare Kunde, ist jedoch nur für Symfony -Apps verfügbar.Der unterhaltsame Teil ist, dass die 3 Clients genau dieselbe API implementieren, sodass Sie von einem zu einem anderen wechseln können, indem Sie die entsprechende Fabrikmethode aufrufen, was zu einem guten Kompromiss für jeden einzelnen Testfall führt (brauche ich JavaScript? Tun ich? Müssen Sie sich mit einem externen SSO -Server authentifizieren?
Hier erfahren Sie, wie Sie Instanzen dieser Kunden abrufen:
<?php
namespace App Tests ;
use Symfony Component Panther PantherTestCase ;
use Symfony Component Panther Client ;
class E2eTest extends PantherTestCase
{
public function testMyApp (): void
{
$ symfonyClient = static :: createClient (); // A cute kitty: Symfony's functional test tool
$ httpBrowserClient = static :: createHttpBrowserClient (); // An agile lynx: HttpBrowser
$ pantherClient = static :: createPantherClient (); // A majestic Panther
$ firefoxClient = static :: createPantherClient ([ ' browser ' => static :: FIREFOX ]); // A splendid Firefox
// Both HttpBrowser and Panther benefits from the built-in HTTP server
$ customChromeClient = Client :: createChromeClient ( null , null , [], ' https://example.com ' ); // Create a custom Chrome client
$ customFirefoxClient = Client :: createFirefoxClient ( null , null , [], ' https://example.com ' ); // Create a custom Firefox client
$ customSeleniumClient = Client :: createSeleniumClient ( ' http://127.0.0.1:4444/wd/hub ' , null , ' https://example.com ' ); // Create a custom Selenium client
// When initializing a custom client, the integrated web server IS NOT started automatically.
// Use PantherTestCase::startWebServer() or WebServerManager if you want to start it manually.
// enjoy the same API for the 3 felines
// $*client->request('GET', '...')
$ kernel = static :: createKernel (); // If you are testing a Symfony app, you also have access to the kernel
// ...
}
}
Panther bietet eine bequeme Möglichkeit, Anwendungen mit Echtzeitfunktionen zu testen, die Mercure, WebSocket und ähnliche Technologien verwenden.
PantherTestCase::createAdditionalPantherClient()
erstellt zusätzliche isolierte Browser, die miteinander interagieren können. Dies kann beispielsweise nützlich sein, um eine Chat -Anwendung zu testen, da mehrere Benutzer gleichzeitig verbunden sind:
<?php
use Symfony Component Panther PantherTestCase ;
class ChatTest extends PantherTestCase
{
public function testChat (): void
{
$ client1 = self :: createPantherClient ();
$ client1 -> request ( ' GET ' , ' /chat ' );
// Connect a 2nd user using an isolated browser and say hi!
$ client2 = self :: createAdditionalPantherClient ();
$ client2 -> request ( ' GET ' , ' /chat ' );
$ client2 -> submitForm ( ' Post message ' , [ ' message ' => ' Hi folks ? ' ]);
// Wait for the message to be received by the first client
$ client1 -> waitFor ( ' .message ' );
// Symfony Assertions are always executed in the **primary** browser
$ this -> assertSelectorTextContains ( ' .message ' , ' Hi folks ? ' );
}
}
Bei Bedarf können Sie Panther verwenden, um auf den Inhalt der Konsole zuzugreifen:
<?php
use Symfony Component Panther PantherTestCase ;
class ConsoleTest extends PantherTestCase
{
public function testConsole (): void
{
$ client = self :: createPantherClient (
[],
[],
[
' capabilities ' => [
' goog:loggingPrefs ' => [
' browser ' => ' ALL ' , // calls to console.* methods
' performance ' => ' ALL ' , // performance data
],
],
]
);
$ client -> request ( ' GET ' , ' / ' );
$ consoleLogs = $ client -> getWebDriver ()-> manage ()-> getLog ( ' browser ' ); // console logs
$ performanceLogs = $ client -> getWebDriver ()-> manage ()-> getLog ( ' performance ' ); // performance logs
}
}
Bei Bedarf können Sie die Argumente so konfigurieren, dass sie an den chromedriver
Binary geleitet werden:
<?php
use Symfony Component Panther PantherTestCase ;
class MyTest extends PantherTestCase
{
public function testLogging (): void
{
$ client = self :: createPantherClient (
[],
[],
[
' chromedriver_arguments ' => [
' --log-path=myfile.log ' ,
' --log-level=DEBUG '
],
]
);
$ client -> request ( ' GET ' , ' / ' );
}
}
Verwenden Sie die Client::ping()
-Methode, um zu überprüfen, ob die Webdriver-Verbindung weiterhin aktiv ist (nützlich für langlebige Aufgaben).
Da Panther die API der beliebten Bibliotheken implementiert, verfügt sie bereits über eine umfangreiche Dokumentation:
Client
-Klasse die Browserkit -DokumentationCrawler
-Klasse die Domcrawler -DokumentationDie folgenden Umgebungsvariablen können so eingestellt werden, dass das Verhalten eines Panthers geändert wird:
PANTHER_NO_HEADLESS
: Um den Kopflosenmodus des Browsers zu deaktivieren (Zeigt das Testfenster an, nützlich zum Debuggen)PANTHER_WEB_SERVER_DIR
: Um das Dokumentroot des Projekts zu ändern (Standard auf ./public/
, müssen relative Pfade nach ./
) beginnen .PANTHER_WEB_SERVER_PORT
: Um den Port des Webservers zu ändern (Standard auf 9080
)PANTHER_WEB_SERVER_ROUTER
: Verwenden eines Webserver -Router -Skripts, das zu Beginn jeder HTTP -Anforderung ausgeführt wirdPANTHER_EXTERNAL_BASE_URI
: Um einen externen Webserver zu verwenden (der PHP-integrierte Webserver wird nicht gestartet)PANTHER_APP_ENV
: Um die APP_ENV
-Variable zu überschreibenPANTHER_ERROR_SCREENSHOT_DIR
: Setzen Sie ein Basisverzeichnis für Ihre Fehler-/Fehler-Screenshots (z ./var/error-screenshots
).PANTHER_DEVTOOLS
: Um die Entwickler -Tools des Browsers umzuschalten (Standard enabled
, nützlich zum Debuggen)PANTHER_ERROR_SCREENSHOT_ATTACH
: Zum Hinzufügen von Screenshots, die oben erwähnt wurden Wenn Sie den Host und/oder den von dem integrierten Webserver verwendeten Port ändern möchten, übergeben Sie den hostname
und port
an den Parameter $options
der Methode createPantherClient()
:
// ...
$ client = self :: createPantherClient ([
' hostname ' => ' example.com ' , // Defaults to 127.0.0.1
' port ' => 8080 , // Defaults to 9080
]);
PANTHER_NO_SANDBOX
: Um Chromes Sandboxing zu deaktivieren (unsicher, aber Panther in Containern verwenden)PANTHER_CHROME_ARGUMENTS
: Anpassen von Chromargumenten. Sie müssen PANTHER_NO_HEADLESS
festlegen, um sie vollständig anzupassen.PANTHER_CHROME_BINARY
: Verwenden Sie ein anderes google-chrome
Binär PANTHER_FIREFOX_ARGUMENTS
: Anpassen von Firefox -Argumenten. Sie müssen PANTHER_NO_HEADLESS
festlegen, um sie vollständig anzupassen.PANTHER_FIREFOX_BINARY
: Verwenden Sie ein anderes firefox
-Binär Laut der Spezifikation geben Webdriver -Implementierungen standardmäßig nur den angezeigten Text zurück. Wenn Sie auf einem head
-Tag (wie title
) filtern, gibt der Methode text()
eine leere Zeichenfolge zurück. Verwenden Sie die Methode html()
, um den vollständigen Inhalt des Tags einschließlich des Tags selbst zu erhalten.
Panther kann nach einem Fehler in Ihren Testsuiten eine Pause machen. Es ist eine Pause, die für die Untersuchung des Problems über den Webbrowser sehr geschätzt wird. Um diesen Modus zu aktivieren, benötigen Sie die Option --debug
Phpunit ohne den Kopflosenmodus:
$ PANTHER_NO_HEADLESS=1 bin/phpunit --debug
Test 'AppAdminTest::testLogin' started
Error: something is wrong.
Press enter to continue...
Um den interaktiven Modus zu verwenden, muss die Phpunit -Erweiterung registriert werden.
Manchmal ist es zweckmäßig, eine vorhandene Webserverkonfiguration wiederzuverwenden, anstatt das integrierte PHP-Einsatz zu starten. Setzen Sie dazu die Option external_base_uri
:
<?php
namespace App Tests ;
use Symfony Component Panther PantherTestCase ;
class E2eTest extends PantherTestCase
{
public function testMyApp (): void
{
$ pantherClient = static :: createPantherClient ([ ' external_base_uri ' => ' https://localhost ' ]);
// the PHP integrated web server will not be started
}
}
Es kommt vor, dass Ihre PHP/Symfony -Anwendung möglicherweise mehrere verschiedene Domainnamen dienen.
Da Panther den Kunden zwischen Tests zur Verbesserung der Leistungen im Speicher speichert, müssen Sie Ihre Tests in separaten Prozessen ausführen, wenn Sie mehrere Tests mit Panther für verschiedene Domainnamen schreiben.
Dazu können Sie die native @runInSeparateProcess
-Phpunit -Annotation verwenden.
ℹ Hinweis: Es ist wirklich bequem, die Option external_base_uri
zu verwenden und Ihren eigenen Webserver im Hintergrund zu starten, da Panther Ihren Server nicht für jeden Test starten und stoppen muss. Symfony CLI kann eine schnelle und einfache Möglichkeit sein, dies zu tun.
Hier ist ein Beispiel, bei dem die Option external_base_uri
verwendet wird, um den vom Client verwendeten Domänennamen zu bestimmen:
<?php
namespace App Tests ;
use Symfony Component Panther PantherTestCase ;
class FirstDomainTest extends PantherTestCase
{
/**
* @runInSeparateProcess
*/
public function testMyApp (): void
{
$ pantherClient = static :: createPantherClient ([
' external_base_uri ' => ' http://mydomain.localhost:8000 ' ,
]);
// Your tests
}
}
<?php
namespace App Tests ;
use Symfony Component Panther PantherTestCase ;
class SecondDomainTest extends PantherTestCase
{
/**
* @runInSeparateProcess
*/
public function testMyApp (): void
{
$ pantherClient = static :: createPantherClient ([
' external_base_uri ' => ' http://anotherdomain.localhost:8000 ' ,
]);
// Your tests
}
}
Um einen Proxy-Server zu verwenden, legen Sie die folgende Umgebungsvariable fest: PANTHER_CHROME_ARGUMENTS='--proxy-server=socks://127.0.0.1:9050'
Um Chrom zu zwingen PANTHER_CHROME_ARGUMENTS='--ignore-certificate-errors'
ungültige und selbstsignierte Zertifikate zu akzeptieren, setzen Crawler).
Für Firefox instanziieren Sie den Kunden wie folgt:
$ client = Client :: createFirefoxClient ( null , null , [ ' capabilities ' => [ ' acceptInsecureCerts ' => true ]]);
Hier ist ein minimales Docker -Bild, das Panther mit Chrom und Firefox ausführen kann:
FROM php:alpine
# Chromium and ChromeDriver
ENV PANTHER_NO_SANDBOX 1
# Not mandatory, but recommended
ENV PANTHER_CHROME_ARGUMENTS= '--disable-dev-shm-usage'
RUN apk add --no-cache chromium chromium-chromedriver
# Firefox and GeckoDriver (optional)
ARG GECKODRIVER_VERSION=0.28.0
RUN apk add --no-cache firefox libzip-dev;
docker-php-ext-install zip
RUN wget -q https://github.com/mozilla/geckodriver/releases/download/v$GECKODRIVER_VERSION/geckodriver-v$GECKODRIVER_VERSION-linux64.tar.gz;
tar -zxf geckodriver-v$GECKODRIVER_VERSION-linux64.tar.gz -C /usr/bin;
rm geckodriver-v$GECKODRIVER_VERSION-linux64.tar.gz
Bauen Sie es mit docker build . -t myproject
Laufen Sie es mit docker run -it -v "$PWD":/srv/myproject -w /srv/myproject myproject bin/phpunit
Panther arbeitet mit Github -Aktionen außerhalb der Box. Hier finden Sie eine minimale .github/workflows/panther.yml
-Datei, um Panther -Tests durchzuführen:
name : Run Panther tests
on : [ push, pull_request ]
jobs :
tests :
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v2
- name : Install dependencies
run : composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name : Run test suite
run : bin/phpunit
Panther arbeitet mit Travis CI, wenn Sie das Chrom -Addon hinzufügen. Hier ist eine minimale .travis.yml
-Datei, um Panther -Tests durchzuführen:
language : php
addons :
# If you don't use Chrome, or Firefox, remove the corresponding line
chrome : stable
firefox : latest
php :
- 8.0
script :
- bin/phpunit
Hier ist eine minimale .gitlab-ci.yml
Datei, um Panther-Tests mit GitLab CI durchzuführen:
image : ubuntu
before_script :
- apt-get update
- apt-get install software-properties-common -y
- ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
- apt-get install curl wget php php-cli php7.4 php7.4-common php7.4-curl php7.4-intl php7.4-xml php7.4-opcache php7.4-mbstring php7.4-zip libfontconfig1 fontconfig libxrender-dev libfreetype6 libxrender1 zlib1g-dev xvfb chromium-chromedriver firefox-geckodriver -y -qq
- export PANTHER_NO_SANDBOX=1
- export PANTHER_WEB_SERVER_PORT=9080
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php --install-dir=/usr/local/bin --filename=composer
- php -r "unlink('composer-setup.php');"
- composer install
test :
script :
- bin/phpunit
Panther arbeitet mit Appveyor, solange Google Chrome installiert ist. Hier ist eine minimale appveyor.yml
-Datei, um Panther -Tests durchzuführen:
build : false
platform : x86
clone_folder : c:projectsmyproject
cache :
- ' %LOCALAPPDATA%Composerfiles '
install :
- ps : Set-Service wuauserv -StartupType Manual
- cinst -y php composer googlechrome chromedriver firfox selenium-gecko-driver
- refreshenv
- cd c:toolsphp80
- copy php.ini-production php.ini /Y
- echo date.timezone="UTC" >> php.ini
- echo extension_dir=ext >> php.ini
- echo extension=php_openssl.dll >> php.ini
- echo extension=php_mbstring.dll >> php.ini
- echo extension=php_curl.dll >> php.ini
- echo memory_limit=3G >> php.ini
- cd %APPVEYOR_BUILD_FOLDER%
- composer install --no-interaction --no-progress
test_script :
- cd %APPVEYOR_BUILD_FOLDER%
- php binphpunit
Wenn Sie Panther mit anderen Testwerkzeugen wie liipfunktionalTestBundle verwenden möchten oder wenn Sie nur eine andere Basisklasse verwenden müssen, hat Panther Sie abgedeckt. Es bietet Ihnen die SymfonyComponentPantherPantherTestCaseTrait
und Sie können es verwenden, um Ihre vorhandene Test-Infrastruktur mit einer gewissen Panther-Großzügigkeit zu verbessern:
<?php
namespace App Tests Controller ;
use Liip FunctionalTestBundle Test WebTestCase ;
use Symfony Component Panther PantherTestCaseTrait ;
class DefaultControllerTest extends WebTestCase
{
use PantherTestCaseTrait ; // this is the magic. Panther is now available.
public function testWithFixtures (): void
{
$ this -> loadFixtures ([]); // load your fixtures
$ client = self :: createPantherClient (); // create your panther client
$ client -> request ( ' GET ' , ' / ' );
}
}
Die folgenden Funktionen werden derzeit nicht unterstützt:
DOMElement
zurückgeben (weil diese Bibliothek interne WebDriverElement
verwendet)Pull -Anfragen sind herzlich eingeladen, die verbleibenden Lücken zu füllen!
Wenn Sie Bootstrap 5 verwenden, haben Sie möglicherweise ein Problem mit dem Test. Bootstrap 5 implementiert einen Scrolling -Effekt, der Panther in die Irre führt.
Um dies zu beheben, empfehlen wir Ihnen, diesen Effekt zu deaktivieren, indem wir die Bootstrap 5 $ enable-Smooth-Scroll- Variable in Ihrer Style-Datei auf False festlegen.
$enable-smooth-scroll : false;
Viele der wilden Katzenarten sind stark bedroht. Wenn Ihnen diese Software gefällt, speichern Sie die (echten) Panthers, indem Sie an die Panthera -Organisation spenden.
Erstellt von Kévin Dunglas. Gesponsert von les-tilleuls.coop.
Panther ist auf dem PHP Webdriver und mehreren anderen Foss -Bibliotheken aufgebaut. Es wurde von Nightwatch.js, einem Webdriver-basierten Test-Tool für JavaScript, inspiriert.