مكتبة اختبار المتصفح ومكتبة تجريف الويب لـ PHP و Symfony
Panther هي مكتبة قائمة بذاتها مريحة لكشط مواقع الويب وتشغيل الاختبارات من طرف إلى طرف باستخدام متصفحات حقيقية .
النمر قوي للغاية. إنه يعزز بروتوكول W3C الخاص بـ W3C لدفع متصفحات الويب الأصلية مثل Google Chrome و Firefox.
Panther سهل الاستخدام للغاية ، لأنه ينفذ واجهات برمجة تطبيقات Symfony الشهيرة و APIs Domcrawler ، ويحتوي على جميع الميزات التي تحتاجها لاختبار تطبيقاتك. سيكون من المألوف إذا قمت بإنشاء اختبار وظيفي لتطبيق Symfony: لأن واجهة برمجة التطبيقات هي نفسها تمامًا! ضع في اعتبارك أنه يمكن استخدام النمر في كل مشروع PHP ، لأنه مكتبة مستقلة.
يجد Panther تلقائيًا التثبيت المحلي لـ Chrome أو Firefox ويطلقها ، لذلك لا تحتاج إلى تثبيت أي شيء آخر على جهاز الكمبيوتر الخاص بك ، وليس هناك حاجة إلى خادم السيلينيوم!
في وضع الاختبار ، يبدأ Panther تلقائيًا تطبيقك باستخدام خادم الويب المدمج في PHP. يمكنك التركيز على كتابة اختباراتك أو سيناريو الانتقاء على الويب وسيعتني Panther بكل شيء آخر.
على عكس الاختبار ومكتبات تجريف الويب التي اعتدت عليها ، النمر:
استخدم الملحن لتثبيت النمر في مشروعك. قد ترغب في استخدام علامة --dev
إذا كنت ترغب في استخدام النمر للاختبار فقط وليس لتجريف الويب في بيئة الإنتاج:
composer req symfony/panther
composer req --dev symfony/panther
يستخدم Panther بروتوكول WebDriver للتحكم في المتصفح المستخدم لزحف المواقع الإلكترونية.
على جميع الأنظمة ، يمكنك استخدام dbrekelmans/browser-driver-installer
لتثبيت Chromedriver و Geckodriver محليًا:
composer require --dev dbrekelmans/bdi
vendor/bin/bdi detect drivers
سيقوم Panther باكتشاف واستخدام برامج التشغيل تلقائيًا المخزنة في drivers/
الدليل.
بدلاً من ذلك ، يمكنك استخدام Manager Package لنظام التشغيل الخاص بك لتثبيتها.
على Ubuntu ، قم بتشغيل:
apt-get install chromium-chromedriver firefox-geckodriver
على Mac ، باستخدام Homebrew:
brew install chromedriver geckodriver
على النوافذ ، باستخدام الشوكولاتة:
choco install chromedriver selenium-gecko-driver
أخيرًا ، يمكنك تنزيل Chromedriver يدويًا (للكروم أو الكروم) و Geckodriver (لـ Firefox) ووضعها في أي مكان في PATH
أو في drivers/
دليل مشروعك.
إذا كنت تنوي استخدام Panther لاختبار التطبيق الخاص بك ، فإننا نوصي بشدة بتسجيل ملحق Panther Phpunit. على الرغم من أنه ليس إلزاميًا تمامًا ، فإن هذا الامتداد يحسن بشكل كبير تجربة الاختبار من خلال تعزيز الأداء والسماح باستخدام وضع التصحيح التفاعلي.
عند استخدام الامتداد بالاقتران مع متغير بيئة PANTHER_ERROR_SCREENSHOT_DIR
، فإن الاختبارات باستخدام عميل النمر الذي يفشل أو خطأ (بعد إنشاء العميل) سيحصل تلقائيًا على لقطة شاشة للمساعدة في تصحيح الأخطاء.
لتسجيل امتداد النمر ، أضف الأسطر التالية إلى phpunit.xml.dist
:
<!-- phpunit.xml.dist -->
< extensions >
< extension class = " SymfonyComponentPantherServerExtension " />
</ extensions >
بدون التمديد ، يتم بدء تشغيل خادم الويب الذي يستخدمه Panther لخدمة التطبيق قيد الاختبار عند الطلب وتوقف عند استدعاء tearDownAfterClass()
. من ناحية أخرى ، عند تسجيل الامتداد ، سيتم إيقاف خادم الويب فقط بعد الاختبار الأخير.
<?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!
تتيح لك فئة PantherTestCase
كتابة اختبارات E2E بسهولة. إنه يبدأ تلقائيًا تطبيقك باستخدام خادم الويب المدمج في PHP ويتيح لك الزحف باستخدام Panther. لتوفير جميع أدوات الاختبار التي اعتدت عليها ، فإنه يمتد TestCase
Phpunit.
إذا كنت تختبر تطبيق Symfony ، PantherTestCase
يمتد تلقائيًا إلى فئة WebTestCase
. وهذا يعني أنه يمكنك بسهولة إنشاء اختبارات وظيفية ، والتي يمكنها تنفيذ نواة التطبيق الخاصة بك مباشرة والوصول إلى جميع خدماتك الحالية. في هذه الحالة ، يمكنك استخدام جميع تأكيدات اختبار الزاحف التي توفرها Symfony مع 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
}
}
لتشغيل هذا الاختبار:
bin/phpunit tests/E2eTest.php
يمنحك Panther أيضًا وصولًا فوريًا إلى التطبيقات الأخرى المستندة إلى المتصفح Client
Crawler
. على عكس عميل Panther الأصلي ، لا يدعم هؤلاء العملاء البديلون JavaScript و CSS وقطات الشاشة ، لكنهم سريعون !
يتوفر عميلان بديلان:
WebTestCase
. إنه أسرع عميل متاح ، ولكنه متاح فقط لتطبيقات Symfony.الجزء الممتع هو أن العملاء الثلاثة ينفذون نفس واجهة برمجة التطبيقات (API) بالضبط ، بحيث يمكنك التبديل من واحد إلى آخر فقط عن طريق استدعاء طريقة المصنع المناسبة ، مما يؤدي إلى مفاضلة جيدة لكل حالة اختبار (هل أحتاج إلى JavaScript؟ هل تحتاج إلى المصادقة مع خادم SSO الخارجي؟
إليك كيفية استرداد مثيلات هؤلاء العملاء:
<?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 طريقة مريحة لاختبار التطبيقات مع إمكانات في الوقت الفعلي تستخدم Mercure و WebSocket والتقنيات المماثلة.
PantherTestCase::createAdditionalPantherClient()
ينشئ متصفحات إضافية معزولة يمكن أن تتفاعل مع بعضها البعض. على سبيل المثال ، قد يكون هذا مفيدًا لاختبار تطبيق الدردشة الذي يتواصل معه العديد من المستخدمين في وقت واحد:
<?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 ? ' );
}
}
إذا لزم الأمر ، يمكنك استخدام Panther للوصول إلى محتوى وحدة التحكم:
<?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
}
}
إذا لزم الأمر ، يمكنك تكوين الوسائط لتمريرها إلى chromedriver
Binary:
<?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 ' , ' / ' );
}
}
استخدم طريقة Client::ping()
للتحقق مما إذا كان اتصال WebDriver لا يزال نشطًا (مفيد للمهام طويلة الأجل).
نظرًا لأن Panther ينفذ واجهة برمجة تطبيقات المكتبات الشهيرة ، فإن لديها بالفعل وثائق مكثفة:
Client
، اقرأ وثائق المتصفحCrawler
، اقرأ وثائق DomCrawlerيمكن ضبط متغيرات البيئة التالية لتغيير سلوك بعض النمر:
PANTHER_NO_HEADLESS
: لتعطيل الوضع المقطوع للمستعرض (سيعرض نافذة الاختبار ، مفيدة للتصحيح)PANTHER_WEB_SERVER_DIR
: لتغيير جذر وثيقة المشروع (افتراضي لـ ./public/
، يجب أن تبدأ المسارات النسبية ./
)PANTHER_WEB_SERVER_PORT
: لتغيير منفذ خادم الويب (افتراضي إلى 9080
)PANTHER_WEB_SERVER_ROUTER
: لاستخدام برنامج نصي ROUTER لخادم الويب الذي يتم تشغيله في بداية كل طلب HTTPPANTHER_EXTERNAL_BASE_URI
: لاستخدام خادم ويب خارجي (لن يتم بدء تشغيل خادم الويب المدمج في PHP)PANTHER_APP_ENV
: لتجاوز متغير APP_ENV
تم تمريره إلى خادم الويب الذي يقوم بتشغيل تطبيق PHPPANTHER_ERROR_SCREENSHOT_DIR
: لتعيين دليل أساسي لقطات الشاشة/الخطأ (على سبيل المثال ./var/error-screenshots
)PANTHER_DEVTOOLS
: لتبديل أدوات Dev للمتصفح ( enabled
افتراضي ، مفيد للتصحيح)PANTHER_ERROR_SCREENSHOT_ATTACH
: لإضافة لقطات شاشة مذكورة أعلاه لاختبار الإخراج في تنسيق مرفق Junit إذا كنت ترغب في تغيير المضيف و/أو المنفذ الذي يستخدمه خادم الويب المدمج ، فقم بتمرير hostname
port
إلى معلمة $options
بطريقة createPantherClient()
:
// ...
$ client = self :: createPantherClient ([
' hostname ' => ' example.com ' , // Defaults to 127.0.0.1
' port ' => 8080 , // Defaults to 9080
]);
PANTHER_NO_SANDBOX
: لتعطيل الرمل في Chrome (غير آمن ، ولكنه يسمح باستخدام النمر في الحاويات)PANTHER_CHROME_ARGUMENTS
: لتخصيص وسيطات الكروم. تحتاج إلى تعيين PANTHER_NO_HEADLESS
للتخصيص بالكامل.PANTHER_CHROME_BINARY
: لاستخدام ثنائي google-chrome
آخر PANTHER_FIREFOX_ARGUMENTS
: لتخصيص وسيطات Firefox. تحتاج إلى تعيين PANTHER_NO_HEADLESS
للتخصيص بالكامل.PANTHER_FIREFOX_BINARY
: لاستخدام ثنائي firefox
آخر وفقًا للمواصفات ، تقوم تطبيقات WebDriver بإرجاع النص المعروض بشكل افتراضي. عندما تقوم بالتصفية على علامة head
(مثل title
) ، يقوم Text Text text()
بإرجاع سلسلة فارغة. استخدم الطريقة html()
للحصول على محتويات كاملة للعلامة ، بما في ذلك العلامة نفسها.
يمكن أن يؤدي النمر إلى إيقاف التوقف في أجنحة الاختبارات الخاصة بك بعد الفشل. إنه وقت استراحة موضع تقدير حقًا للتحقيق في المشكلة من خلال متصفح الويب. لتمكين هذا الوضع ، تحتاج إلى خيار --debug
phpunit بدون وضع مقطوع الرأس:
$ PANTHER_NO_HEADLESS=1 bin/phpunit --debug
Test 'AppAdminTest::testLogin' started
Error: something is wrong.
Press enter to continue...
لاستخدام الوضع التفاعلي ، يجب تسجيل ملحق phpunit.
في بعض الأحيان ، يكون من المناسب إعادة استخدام تكوين خادم الويب الحالي بدلاً من بدء تشغيل PHP المدمج. للقيام بذلك ، قم بتعيين خيار 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
}
}
يحدث أن تطبيق PHP/Symfony قد يخدم عدة أسماء مختلفة للمجال.
نظرًا لأن Panther يحفظ العميل في الذاكرة بين الاختبارات لتحسين العروض ، فسيتعين عليك إجراء اختباراتك في عمليات منفصلة إذا كتبت عدة اختبارات باستخدام Panther لأسماء المجالات المختلفة.
للقيام بذلك ، يمكنك استخدام التعليق التوضيحي Phpunit الأصلي @runInSeparateProcess
.
ℹ ملاحظة: من المريح حقًا استخدام خيار external_base_uri
وبدء خادم الويب الخاص بك في الخلفية ، لأن Panther لن يتعين على الخادم الخاص بك في كل اختبار. يمكن أن تكون Symfony CLI طريقة سريعة وسهلة للقيام بذلك.
فيما يلي مثال باستخدام خيار external_base_uri
لتحديد اسم المجال المستخدم من قبل العميل:
<?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
}
}
لاستخدام خادم وكيل ، قم بتعيين متغير البيئة التالي: PANTHER_CHROME_ARGUMENTS='--proxy-server=socks://127.0.0.1:9050'
لإجبار Chrome على قبول الشهادات غير صالحة وتوقيع ذاتيًا ، قم بتعيين متغير البيئة التالي: PANTHER_CHROME_ARGUMENTS='--ignore-certificate-errors'
هذا الخيار غير آمن ، واستخدامه فقط للاختبار في بيئات التطوير ، ولا يوجد أبدًا في الإنتاج (على سبيل المثال بالنسبة للويب (على الويب زحف).
ل Firefox ، قم بتثبيت العميل مثل هذا:
$ client = Client :: createFirefoxClient ( null , null , [ ' capabilities ' => [ ' acceptInsecureCerts ' => true ]]);
فيما يلي صورة Docker الحد الأدنى التي يمكنها تشغيل النمر مع كل من Chrome و 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
بناءها مع docker build . -t myproject
قم بتشغيله مع docker run -it -v "$PWD":/srv/myproject -w /srv/myproject myproject bin/phpunit
يعمل Panther خارج الصندوق مع إجراءات github. فيما يلي ملف .github/workflows/panther.yml
لتشغيل اختبارات النمر:
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 خارج المربع مع Travis CI إذا قمت بإضافة ملحق Chrome. فيما يلي ملف .travis.yml
لتشغيل اختبارات النمر:
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
فيما يلي ملف .gitlab-ci.yml
لتشغيل اختبارات النمر مع 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 خارج المربع مع Appveyor طالما تم تثبيت Google Chrome. فيما يلي ملف appveyor.yml
الأدنى لتشغيل اختبارات النمر:
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
إذا كنت ترغب في استخدام Panther مع أدوات اختبار أخرى مثل liipfunctionaltestbundle أو إذا كنت بحاجة فقط إلى استخدام فئة قاعدة مختلفة ، فقد جعلك Panther مغطى. يوفر لك SymfonyComponentPantherPantherTestCaseTrait
ويمكنك استخدامه لتعزيز بنية الاختبار الحالية مع بعض الذهول النمر:
<?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 ' , ' / ' );
}
}
لا يتم دعم الميزات التالية حاليًا:
DOMElement
(لأن هذه المكتبة تستخدم WebDriverElement
داخليا)طلبات السحب مرحب بها لملء الفجوات المتبقية!
إذا كنت تستخدم Bootstrap 5 ، فقد تواجه مشكلة في الاختبار. Bootstrap 5 ينفذ تأثير التمرير ، والذي يميل إلى تضليل النمر.
لإصلاح هذا ، ننصحك بإلغاء تنشيط هذا التأثير عن طريق ضبط متغير Bootstrap 5 $ تمكين Smooth-Scroll إلى False في ملف الأسلوب الخاص بك.
$enable-smooth-scroll : false;
العديد من أنواع القط البرية مهددة للغاية. إذا كنت تحب هذا البرنامج ، ساعد في حفظ الفهود (الحقيقي) من خلال التبرع لمنظمة Panthera.
تم إنشاؤها بواسطة Kévin Dunglas. برعاية Les-Tilleuls.coop.
تم تصميم Panther على رأس PHP WebDriver والعديد من مكتبات الحفرة الأخرى. لقد استلهمت من NightWatch.js ، وهي أداة اختبار قائمة على WebDriver لـ JavaScript.