Perpustakaan Pengujian dan Pengikisan Web Browser untuk PHP dan Symfony
Panther adalah perpustakaan mandiri yang nyaman untuk mengikis situs web dan menjalankan tes ujung ke ujung menggunakan browser nyata .
Panther sangat kuat. Ini memanfaatkan protokol Webdriver W3C untuk mengendarai browser web asli seperti Google Chrome dan Firefox.
Panther sangat mudah digunakan, karena mengimplementasikan browserkit populer Symfony dan API Domcrawler, dan berisi semua fitur yang Anda butuhkan untuk menguji aplikasi Anda. Ini akan terdengar akrab jika Anda pernah membuat tes fungsional untuk aplikasi Symfony: karena API persis sama! Perlu diingat bahwa Panther dapat digunakan dalam setiap proyek PHP, karena merupakan perpustakaan mandiri.
Panther secara otomatis menemukan instalasi lokal Chrome atau Firefox dan meluncurkannya, jadi Anda tidak perlu menginstal apa pun di komputer Anda, server Selenium tidak diperlukan!
Dalam mode uji, Panther secara otomatis memulai aplikasi Anda menggunakan server web built-in PHP. Anda dapat fokus pada penulisan tes atau skenario gacanan web dan Panther akan mengurus yang lainnya.
Tidak seperti pengujian dan perpustakaan pengikisan web yang biasa Anda lakukan, Panther:
Gunakan komposer untuk menginstal Panther di proyek Anda. Anda mungkin ingin menggunakan bendera --dev
jika Anda ingin menggunakan Panther hanya untuk pengujian dan bukan untuk mengikis web di lingkungan produksi:
composer req symfony/panther
composer req --dev symfony/panther
Panther menggunakan protokol WebDriver untuk mengontrol browser yang digunakan untuk merangkak situs web.
Di semua sistem, Anda dapat menggunakan dbrekelmans/browser-driver-installer
untuk menginstal Chromedriver dan Geckodriver secara lokal:
composer require --dev dbrekelmans/bdi
vendor/bin/bdi detect drivers
Panther akan mendeteksi dan menggunakan driver secara otomatis yang disimpan di drivers/
direktori.
Atau, Anda dapat menggunakan manajer paket sistem operasi Anda untuk menginstalnya.
Di Ubuntu, jalankan:
apt-get install chromium-chromedriver firefox-geckodriver
Di Mac, menggunakan Homebrew:
brew install chromedriver geckodriver
Di jendela, menggunakan cokelat:
choco install chromedriver selenium-gecko-driver
Akhirnya, Anda dapat mengunduh Chromedriver secara manual (untuk kromium atau krom) dan tokek (untuk Firefox) dan meletakkannya di mana saja di PATH
Anda atau di drivers/
direktori proyek Anda.
Jika Anda bermaksud menggunakan Panther untuk menguji aplikasi Anda, kami sangat menyarankan untuk mendaftarkan ekstensi Panther Phpunit. Meskipun tidak sepenuhnya wajib, ekstensi ini secara dramatis meningkatkan pengalaman pengujian dengan meningkatkan kinerja dan memungkinkan untuk menggunakan mode debugging interaktif.
Saat menggunakan ekstensi bersama dengan variabel lingkungan PANTHER_ERROR_SCREENSHOT_DIR
, tes menggunakan klien Panther yang gagal atau kesalahan (setelah klien dibuat) akan secara otomatis mendapatkan tangkapan layar yang diambil untuk membantu debugging.
Untuk mendaftarkan ekstensi Panther, tambahkan baris berikut ke phpunit.xml.dist
:
<!-- phpunit.xml.dist -->
< extensions >
< extension class = " SymfonyComponentPantherServerExtension " />
</ extensions >
Tanpa ekstensi, server web yang digunakan oleh Panther untuk melayani aplikasi yang diuji dimulai sesuai permintaan dan berhenti ketika tearDownAfterClass()
dipanggil. Di sisi lain, ketika ekstensi terdaftar, server web akan dihentikan hanya setelah tes terakhir.
<?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!
Kelas PantherTestCase
memungkinkan Anda untuk dengan mudah menulis tes E2E. Secara otomatis memulai aplikasi Anda menggunakan server web php bawaan dan membiarkan Anda merangkak menggunakan Panther. Untuk menyediakan semua alat pengujian yang biasa Anda lakukan, ini memperluas TestCase
Phpunit.
Jika Anda menguji aplikasi Symfony, PantherTestCase
secara otomatis memperluas kelas WebTestCase
. Ini berarti Anda dapat dengan mudah membuat tes fungsional, yang dapat secara langsung menjalankan kernel aplikasi Anda dan mengakses semua layanan Anda yang ada. Dalam hal ini, Anda dapat menggunakan semua pernyataan tes crawler yang disediakan oleh Symfony dengan Panther.
<?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
}
}
Untuk menjalankan tes ini:
bin/phpunit tests/E2eTest.php
Panther juga memberi Anda akses instan ke implementasi Client
dan Crawler
berbasis browserkit lainnya. Tidak seperti klien asli Panther, klien alternatif ini tidak mendukung JavaScript, CSS, dan tangkapan layar, tetapi mereka sangat cepat !
Dua klien alternatif tersedia:
WebTestCase
. Ini adalah klien tercepat yang tersedia, tetapi hanya tersedia untuk aplikasi Symfony.Bagian yang menyenangkan adalah bahwa 3 klien menerapkan API yang sama persis, sehingga Anda dapat beralih dari satu ke yang lain hanya dengan memanggil metode pabrik yang sesuai, menghasilkan pertukaran yang baik untuk setiap kasus uji tunggal (apakah saya memerlukan javascript? Apakah saya Perlu mengautentikasi dengan server SSO eksternal?
Berikut adalah cara mengambil contoh klien ini:
<?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 menyediakan cara yang nyaman untuk menguji aplikasi dengan kemampuan real-time yang menggunakan Mercure, Websocket, dan teknologi serupa.
PantherTestCase::createAdditionalPantherClient()
menciptakan browser tambahan yang terisolasi yang dapat berinteraksi satu sama lain. Misalnya, ini dapat bermanfaat untuk menguji aplikasi obrolan yang memiliki beberapa pengguna terhubung secara bersamaan:
<?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 ? ' );
}
}
Jika perlu, Anda dapat menggunakan Panther untuk mengakses konten konsol:
<?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
}
}
Jika diperlukan, Anda dapat mengonfigurasi argumen untuk diteruskan ke biner chromedriver
:
<?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 ' , ' / ' );
}
}
Gunakan metode Client::ping()
untuk memeriksa apakah koneksi webdriver masih aktif (berguna untuk tugas yang sudah berjalan lama).
Karena Panther mengimplementasikan API perpustakaan populer, ia sudah memiliki dokumentasi yang luas:
Client
, baca dokumentasi BrowserKitCrawler
, baca dokumentasi DomcrawlerVariabel lingkungan berikut dapat diatur untuk mengubah beberapa perilaku Panther:
PANTHER_NO_HEADLESS
: Untuk menonaktifkan mode tanpa kepala browser (akan menampilkan jendela pengujian, berguna untuk debug)PANTHER_WEB_SERVER_DIR
: Untuk mengubah root dokumen proyek (default ke ./public/
, jalur relatif harus dimulai dengan ./
)PANTHER_WEB_SERVER_PORT
: Untuk mengubah port server web (default ke 9080
)PANTHER_WEB_SERVER_ROUTER
: untuk menggunakan skrip router server web yang dijalankan pada awal setiap permintaan httpPANTHER_EXTERNAL_BASE_URI
: Untuk menggunakan server web eksternal (server web built-in php tidak akan dimulai)PANTHER_APP_ENV
: Untuk mengganti variabel APP_ENV
yang diteruskan ke server web yang menjalankan aplikasi phpPANTHER_ERROR_SCREENSHOT_DIR
: Untuk mengatur direktori dasar untuk tangkapan layar kegagalan/kesalahan Anda (mis ./var/error-screenshots
PANTHER_DEVTOOLS
: Untuk beralih alat dev browser ( enabled
default, berguna untuk debug)PANTHER_ERROR_SCREENSHOT_ATTACH
: Untuk menambahkan tangkapan layar yang disebutkan di atas untuk menguji output dalam format lampiran junit Jika Anda ingin mengubah host dan/atau port yang digunakan oleh server web bawaan, lewati hostname
dan port
ke parameter $options
dari metode createPantherClient()
:
// ...
$ client = self :: createPantherClient ([
' hostname ' => ' example.com ' , // Defaults to 127.0.0.1
' port ' => 8080 , // Defaults to 9080
]);
PANTHER_NO_SANDBOX
: Untuk menonaktifkan Sandboxing Chrome (tidak aman, tetapi memungkinkan untuk menggunakan Panther dalam wadah)PANTHER_CHROME_ARGUMENTS
: Untuk menyesuaikan argumen chrome. Anda perlu mengatur PANTHER_NO_HEADLESS
untuk sepenuhnya disesuaikan.PANTHER_CHROME_BINARY
: untuk menggunakan biner google-chrome
lainnya PANTHER_FIREFOX_ARGUMENTS
: Untuk menyesuaikan argumen Firefox. Anda perlu mengatur PANTHER_NO_HEADLESS
untuk sepenuhnya disesuaikan.PANTHER_FIREFOX_BINARY
: untuk menggunakan biner firefox
lainnya Menurut Spec, implementasi WebDriver hanya mengembalikan teks yang ditampilkan secara default. Saat Anda memfilter pada tag head
(seperti title
), text()
mengembalikan string kosong. Gunakan metode html()
untuk mendapatkan konten lengkap tag, termasuk tag itu sendiri.
Panther dapat membuat jeda di suite tes Anda setelah kegagalan. Ini adalah waktu istirahat yang sangat dihargai untuk menyelidiki masalah melalui browser web. Untuk mengaktifkan mode ini, Anda memerlukan opsi --debug
phpunit tanpa mode tanpa kepala:
$ PANTHER_NO_HEADLESS=1 bin/phpunit --debug
Test 'AppAdminTest::testLogin' started
Error: something is wrong.
Press enter to continue...
Untuk menggunakan mode interaktif, ekstensi phPunit harus didaftarkan.
Terkadang, lebih mudah untuk menggunakan kembali konfigurasi server web yang ada alih-alih memulai php bawaan bawaan. Untuk melakukannya, atur opsi 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
}
}
Kebetulan aplikasi PHP/Symfony Anda dapat melayani beberapa nama domain yang berbeda.
Karena Panther menyimpan klien dalam memori antara tes untuk meningkatkan kinerja, Anda harus menjalankan tes Anda dalam proses terpisah jika Anda menulis beberapa tes menggunakan Panther untuk nama domain yang berbeda.
Untuk melakukannya, Anda dapat menggunakan anotasi phpunit @runInSeparateProcess
.
ℹ Catatan: Sangat nyaman untuk menggunakan opsi external_base_uri
dan memulai server web Anda sendiri di latar belakang, karena Panther tidak perlu memulai dan menghentikan server Anda pada setiap tes. Symfony Cli bisa menjadi cara cepat dan mudah untuk melakukannya.
Berikut adalah contoh menggunakan opsi external_base_uri
untuk menentukan nama domain yang digunakan oleh klien:
<?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
}
}
Untuk menggunakan server proxy, atur variabel lingkungan berikut: PANTHER_CHROME_ARGUMENTS='--proxy-server=socks://127.0.0.1:9050'
To force Chrome to accept invalid and self-signed certificates, set the following environment variable: PANTHER_CHROME_ARGUMENTS='--ignore-certificate-errors'
This option is insecure , use it only for testing in development environments, never in production (eg for web crawler).
Untuk Firefox, instantiate klien seperti ini:
$ client = Client :: createFirefoxClient ( null , null , [ ' capabilities ' => [ ' acceptInsecureCerts ' => true ]]);
Berikut adalah gambar Docker minimal yang dapat menjalankan Panther dengan Chrome dan Firefox:
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
Bangun dengan docker build . -t myproject
run dengan docker run -it -v "$PWD":/srv/myproject -w /srv/myproject myproject bin/phpunit
Panther bekerja di luar kotak dengan tindakan GitHub. Berikut adalah file .github/workflows/panther.yml
minimal untuk menjalankan tes Panther:
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 akan bekerja di luar kotak dengan Travis CI jika Anda menambahkan addon chrome. Berikut adalah file .travis.yml
minimal untuk menjalankan tes Panther:
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
Berikut adalah file .gitlab-ci.yml
minimal untuk menjalankan tes Panther dengan gitlab ci:
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 akan bekerja di luar kotak dengan Appveyor selama Google Chrome diinstal. Berikut adalah file appveyor.yml
minimal untuk menjalankan tes Panther:
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
Jika Anda ingin menggunakan Panther dengan alat pengujian lain seperti LiipFunctionalTestBundle atau jika Anda hanya perlu menggunakan kelas dasar yang berbeda, Panther telah membuat Anda tertutup. Ini memberi Anda SymfonyComponentPantherPantherTestCaseTrait
dan Anda dapat menggunakannya untuk meningkatkan tes-infrastruktur yang ada dengan beberapa kedahsyatan Panther:
<?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 ' , ' / ' );
}
}
Fitur -fitur berikut saat ini tidak didukung:
DOMElement
(karena perpustakaan ini menggunakan WebDriverElement
secara internal)Permintaan tarik dipersilakan untuk mengisi celah yang tersisa!
Jika Anda menggunakan Bootstrap 5, maka Anda mungkin memiliki masalah dengan pengujian. Bootstrap 5 mengimplementasikan efek gulir, yang cenderung menyesatkan Panther.
Untuk memperbaikinya, kami menyarankan Anda untuk menonaktifkan efek ini dengan mengatur variabel bootstrap 5 $ enable-smooth-scroll menjadi false dalam file gaya Anda.
$enable-smooth-scroll : false;
Banyak spesies kucing liar sangat terancam. Jika Anda menyukai perangkat lunak ini, bantu menyimpan Panthers (nyata) dengan menyumbang ke organisasi Panthera.
Dibuat oleh Kévin Dunglas. Disponsori oleh les-tilleuls.coop.
Panther dibangun di atas Webdriver PHP dan beberapa perpustakaan FOSS lainnya. Telah terinspirasi oleh Nightwatch.js, alat pengujian berbasis webdriver untuk JavaScript.