From 827532f1aaf793c45359ded60a8a7eca6dd07940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 17 Jul 2018 09:00:16 +0200 Subject: [PATCH] =?UTF-8?q?Rename=20Panth=C3=A8re=20to=20Panther?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .php_cs.dist | 2 +- README.md | 80 +++++++++--------- appveyor.yml | 2 +- composer.json | 6 +- examples/basic.php | 4 +- panther.png | Bin 0 -> 45758 bytes panthere.png | Bin 45878 -> 0 bytes phpstan.neon | 2 +- src/Client.php | 22 ++--- src/Cookie/CookieJar.php | 6 +- src/DomCrawler/Crawler.php | 6 +- src/DomCrawler/Field/ChoiceFormField.php | 6 +- src/DomCrawler/Field/FormFieldTrait.php | 6 +- src/DomCrawler/Field/InputFormField.php | 4 +- src/DomCrawler/Field/TextareaFormField.php | 4 +- src/DomCrawler/Form.php | 14 +-- src/DomCrawler/Image.php | 6 +- src/DomCrawler/Link.php | 6 +- src/ExceptionThrower.php | 4 +- ...nthereTestCase.php => PantherTestCase.php} | 12 +-- ...CaseTrait.php => PantherTestCaseTrait.php} | 32 +++---- .../BrowserManagerInterface.php | 4 +- src/ProcessManager/ChromeManager.php | 16 ++-- src/ProcessManager/SeleniumManager.php | 4 +- src/ProcessManager/WebServerManager.php | 4 +- .../WebServerReadinessProbeTrait.php | 4 +- src/WebDriver/WebDriverCheckbox.php | 4 +- tests/ClientTest.php | 12 +-- tests/DomCrawler/CrawlerTest.php | 14 +-- tests/DomCrawler/FormTest.php | 6 +- tests/ProcessManager/ChromeManagerTest.php | 6 +- tests/ProcessManager/SeleniumManagerTest.php | 8 +- tests/ProcessManager/WebServerManagerTest.php | 6 +- tests/TestCase.php | 14 +-- tests/WebDriver/WebDriverCheckBoxTest.php | 46 +++++----- 35 files changed, 185 insertions(+), 187 deletions(-) create mode 100644 panther.png delete mode 100644 panthere.png rename src/{PanthereTestCase.php => PantherTestCase.php} (58%) rename src/{PanthereTestCaseTrait.php => PantherTestCaseTrait.php} (72%) diff --git a/.php_cs.dist b/.php_cs.dist index 22f9216c..df850c87 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -1,7 +1,7 @@ diff --git a/README.md b/README.md index bb089f9a..820e1c28 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,34 @@ -

Panthère

+

Panther

**A browser testing and web scraping library for [PHP](https://php.net) and [Symfony](https://symfony.com)** -[![Build Status](https://travis-ci.org/symfony/panthere.svg?branch=master)](https://travis-ci.org/symfony/panthere) -[![Build status](https://ci.appveyor.com/api/projects/status/bunoc4ufud4oie45?svg=true)](https://ci.appveyor.com/project/fabpot/panthere) +[![Build Status](https://travis-ci.org/symfony/panther.svg?branch=master)](https://travis-ci.org/symfony/panther) +[![Build status](https://ci.appveyor.com/api/projects/status/bunoc4ufud4oie45?svg=true)](https://ci.appveyor.com/project/fabpot/panther) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/9ea7e78c-998a-4489-9815-7449ce8291ef/mini.png)](https://insight.sensiolabs.com/projects/9ea7e78c-998a-4489-9815-7449ce8291ef) -*Panthère* is a convenient standalone library to scrape websites and to run end-to-end tests **using real browsers**. +*Panther* is a convenient standalone library to scrape websites and to run end-to-end tests **using real browsers**. -Panthère is super powerful, it leverages [the W3C's WebDriver protocol](https://www.w3.org/TR/webdriver/) to drive native web browsers such as Google Chrome and Firefox. +Panther is super powerful, it leverages [the W3C's WebDriver protocol](https://www.w3.org/TR/webdriver/) to drive native web browsers such as Google Chrome and Firefox. -Panthère is very easy to use, because it implements the popular Symfony's [BrowserKit](https://symfony.com/doc/current/components/browser_kit.html) and +Panther is very easy to use, because it implements the popular Symfony's [BrowserKit](https://symfony.com/doc/current/components/browser_kit.html) and [DomCrawler](https://symfony.com/doc/current/components/dom_crawler.html) APIs, and contains all features you need to test your apps. It will sound familiar if you have ever created [a functional test for a Symfony app](https://symfony.com/doc/current/testing.html#functional-tests): as the API is exactly the same! -Keep in mind that Panthère can be used in every PHP project, it's a standalone library. +Keep in mind that Panther can be used in every PHP project, it's a standalone library. -Panthère automatically finds your local installation of Chrome and launches it (thanks to [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/)), +Panther automatically finds your local installation of Chrome and launches it (thanks to [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/)), so you don't need to install anything on your computer, neither Selenium server nor obscure driver. -In test mode, Panthère automatically starts your application using [the PHP built-in web-server](http://php.net/manual/en/features.commandline.webserver.php). -You can just focus on writing your tests or web-scraping scenario, Panthère takes care of everything else. +In test mode, Panther automatically starts your application using [the PHP built-in web-server](http://php.net/manual/en/features.commandline.webserver.php). +You can just focus on writing your tests or web-scraping scenario, Panther takes care of everything else. ## Install -Use [Composer](https://getcomposer.org/) to install Panthère in your project. You may want to use the --dev flag if you want to use Panthere for testing only and not for web scraping: +Use [Composer](https://getcomposer.org/) to install Panther in your project. You may want to use the --dev flag if you want to use Panther for testing only and not for web scraping: - composer req symfony/panthere:dev-master + composer req symfony/panther:dev-master - composer req --dev symfony/panthere:dev-master + composer req --dev symfony/panther:dev-master ## Basic Usage @@ -37,7 +37,7 @@ Use [Composer](https://getcomposer.org/) to install Panthère in your project. Y require __DIR__.'/vendor/autoload.php'; // Composer's autoloader -$client = \Symfony\Component\Panthere\Client::createChromeClient(); +$client = \Symfony\Component\Panther\Client::createChromeClient(); $crawler = $client->request('GET', 'http://api-platform.com'); // Yes, this website is 100% in JavaScript $link = $crawler->selectLink('Support')->link(); @@ -52,20 +52,20 @@ $client->takeScreenshot('screen.png'); // Yeah, screenshot! ## Testing Usage -The `PanthereTestCase` class allows you to easily write E2E tests. It automatically starts your app using the built-in PHP -web server and let you crawl it using Panthère. +The `PantherTestCase` class allows you to easily write E2E tests. It automatically starts your app using the built-in PHP +web server and let you crawl it using Panther. It extends [PHPUnit](https://phpunit.de/)'s `TestCase` and provide all testing tools you're used to. ```php request('GET', '/mypage'); $this->assertContains('My Title', $crawler->filter('title')->text()); // You can use any PHPUnit assertion @@ -79,13 +79,13 @@ To run this test: ### A Polymorph Feline -If you are testing a Symfony application, `PanthereTestCase` automatically extends the `WebTestCase` class. It means +If you are testing a Symfony application, `PantherTestCase` automatically extends the `WebTestCase` class. It means you can easily create functional tests, which can directly execute the kernel of your application and access all your existing -services. Unlike the Panthère's client, the Symfony's testing client doesn't support JavaScript and screenshots capturing, but +services. Unlike the Panther's client, the Symfony's testing client doesn't support JavaScript and screenshots capturing, but it is super-fast! -Alternatively (and even for non-Symfony apps), Panthère can also leverage the [Goutte](https://github.com/FriendsOfPHP/Goutte) -web scraping library, which is an intermediate between the Symfony's and the Panthère's test clients. Goutte sends real HTTP +Alternatively (and even for non-Symfony apps), Panther can also leverage the [Goutte](https://github.com/FriendsOfPHP/Goutte) +web scraping library, which is an intermediate between the Symfony's and the Panther's test clients. Goutte sends real HTTP requests, it is fast and is able to browse any webpage, not only the ones of the application under test. But Goutte doesn't support JavaScript and other advanced features because it is entirely written in PHP. @@ -96,17 +96,17 @@ to authenticate to an external SSO server, do I want to access the kernel of the ```php request('GET', '...') @@ -120,7 +120,7 @@ class E2eTest extends PanthereTestCase ## Features -Unlike testing and web scraping libraries you're used to, Panthère: +Unlike testing and web scraping libraries you're used to, Panther: * executes the JavaScript code contained in webpages * supports everything that Chrome (or Firefox) implements @@ -132,7 +132,7 @@ Unlike testing and web scraping libraries you're used to, Panthère: ## Documentation -Since Panthère implements the API of popular, it already has an extensive documentation: +Since Panther implements the API of popular libraries, it already has an extensive documentation: * For the `Client` class, read [the BrowserKit's documentation](https://symfony.com/doc/current/components/browser_kit.html) * For the `Crawler` class, read [the DomCrawler's documentation](https://symfony.com/doc/current/components/dom_crawler.html) @@ -140,22 +140,22 @@ Since Panthère implements the API of popular, it already has an extensive docum ## Environment Variables -The following environment variables can be set to change some Panthère behaviors: +The following environment variables can be set to change some Panther behaviors: -* `PANTHERE_NO_HEADLESS`: to disable browsers's headless mode (will display the testing window, useful to debug) -* `PANTHERE_NO_SANDBOX`: to disable [Chrome's sandboxing](https://chromium.googlesource.com/chromium/src/+/b4730a0c2773d8f6728946013eb812c6d3975bec/docs/design/sandbox.md) (unsafe, but allows to use Panthère in containers) -* `PANTHERE_WEB_SERVER_DIR`: to change the project's document root (default to `public/`) -* `PANTHERE_CHROME_DRIVER_BINARY`: to use another `chromedriver` binary, instead of relying on the ones already provided by Panthère +* `PANTHER_NO_HEADLESS`: to disable browsers's headless mode (will display the testing window, useful to debug) +* `PANTHER_NO_SANDBOX`: to disable [Chrome's sandboxing](https://chromium.googlesource.com/chromium/src/+/b4730a0c2773d8f6728946013eb812c6d3975bec/docs/design/sandbox.md) (unsafe, but allows to use Panther in containers) +* `PANTHER_WEB_SERVER_DIR`: to change the project's document root (default to `public/`) +* `PANTHER_CHROME_DRIVER_BINARY`: to use another `chromedriver` binary, instead of relying on the ones already provided by Panther ## Docker Integration -Here is a minimal Docker image that can run Panthère: +Here is a minimal Docker image that can run Panther: ``` FROM php:latest RUN apt-get update && apt-get install -y zlib1g-dev chromium && docker-php-ext-install zip -ENV PANTHERE_NO_SANDBOX 1 +ENV PANTHER_NO_SANDBOX 1 ``` Build it with `docker build . -t myproject` @@ -163,8 +163,8 @@ Run it with `docker run -it -v "$PWD":/srv/myproject -w /srv/myproject myproject ## Travis CI Integration -Panthère will work out of the box with Travis if you add the Chrome addon. Here is a minimal `.travis.yml` file to run -Panthère tests: +Panther will work out of the box with Travis if you add the Chrome addon. Here is a minimal `.travis.yml` file to run +Panther tests: ```yaml language: php @@ -179,8 +179,8 @@ script: ``` ## AppVeyor Integration -Panthère will work out of the box with AppVeyor as long as Google Chrome is installed. Here is a minimal `appveyor.yml` -file to run Panthère tests: +Panther will work out of the box with AppVeyor as long as Google Chrome is installed. Here is a minimal `appveyor.yml` +file to run Panther tests: ```yaml build: false diff --git a/appveyor.yml b/appveyor.yml index 9d67c983..462d6b8a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ build: false platform: x86 -clone_folder: c:\projects\symfony\panthere +clone_folder: c:\projects\symfony\panther cache: - '%LOCALAPPDATA%\Composer\files' diff --git a/composer.json b/composer.json index b55e1017..8d038d34 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "symfony/panthere", + "name": "symfony/panther", "type": "library", "description": "A browser testing and web scrapping library for PHP and Symfony.", "keywords": ["scrapping", "E2E", "testing", "webdriver", "selenium", "symfony"], @@ -26,10 +26,10 @@ "symfony/browser-kit": "4.1.0" }, "autoload": { - "psr-4": { "Symfony\\Component\\Panthere\\": "src/" } + "psr-4": { "Symfony\\Component\\Panther\\": "src/" } }, "autoload-dev": { - "psr-4": { "Symfony\\Component\\Panthere\\Tests\\": "tests/" } + "psr-4": { "Symfony\\Component\\Panther\\Tests\\": "tests/" } }, "extra": { "branch-alias": { diff --git a/examples/basic.php b/examples/basic.php index 5afc56f5..d1b278f0 100644 --- a/examples/basic.php +++ b/examples/basic.php @@ -1,7 +1,7 @@ * @@ -13,7 +13,7 @@ require __DIR__.'/../vendor/autoload.php'; // Composer's autoloader -$client = \Symfony\Component\Panthere\Client::createChromeClient(); +$client = \Symfony\Component\Panther\Client::createChromeClient(); $crawler = $client->request('GET', 'http://api-platform.com'); // Yes, this website is 100% in JavaScript $link = $crawler->selectLink('Support')->link(); diff --git a/panther.png b/panther.png new file mode 100644 index 0000000000000000000000000000000000000000..d50c4889fb9f2d305635ab526b82d1cd5db71689 GIT binary patch literal 45758 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 literal 0 HcmV?d00001 diff --git a/panthere.png b/panthere.png deleted file mode 100644 index 04423b6719e14870465a967f4a8a2b3fc48b298c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45878 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�s&$Z~w?%Mqx&Z4H4ow=LB;NbRu|mOj*WAtmI?BJwv+W z{2>geqZHou7D#AjNzmi>g74^E>S-yN*~-;vVIMpWGsalL?3o!K)G%i##=);193HA= zT#r=YJOno*7GuTd3Tbt1z#Zd^5@dEu+c%_yRy+G1pkKTJ%$M>pE@C6(oZ>q62flf; z-eX>E|IMyvtlXd{RVA6l=+%CHENm^-2Ah^b9&m)~y<4SI3+Fh3pB9hH z*7bT6SS`6=FV^opP<)?+M4d@gvr}gGN@)Uymidyi^Nk`oq>GH0yR}53;Ns`e zCVJBgR{og&`|NgfpYk=+7k)9HEKjYd_sb{Ycnh(|-@giomu}b7;83^0UZ~de8XT8*5ITTJlVps^a3aCs zQcDhvr6QR$p7_(#Q`mY%U5Sudo8|P^ITF~t9}o?CBJ)IpPy$4<2)kQ@l9LJYWz&)$ zv7h@cTAQqOhMezCz_l*R(tA$*O$-FF*gd!MAW zS0H_>f1csus3G8Cj1?+NN;sA*N%1Ue(eB|oD80#Ld&TR)id5#5c)D#Uwr_ps+k~{K z7JN=jGU8B6jUjm+KGMX4sEHdXsXFO^adVU@TmR3HC^&u+H*@o2uWZlF@v0lV?Qy^; z5uzA8-$5sn*igD)fl9{L zkKIgC%*nv_8!x_s#|5X^u}RC(TqUJJq+k%ka0wEKFH(rYcbm7d_liOZm7_$Ax7N+wgC5oHah9hT&*M%_)7@8v&!9ux7y=BM-hxjqYt0hy@iz;bluj#Cl0m{u z;+cTU=1zEHc>6X1R;{ctN^1RktNn)G0#)EXx{7EdwDKh= z%3JML$UJwJsP;H%%UXG~7VD?a;@PUoVtH)2T}$WlUPe3Tw}Vt3dbCnYP`FwbAV+dk z;RNh0QS#i&4+$`4geJazjNqoUp>4X_YyJp zT?nb%Zs6n+hf<)F{NpB5Y3l=1tOi+te}ROL2E47RAs@Y^YeSt~wM*3ndwHd{VjF(^{2`tlqUbK-cmW_8r5CyT2e10fEm6A)V% zW=Lq|iOk|}asrM=Ls7&eS7a@<=1d!0E*(hPo{;kgmmp(=nRAmDGeJ8mw@=Lb);7XT zm44B$&!EiE8bSXgzuHz?tMIM8h4@w;5{RGone${bDn|9eG)GcCjR(7RIb-4tE=thu zcpf5|WF((yU+zm8PFC|tss_j1_I%kCg3j-5d@mt=A>OpyC!CE43UbD5Jz!hyQTBFu z346M{0Kt=FIV^S7@Lid4&)k`?Luf5DaM`&c$`Mb++KEb^I6Dd}`$;)r$R@yBK40Hk z*;u>{I_>AxxLLo^n!uoT`x^2=TIBvT@xYDrL;Id0_hyxx*fi`|#E&ddW09P%yVc1E z5p7tATW?Rhs}?=EEKrMTk{7Uu)OqTTaSy(t?c7!h(?e6?VA-hXBOXD9!D*B&Z}FXj zD>}lE>NM39o=d>*el9$-o4drzHT#2A%eD=s>3S^;x&4r}3)bhVartDwa>O_d86VJv zvnXpnN0u)Zi`AmRT*TAeNO4?U z-}wfXAp^!DDa}N84jb`j8ZOu0bZpO&FL~a00PD~elBZP#MUZUrKNZ!N#5m) ztybnzb>w%Qb`|+>Xne@c@}sSrI72a(fZ)S+?gs=qqR5h~>U=Y>FAuudo8eTIVy!+& zciX~eXxPd2kC$%qkCZ8E`9ZUt>L53q><+%CrSrRgalEm&d`l~#E+0|m8GGHN@jBGq zSKk-vn_c@TbPEm#RfYWo(LmkaMT8nFuc*3m4ENPX4$a4u;q#ZTVVNUT#RutjozU2b z2V#rkp+e~_wN!`vk1RKnKRdkxJqKvNmwInYbOA6g zLI(%Rz)yZmZj}#8*3?SgCNOBdsez!H_ak zNY2jH;BlNVCyaadj>w1r1B6=_Mpx%?JKMrND6TT{X@Yy=`f4Esp@$6!lIyuj;=IYA zy*=G0>tF^D_@wS%tq1(Rw*iLquvtEj{^Zi84J1`GLfh%u2~EuD8pDSPPU0!?auy)= zn?3va$7QU;77y-1>8^z-f5_YThVqd}Osy4*?e_WpwvFwXiNl%Y)33ZKl|aQ0>KMK& z_faox0++(~cf-*a5yDCh*OR*jbt)K4=(M}Zy}tya5ly1N zzq>ixW(D6I2vH>cch;on-Vf~>Ej1JEE{aoNU3hOd=iVoyHhkSJ*WFz)+&o`Q^#Mok za*ysbJ7XfQC;)Yqtwxpv-y^lKv`JuM)7@# zEj5uh8a8hQS$BC(HCS73(S#0a;a=(vcu2CW*42p3z#vTBy%U2pbc}A2(ZYaKMCMp$ zrC9=R%ut*GL`~+}>pT^6TKaQ1M2bA8sON{WHh8X~#dW-Ow$(1H_C=eqb+G?`5KqARJ$wE51q6 zZReh-KMk33A_QUtYQI3YTP;7J@-g7!l=*H_Gck%pmq6@IGi!wr(hnS{&4;LN<1#c~ zCjvj}Cw$Ij+Q;U8zEeyeE6TAF^*s~cZE+ZIFUSz&Hw8Fyktjyn8m_60CsL7TjBi}m ze5e&qb=xG&ZumO0=noL4%feL0?9`91KRCKCa5aGR;mN}+q#+CN&Dz`Lac8k`5!+`KoMZ!^TUz`{Sw{afd+(j4y85ekm2(C>lw3l69# zc}6cNcl_du?qt%N5GP7UVTpgxk$~UnO!ryTS>r_EtfkSL zTIa>xT86cng+zU;?aqVheby{+xTKaA?7&=CZ!W@bCM+Sxl-$von!~Mw`ZMGXI=gXu zPW#C^c9tf>UcY>gLA&g!Hry+1Vz&e}uxWqZoqhbR z%%`aZOE{;=4pQO#@W@no7)5Mq4JzWnW-OB!Y#T;moU(ZFGn)F7OQWjmDbBmq^vzlD zqG-!(bM|YRWz31wiLT9_?nC%u>Pb(%ov?UW~SW=v8*%es%8a+lZjbgNu_U=Lv|&7m9&&Qz*Cej3wJ^t%H)(m8%!*844os z`y4PDlDID4D*X_T)ZUIv<9WCuJl0n*Zk9!Dukyl;<$X%*O@`>ju&0H4yxvxfOlFJH zoh&YI@s^>~YROlfy@x@x5-iheuWituKXN_KZ;*BHS){d-1|bLQQh0{M{y`XJPoCD$D3c>SyEH(|$ej(ZbI~A~%S&H4co+hL z`F1p}G;q|DGCq$|cW6ar!o-F4q{o>gR{5jen)qh|sTzHs&S;V}7l$tkxro1Uz(+}wW7y0O z*;LZZ5zKPO~(%UKWPs04mvBG-Dik2e1GIx>UPaZYs1)J7_4? z)xzcb@$eSQD4Se59$gWInI0G&pq?4hKSd$zaE$A zpi*A7MK`@Z^A(28@N8GAj?aMPBf;RRfjY)A8X)FSFaU@iVvd*6K5Mu$+Sf%4i**)s z)_}nf#o{IYE^2FEZ*Ggp-{W==#a}ieil*F266=%J>Qu@Phr1QU(D}wegnjwwS!~Ku zL?&pI+R*B_lmcR#?GLT=?ZhA>5HMinOPlCixe+FNe7u^U_!_}gbA8C|^8DbOWc6x3 zEANDh7~(z;a3H5sQKExoboYB{r1i^mPh%p+2OHj*y9Ufw!bJ=hPDY?p6+c2Y^AIo! za;#36%UZXul6(Kc-L76U2s#O+-;3hi&$AuiAQ&Bvw10fxkvx-~Ds{$V5phVJ91FRE zGJ>Qu?-hS@q(z2i9Qhlq3uNf4yB6FT?fE!cw@Eq;I#7T6s_T2I)w>K|&UM%Ll@*V)G)t&kz*LR?F|04aK(5@4mPW8)* z!iu7Tz(?}9Y$~^@rVrMy@&}j1Sj?h7%N!@Rp07t}z-}EwKSw!QTjg9=7bY>IXq&?- zE*wPQq~AbAEit@3#ES(^Erbwz4chVD_SJeem_FN1^CD=81^9Ujj@f=}6}ZMz`F1yQ zzQIu)V5`yIEwPsdS!WnRhvC_tAC@WPEF*KTdS@dcH!L z9|093V{mS07IbFnvY$App%_sXpOb!au)njG$0MeQ1p|tmU6((;zSZFVG4J;6W?8l_ z%!+ErbGX@G8xbWKN{*t^?TcQpJMw!>gtVPxl2-0US{(rX0YBXC(fY*1 zcgr#Y;S`RO07M^w5(lUpm#@b$o{es(HeM&xl!SumY4OZ&ZHfS@n3Hga;J&~hr>)|8I$K- z%v^L%cy1X2rQO_=C9ed6ZLP!U&V_JSIkxT$r(Ig5CzB zkUGi4v(qhh@+3B|G6tO8L`*fzl^vZbqq#6+m3le){Xti2ESyiTbTz8d%`xVPw!a}Z zp6q1YPQ@87)LM5KFe|)c*C-l`Mc6pM@63L!UTq~=E8rC((LR{M0psK3)Obf$Mm%+TA=lW7(Z`*Sqjqh@ydAF*h4ud^c{;kE0EX;U_ zMB$C7S<&0`?}BJ*F(C4F=zG!xt0LiY^}1CT6V?-4$|(nB+OKyek`C9SijW={)gJDk zwBZs$?!^U?x@+8no9o@zv&}e=ZH_bI2(ih&)*EHeIwTXm$%GNt25*v+ZswSvyDZ%> z)G;@{bcCs1oT|2Xc|yM}64BM@z+q^3w~^1}(^LnSc+aABr5;;QI6K@a3^m)(m^@4* zJzDic&es$ul5u!2+vJRVwa69XO4l&sHB-8QD_G~}z?gwt5l~k2Vpk{#Juio~skte@ zkD4M~Fs-#&Nu{LdNPVf^>jkH#Bg%>Chqjy`{T-e@vGxxrvGtpyZ3V}(do~WY5pmzs zZZFgPcRj=q+J-I$0$`lGxpzOH(0Q2A$w}W2t?@GKv`wI*w0)LC`z$k=PHD76=4RoK z)9Xkw8SjYYY<dN`IF3wlehCKY4(z{@(EoIla%#r$TQel7Ho zw|O`L;+q|a@n>W$20071akIjFx|PdPin=m`C@oD@{-K_j^ZvqCaUmPI76=UaVBI2F z0ABE+TGzga>WQm7$Bmtv<&MFSis19jl?t$k?evRq;Yl9|E8}ce z2hB8H`ZlYoQZ8=4zmkRu4s5SKT3$CA?H$_!Vnc#r)pXGFu5RAAtrk>sHMkz*EL`%2 zQ>~YrRXgiit*;F8CNN(Xaw`SJs+lQi&ii@$2X62SVm!~&u$jgvFz8XNIXrRLHEWea zG-EY8ZVIug-~BF-%kh3J;v0J(xj3MTqIVTa`g-FbtI2k8_3okluyY0`WQ%4iHbF*0 zc<9!9)sg3g%#ynQD*zTN=Pim-Zc(umbiaY?0=L^$`VY+G3zPJfw%bS95k+1p`-a>1 zzA$(kq%K0%;Mwr)@iayAB8qn+wvZ$8xcxTK;emLYM9s)EZSj_{CQfvfFwpv8d(YgJ0ZeX;7vp>)vKlUgIt%nO{hCa zLuEi6X(zftzw3I9@I_1GI-}241nQ&Ya*aS$m3z%V#zuS5!{Dqzl#OjkB}22H7+*K_ zw&vH4vR26==YtCKA|R;g&WW2}{x*SqV0@{?7^;@w6NoNO%Quu!LbWJ|X z3SVfUFWJgul5+dSE;|vdqV%OA*r20<4spUEYLY8o5wmFlPt1uoh} zzE}tqV*>G&a*})i`sU-~Es%Zlbka#EMLn6GOp~gRp(EUIp-lTq8I~|wqeYFqIi;iw zV_TP|>D|?JcM=*F^DYy1>Vd0d!9~~Q2BoH0LlguaxDS(vo_F)Kd=5ux*A|79G4QR; zF8Df(#cS^u;8yp(Q&drZ%j8R>gHC_>a?N8c)p?UpAW0|5DF83fcVg3cJnf3*Lrj#I{bgWv%X5Qr>@KYULZBJO~ZmMnf9HCG5oLZC) zMZ-#0S^uuvkJ@65t)7X}>9=f1zEd>ohZ>ztyN$c&dp0+Q-bOs^OF+fiB`-IRVT|F& z2_vP$c@RqsNs?5iddWEv6MWfBPXf_aa|!KLrNJlSEDOBAOphQ8oU+BvuGSw$&D6}h zgA8|vU_Znem|Q%W-bdunNH=TM-$Ks&%84;nW06rRA1e3zCRvKu&A?hE<0Wm-rj!hlg$1Jc`BW z{k^EA_30N6-C8co!}A}p>ErteMn&L@Q7H4eI9>rwHO5mITar37Mg)gK-=C@R*r3EH zFl`5(HxQw_r*p=;SQB-Yd5GwY-@=Kyj2fykNK|?z=GVL}9r_|&@uk$3PU0Ps_*(Rh?qA;$vyg-q( zjEa>ah>#31fJJN^*uO5q03Q)rda3d-G=5VE_}7e=A=(0aV>(a?2NH)GVctm1+2cTUWQU$TmWU zi`0D=`MW)ohRgjfqgLK1@`ZcXChLAa8V>NIyDb@=uivP3n9qtv)c8CoLR{}5=9}YQ zE_|53xd5-)cXx87EqDW}&->|KD-rAX-&>O=+UDH z9LgJlvOsxMMnv$IdeEqHcXGZhkFs`K1-z4;tc7pX^6lpu(|t}anIhjDQsN7lgpw)A z_{o|EWa{pf0-Atf_yi+PA)V_P5yy(T-9Y&^N6L06-fNUIaI`8gB`6kvuKi+d2Xp?U z^RlCEzhzS`sM85IO+N8(k=yH=6pm7l>*FHh$Fl>K!Rs}jVx8)WzHQ#7qQp4Ks+HNc zyzqUEfa+#U=v?P6gxsrc$Sf@F+V?ImiJ!59w&+V%E8l~I0cD{{wC464K?_yZ$nuLG za6jKf4UR^W%stG;YbQuAS$!F-npB_h+D=t-o=ycF8ROy=(VdLli`sqSea`XLlSMig z99kVLFdWRQ3^s!;s(pWRwq8`fC1~-HDKo$!(z>HeBL4Mw2Vx*e1-)PXC#_9LRtXzH zrF$?7G~oBoZo7TN@;f_U9Z-?iuT?nhx&?6z@Fd~_lFu`yESE92eJy^Vm&k3<$=N{k zA(JvRf8nL&40OFtqc>Yj6kgcuzCw2{EQ_qLxplT*`R-z zB`MXL1R~fV8RU}Nbgv|0hbWB;Ens!)#o_ZbeaMom-m+=KN|}MZS@xr8QB@sEL@a_A ze_?HFvrrW?lktFBCU{TW)B*^U=L%(Iyn*7av0O{KJuG$E*Kk43-+rg>XW=LN)@}&R z>}3Cygbq*K$G5!GNnBrTa8yo))@VxIWsJZlpSn@0R@)60R;p+_b7fNa0sVbgEs6$OzuYu$;!?107%6gtK~>;p>BA4o5??;#7rp zQ)N8SUM1~Fj`W}11R=mDug(hH8jQiu953!-s$Z`QM+&qMg@tz8o@Z<+5P{f9lmb8d z2)6P*)*UjfX^`bs-7)JYMU!P{t=@YC*yS+RY*3JI<7D@(jnyh=Ej?*9_=&Lf>yNS9SCq~x zeLg5`0QdH84SP)J0?yY!>qmlSCM}HwDD02D9>+cXyLAAO!MeBG@CrBJeA)gQ@ zDM;U>A4Pr6=5$f zNo$>j`h}DzgDpccXP8@14Ob*C-9)Lyc&giW6+SX$v13Ns^rTH8ye&pL?ph-dNYUw= z2`d8SpIa(tzV-@pU7hy*!YfCY&(04U3+?<~eoHC2%ZR}3qvhoFd;YrJd2hVNwSezD z?8$npA;gvIZ6j^ZV!SZxX~m`_BFYfP^NUjQ$|6nn$ywDZxW&3doCn+%>o3ZJ;^qnZ zhys#qSPC%OB1nIr(ydgRJR1N?14MOk#?2^cczaZQMp*3JN90 zjO%96b0lH^lL55d5W%bUalvyyHMM1AC19#DM$z3@MzGL=?~EgN-dUtRO5x`LnQNW~ zRW>)eo(DS)9fpFfvTer&M!=L>I)W9F-S?Q1>kDck@FCZ19+19EHt2R691WI2n?YKO zx9d#j!ogRswzKzc1q|OhNs1{+Vxr9wEPbkBj`hGq>;{>zW3jr@_;zL#xkSSla zh8PyQp?6i#pwHsx^a9R&OdKg*N`X%@wd@6O8jil_T45h|63vv}60>>5+V3jLdboR^ z%w;BmE_M1{RFwO+m*ZV#ubJN1nE@ViDS1}>LsPwc(iC}&`JFN9d%ydjIzyIaIdkIg z)Zp_cEctQYUJki$dz-p?;^Z@)8N}$i5))_j`tGifexl78R$nzyaA9N!>qH$>DJczb zKb-chVl20tXPh7N5Ms_^7Y+chmvTvAgnp|lainrPLox5GaNqEL_!>0*0uS`dQ0y2Q{V z4xk7I=E1cTV3msGAE0gwu`U*ldt*w$eq+G4!Q~v5vv%GOK0UA8L&$}0d3y;ZLIsM6 z#`>ZTG%v)Y(~;be(Q_xP4&QKqajdkG`YDDUm) z5p~fMM<3?4qfz1DCyt2F6r)S;EOQTO#zJUqM7*Pl-i7OK`Rs-da8sXS*5}FaZc3ZU z-(R~|^EeKQy@nONSxRDO5C#22Z7Y?F?dH{TNu=`HJr&&lmqJ zgoY}+<4exQV4JY)T<8XXf+h=qyah9+_$|y-PKC8ra3qnYD{sReN5zHh1=-&sd_|LG z2!=`7g&>{Cp|&CI_fm*2E)4iI+wX*0EXIBMCh~DlMElM&2$buXtyN>t06aNq;!pLw zv8+Ux6)5zKr6I-eQ;JYK7BBD3{8~F;VLOjyTR6vq0XLjRxidWv5@%{V4TZPPfGLrX z1d0u-Zx8wE!CP{`c(|ZOHMbf9B3@ygI>jf zY&3^xXJz2vQG&=QlLq4z6fmcgtyqkf)Q%#nZ*kNh544~dh(6zpedABP>zT`xx_(tW z^k&G=fn9#e)Hn+bhVX5Ys*~TG1(YLQr9U0fHHCgdrgA}j=!p6Y=(4WV;wb`=Ph+vB zH^A7TeBHh8t7DQX4i`B^5UT%AXKxu+Rrf`Yf-fQ^B8>W6n879bMO@VtL-6U4i2eRkhn) zvhxA-=ii;3j>Vbr0~uNBh3r{I`tK7dz++HurMQ@2QnLnbF7dEL?OmUq1%v{w- z-ZdRdp6{(MFW5{~QneYJK^-NvUI+{E+HLRH@{lA*V-Hj{rm%{_)@$gcpcYNLA}v~b z8Caid>E~duZ#&Tt-CHT9=)DC#EhA~{@rIrY(`oB@yiW@+>YG{EjF(PYKgxIRI^m;1 z-+?)$$+DG){}N!TiukBNzxWvH!mJJY1bWRy>2!}oaI&nV&y0*%udZ^`UnCj<*) z%%DOa{6ZlMJR+$#ayk|nqamCFUM;pNJ)4SUm!yX;UF9FGQ0qULdJ9-}Tu)*{cK{grL~N*X<(I;O-`$@<;iqOE=^QIsM0qf%|7XI73bI?&gHAQPgMs#`o` z>007QmcZh-oB!ZJXpG4)Vx{pWFgl`>c(^b}8%LkSoHM%FHeO0ThEBGa6(icwIsofM z4c6{xhFr3Jc2Ag6y_o530t^yg|RZfmyTOWrS{hM>ibw8<64Rd?>cAF_%EpJj5> zSv$gC(;eE6J@QI6XQ68&%;9Yn+^@UXt^a~lzKrHRiRouS(liZO+LCGgtQsW+c~$@^ z`Z7s`>a(TDWik?rj$bI9?Zzbc-H0;h9@n&(+!TiWCQu|X0W(3KRCe{f3`!}gk<{?d zlwL{|Q~8+DEe&jGLT+oB6~>evv}pXknn-gfLKeB)%l3UWEzn2EFsl zFX8{qm-RS1d=$H#g?wkBPl=M6lH}eod|%-3K{mhTe+7IkD zVa|BU>elGSj>Rvn`2>u91)cFx0;I1(AjBj(`Dut&@{$uZZ~qxNM&R{H}sh=JsCAs9px2?0e%o!kTns!Sprd3Yn!eciw?)r{p zXRd1Ib7m7O5@v1tz=wWp?ccwD5{2Vfe!^7?CK`<}a>}F-wm4YXb5yE+v-8TaGD7XDQ_11WgGfoq@wK`NC#xj+rlFe12&Ti&swqyD$6QV# z=yr!2sV&S1Fya35nOaMdtW8&`B>xZ}diL8ZktG)wjg?kA6hhzMS5noYCAlA?>(sk$ zz8d0@o$x|Jmg(OOU8%P6&Hoy7*W)P1QgHh5$BDPP$M!$Ac@u19zeR)6&-)p;HZqJm z$hb`q&f~E2&20L~R5K0kC||Pb5KfNQ0W61kjl{n5ZSiiU!z%=fAG(}*>s@~35@dbb z_Y;S%fgSVoJWH}X{W4stuuhPHYt^0`Uk_`J$c~LqBe!?pP<>wa^`IpNX0d1x8~VRg zfyVF0F^XXMt(-ExsKPy7tYzhVj&cMchrC|61&l;*_oYhxa~9RG6hy=QeU zG9y357V3iz;xy-r8QDcE{{(r&VkNXB`_8q85&wSE2 z0n|EZvze0&dAMG*Pvo+ZXt?LB6YyUEw0lBL&%dJ>ezammEcRX-hmzg#o2Cdhzi0l^L(&d!JWcy9s3%NJ z6Wd1nr9B0~wWSrcw`=s)Qk|-mGXnWoB$`r}8QrQ*G6`0KTr9!atLR&or=D?N5@Sbj z2WSnx9ViFea}QY*r1tpxrQ zr30mNvqD}58l(UGUC*Y9W(&{Ig(=6}g!qK>j+)u#poB=qlQ|b>({qSL(tR#1+Vu4F z#o=P&tiDIM*z2>buQ~s{z%)7A=nvl{dYDW_A{3xUOwGr< z+CnN-#;i(fD?(lQ<5?+7n+j&Ov4Qr^V_VZtru=-6CkN$MfuzfUe~#P|q%2dU7`OtG zTeFct)1+DaxRXc|KK=}Z@@Bhu^OsaZS|bT21Ol0}=3H^#FBP-Qxr(C1`OUMP)>%8N zFUwClikx>OPiqhzPqi<~f40J`?Z%`DnPi}u&~F_O4vE}W#}2W)(WMV$u?gIXpzZur zzp=EwV4631fXC5%b;Mbs&u8>*f?8K0;1W+c!4}o@-%NfN^6)|7(=rB4r*(pQ?`n&= zF$&|b#}BzT!M%p2+c1Rd)+$zZSPgxh!)7^e`w^kkR)e-0YJr&HJPfN^{jO36&l+Eq zBHkThB<-i8&rE|q?a2F<4NCHxp}bi%Q}8>t8u>d*F3(YcYx{%BUThSkulScylbFG- z`Rb=L7jJlH9HdYX1rq~=DZ6RT8BoRLL{WW`B}u0nPnXIrb0^bdxuTYEde>KirYB4d z|K?*==4Pai2`umkN8hfvDyRhRa^%*zT=>e9|J>Uh!I7^Fwyqtz*I)4$iWyLdP4!+3 z&t|suoi-cBD5n2wPs^xDY_df!gqi9)Okqg)r$X9|1ns)DG4|ym1unrhbxhelm~66b z+{9PlJN$@g+84AY-v(G*oOZ^tl!N?@APv{UXj>)0V@0N=VxlM_(Xv!;r$OhD%)?(? z{Y11Faq};6tpK{+V~3f1nW?fd%(!=dQD>xcZl@HlS;4AytY|ZMAT(s&>+D|VI)l!j zUB@A3YKoCq`fWHtHng-vOS{v1Wi=&U<~yIqO=l5_;TH_@)NhI|O&!hgi1;Nh*PK&` z>XLuVT``sL|C69H7%6XGuiYv^{UD9q{y7S;-2~{^wZw~&1W_h8>wmCodvwXcM9tKB zu6GitF)+WYI1Y;t>%jWsNGHCA{4Z5Q+L<zA7TN;{+Z07>b{eKb(6*{K;3eO|OLLr|AagKfV$om1y)may19m>_`QL+ zxHG1-JY(?hSc`|N{M6-oSuhBOO%94Ykkn>TEfoRjB41!Vc z0Q6nh$eF|Cx%5#T+m*kbt2kL2=6w3J?X{dZSXN=Bm`0^znf^*Wv;#)Mnm@eISpq?v zu?}5}G%tku_ZF==6lyYkjitkgF?n;Zkm?J5;*u1T&l_iSctz_ti*#%4MRh)dOnaJ3 zg1IY0FUuA5yX>RlaGZ2;VeQV`0^&F>W>eTQl*K9_Q-WC3?V3X69$$S1($%;={WXem zDdGY1g;v71`@{NIMQab?%(+2l!v>%`pHaU#DTve^CA8ZYP%x}D4xykDqtE)gUHIwg zdP@?o_2P|?xH%UAPHW0b zx0RkzUchKa1QZEi0u(-zWl9@$N^7h_-L`mTGC}IG&H4prq-KPoZU(%c&PRN3^ zBl-N4l;;i*DtR4Y(G|OO3Z*ct@8_N@JCSq0>5$LjWe(1to`Nbp^6n_~^Dmk~k{UZk ztA@!v74WF!Dc_S2B#$Beb8Adf;+BvOW-3U>4NviDi=|P_2lI>%YQISLUY#6!|4Yr2 zO*{i0L`g*@rkXKn(sZ-bu6So*VT5QsL`y?|@l!w6ALk_hJ8LgI8cZt@Wtw`eRpxLd z-50~c3GL>Vqtj(9LL^J{{cIg9v|p1?zqbDjz@67^4_(HWX{kl3 z)-mm1O+SO;KK%>?&-61FrPm2NWjDK~uxeMixH{6Ly07L#wW*ENk35|YEIA{{CiQ(E zg>;vyd-}grbz;+CqCqRoRw~^{DKq{Y@k*V)#~%(qAI_k3ch@yz27!@Ad9LLytuN`_ zil}>vf60MaX1crF?;T0!qoboMBIu<-0*%F|xgFo_4s#u?i2s9e&sFh7U)q|Y;DzjZ z*8K`$Z^7qx_7%%P6<|tEabQm=qiz4NDb(hFOAW%zu=$%J@?bidgFQo-%XLo6CFR` z7DGL5y)Uy6Qq$NrM}FB&iYLbI$H?IKhAEWsGUfsUku*qDls&1ggqk?^MFmX~MYQ=s zt#y5$c{}K${RiQhkfc zNZW_~pS@XF5wrLtto~Z^w8?CH9M5DekzwR1X)Z zucU9(X$+8)%)~QbH$w-8K6qR&yH5K@(!upz}ezd`4=&R<+E=~Qbv!EMAv!mgKRrokFI zw*M(EC;d1f`+@cIZv-!>lDFln3(#s(>3RD#Um<5>a<8#RK;e0l{D=#b;F&d4ylA!qg!i8}^I0S$>e8}Q0u7_2C>yp?thkSx z&u{3&p6CRpi0zt1_Ge1ZB>{eb9RsyLCg#&>W|a)WzdWR|D8GuT%oSlYO&XuNb<35) znn{Xb=G3~r#u&FQxIpxcJHG~5c(suZp~riXascS+x6PIeQy4369Qcw+kF^dB6tAkC z_8+{_CAAt6VADzfsRW#ZZ^`@LKeb-hN zC&ZDU8dxJY%VMYbnq$&%T{zm(&bh2Cgvwt;HZ%O1`sJUTrXZD#>J)UbRx9aztCljW zrR=0KPkDkGy2`2+w(io{K@n`X$>{6bx0oO{xFUymwh8C+H|#-+8^GjPHL|_fB0{qu zLv_Lnx3hI{Ksa$`G5nB|i%#Q2CP^Z*+^v!lm=2n+%dvGFd}_0KCxy8c*q z($H=MI9VSdr!}DvL7&j&3(vdV0wSKTlz`viC3VK{5{eCb?c|4UQo)S<0##XJ82OvH zUbJrKl!e;in$n^roc9eJ9l+_Tm#)$xtg?+N9?e^;8HjVkeR^DBPOw8!Rf}u7O@*`V^<+L>(13w7 z3NM8yZ_HP>Gdgz4y1HqrJCjRY<1B+>w?;l|q`QvCm(YQM`^YpDIBgD-BI8Cw<$$uR*F1+?%5QC|->k8!28( zpZ=%g)Mox_gV4)WU4z17O)cTm>xotl`vkmTd)@MF-s9!=_B0Mg*g#xtN)(3U}f9RQgLyb^L6Y!LI!jNC37Kz`ZR(cijHT^rLj@8 zvcG-_JBdK~@=*1DG4stJUavFRBo2M%UgGV?yot->4Z|y;ptB{WPk+8b)k@K^6^X(F zSvaUuj8Jp*YkCp{q>nsHpJ6DcUdQ+TJ%KO1y82Z$W$c}!`&@AuEJPv{|8y<%!xkfo z9pSU`(Vn2{2Pwju6MFFp=Cxev8)lyED#qxk=kdg1Hz6hbU)P11)8`^&GxdjuIK2F^ zq*NZ$@;&J@>Bf;1QU@NlowlncdHoo1=5Q&f#H%5&C3aD2!pSO342c9cS4k}SzPPvz z7w)cgGgv>MXz7M?T{Vh6H42=de`x;wr`_-L{*gy#hL){CkIjHNqM}J*>l=5z-?X*5 zS#{rVaY59la5QAqsghUrnwb=4{2ya9%DBVu^>y^i4VdGPe8Jmznj&Q8tLGcvqx7f? z8aHgKb~V-NfXe()8FnYMm^;8UfymFg^pX4p{13P5@BZ~sCF*vJ5}l2nX03Yv``)Z? zHxhR(*G&SD6>XA2sC0ufUyil5e&<~}>oetHMnr2ahz(QH23cWqg`%*YT&j}3|kZl;du10z3t&l7LaHCWE{lB!`n>z z9g_Xa;*F2+kF4e9C40*+53gS~Np!3$o$^3J^zcJ;>Ggv`mM!x?nZra>aE6aMO?J$J z*<^KS&(@TH@-jFG~gD`nGf zl8Khho6A$#sQTkv*kFwof{_xfus$ZCP|c8Y$74huK{(~xF5oGrr5=Dq;h|{vlqZDa zJs-R?@P=Y{2?`UBF;z0*k$)>JtU>@rYkdkOY4g8G>Fn`W8HV6A=8`xW*T*kXD_;m zk?r6omLicRgh(P9Oon|EAeYJ?k~)^sniLve0BpZS4vFwG`>JI0Y3P!a%xGwl0UcxaM&s z7`gc_Bsd?#)-A`EY4bEKqiN{7c#bl2^NDC#!&=BQKQt3)2M()4o}4@3KF%guKp&EmJVdsrH?I8Q`u1C_I5%gzM=## zSiVt?szTeOBtiS@n`fd9;kjlDANkZO4nxQhr`t{ZtV)W1{;e2@o29JGB|%fKO{lp4 zPwdBR*&m0#hxO%jv+$torD+X3iGF5Iu-WwuCvf}X-qEBxVSi{oc?PH&5wny~B70RM zl>!lhAd-_1(nlw*JllAKi|Z;2#g2o7#2|6}=^FVo&gaEovXLxptO(5tumLJ5$C_A~ zhRK7RWdW~%E$)ZA@+-6O9CMX|_*t3CL0@vD=!V^Bt14>^QWQkYQ1PNqn=6Vg=hHC= zq~#nMon4I42!anMVt_(WHHoFMxj;x`)=dyj7P|qmM?QrD96$~6yOU-Ro5Qf0Zmw;_ zwm0dBnG-^7C2bsE&3qO{Q_7Z<+mUIa1Mxkab{Hs*h2Im7!j>1EhlD6$;BQ;V&cuYm zD5nCfu4XcCNFfN{MP?ZvSBoO$Bgw1NxbfT?T#MQY+2r`%R_I!Hx$F9wren_%Af}a< ze<_M0_;{fj!FSZqLD?Vv*+-7YeluPJ?D5Dyr*2A+TEr||K=D{;tV~79Q!Zfa-Y~Bc z|BF5@yCW0a(PwZ+Hu0#FGp96T7yQ`bF)4VpWA^XlvcDIlla`V=S#AE(v3db|@+~%N z*D3~bo&4;V$Wo^EC4Pj~bRA4|3=p3`<3DLvI8b`(K4x((=8 zCYx+se>flA-b^&;0kqQZ>)2N~&W-;$P~G z-$rt=nW_=Hk(4^wSQLQk3oLT)PIV}x8ZmS$R1bclv~~ZtfM4`rrxoShs^w!DJ8V7w zcC*o_k`Pc$H66F6?w7Z{#6Ur!3El^QY6Q_>{6ss7WeO`OE&>1R3sgDW! ziKuGB&+C^9En>^LJHL2F>oU0G z-uY)*jb4KL?G_+c**%>a0WquSS;FXePWYfD_yB&u<@Vz^Efz*rPJ!D9w-x$?{;J zfv?nTyToywf_sh2L{7Zlno+7&l_qiwG6mEJONtpCnA{!l;imo+W!lM6sxm>p}g#I zTJ_?16Sm~0C{*kYtTdKFe=ic<8s@6;g7nZ8n=~hLL$OQEc4|Lnva+1skJ-|lC7yA; z5h^D3T6l~Kcx)0ZkJ6k+VU^~xfC$)+aSqpLd<$zj%S2&!S~KRe-dU3_GoYRV3;-ru zL&*UIVC?7GuhDUv?dygVMyD_Y@=?C{6PW9&(6q^o!9U_{!{J(*dqKa3r68h9lQ1To zyF9as=K|^3RU5+GgCen}Lzf-!ZBQ%CRewsPb`I&k`#f1@UOlDK$x5*Y;hE|G(Ja)f9UHb z48@6>I^+don11L`1`{*iByhaGp6kQE`y7k{Ac|NYQ;VYVH`@b?0fXT0hxJEWiP3YTjO(% zE%S-d34%%8BU1GE1n5dLW0(bCsJMWfY3ecT*GMV?@ij-t z7aRStpeW&p_Muid|J^I_KTN>eVW}@VZ;g*z9BMuXI!pjwoM)S?P8zQ+7(XKz?;?S( z?G6b^18W{er8mi!^6_V$_(Cepx)c}o&pf2|Bn61(7gr_YFDw!P2F4m=4{D#Bj2!;+ z_g_S;lp3?1Qr})-GhxH<1HAolLQkiW0f}0G%QP}pfj1Z+E!-cn)FASSc(G$qQoGnY z*gHQcvKCB2-m)<*q1l9}Y2P!}oN7({Qy+ghryQHTlxg&Ztb61~&(W`ujEX=ZGhw#n zYRT7qXqvb_{s@L9IhUJpx{l3`o=@n{4+1bn#K-Vwx}~3zwK9fp7a1 zI1ayPLo6K0W3glArQ~E6^`T*%%##B-zlbUr3ZrERsVyiGWnk<9Cb@&&)2|$%&iYb3 z2R!Gb9~w7eO4##&3py_sXg_oz(4V;$ z&hI#LLSO|(0hBRu7V2zLT{lPLxL58cHBX<8zlIMv2V#;86l8j7lTBRz^fkF7CG-Cb z?w~}sF=o10quS+g;lO)va4_}X*DExLB^neuktOy5P8beqK|9M$Tml|fxnD*z0$?w} zhAjvH^jaw#R+>#NOja``hVxaXB|7yHFNrw;v-^qbYxW^kk(};_PqVBk`4~1u210u12Xw?$)W&iA_TZq4b9fwS$Yht*ri?hS}rhInoiyupfZwTWF{YUlgh9mH&sf2NmGT^#S=IAYS+H zT`#(J;C`E3SSa=O`^C5sV0yoQpABHzj`dTN#6hZofq|~*Po#AE-jA1Qv(4ZP{ogtk*$oYvadB}U z_t#I|{1*>x?O$;%JH^`bra!~V%gb9E|Mbr0tP!5+pwurinP>qz-Wn{R)1c;O44h_{ z!M{6=@#-&%AgiF)uCu1ouCwM%fERskd$keZyVcwGo~;MDj!nx(Ac76gxL@%&HXU{5 zO&3+hMf_=1)+mWW4*xE&uKlF%2dk8D^Hu~h-PVFdCuzmAe}MQSJ2zJx zPMrh8PH9%$XS|Uxr4xD$Eeno_wKDUH9EQU9a0sp7LtP?U931B0hx#Q-0D{vDETL!zmnK zJ8lelauhdc+jGB#!(H_7 z&tI-=^WXgOvtDfl2X>8mUupv;)U=HG8x)67k^Sy3nv2xXfbs|v6BTJByXTGl)=0X} zanf)qmm^5So_%zyA8zS|9bZRXZVjjNCE_utgTAI~3oJGp1#3=Xt|j~bT$i0SM%Dpj zF9S>-u#4y**qOguZ7kacj1EAtLdfi&|fey$B-*L0w?7qzfkw2D} z@dF43p2O+wwuFzraFA&wNK?l;?M?)AV)8NCN!kj&*H^~HmFVZ8POf7$_aoxT}|5-!zor`cV>Kvmf6{_sru2o~C({8U?DTnaPPzU`OR-wfM%{UK+oJIZ+{=F_ z<=&5>qk{KgdwYBC+l{)+2QD605?{PlSulLtKl@2Lg6#p!>i~OEmdYoz3E2 z=^tn5rKQ!T?F^49{V7izUR*R&?;OZA2nt<;tC0X5 z8>geCWFW+Ye65k#SEL5*zb6Lz5wp6E!&&nA7{Pm(;$`h5pi~WovH`~me(?=N~K~ZF&IUT9ULV`UA_A9onRWsps>*bfap+Pm7IeEYbvMB+D=ZS z8MxrLW1(oN&$Ze-hc%NYx1N;Ps0cuCCs^DU1Xv;V+)Ki2Ci?ckl>(UvB6#3~hli(G zs*WpRI1on{mzX%~s7we^|WYtl~s{-9DEG%aFh6p>V7(;U+ zcxCuO)zawtX!)|)5(=GR|BUGH@9`R)+@Fxo#TuN;chWK9T3X3qZ}sh7>;QA;=ZN62 z5&emim${eJ!+PW#yoC2a@X0YlRaG_C8Ta7(3eZK0Jx>cK=0XF`3QmRMIKqD}NA8aW z?tb{&aF$rm(fR$;bh#JgSUdT;rT*U2uFHs()&9@#5**6)a6HkUpahxS{%G0^edqm9 z$t{I-Bl4aMtUyS%Jy?%(ki%A)4&uX!?cgB70V|v$7ZCZHS6C!zow^*%0WBJ1z={dF ze4O+?p@;x@a=kZlyQm<;2)J#}%V`a`!HSEIM?4717F=ealz@$f*)Z63s6XL8mIAcM?y;e^u0;5{ji9I z1syS$tqHK5%_kk`;VDRf@Ym{(vQ5dBf#l=T{nJPJ!J?EWlfI3wjY_xy>ybhk;3-SS zjoY5?tRy4e&i}Tr*JOm}{XP#vlt8{|4MZJVNyZTtPSb5`Aq))w!wZ(onLlTD-oiAU zn6s|?E=XfMO9Dcdml>=3msLQ52MFni!P}1xDmwQ-q_-;u;zDlVIjb;zd#F9Z4T87z zH-O+P*iGB~M<8DLn_^W4LMt`vTu=OZwoI=gfguB4`#JnDx85HOemmIC^d14hZIxe&7DtoQt}n36 z6?;-K{-fLL#pSKp25nw)nSuhvYtwM_1Max?TljDRP4NC~`S#VK-KW{h1EV#UCao5C z4$+@!CWBGiir#lPaM3N`PCM66KUZp2tu%93&3wFDOy#mO19?3VkjWn>1Sb&4u832- z{vT{?F-c7dR>oZ%b~eDE3;_VX2rVwq+A<+%h96M40|i^eQ}7+E%(zk$Xykm#S!o7} zWA?xtoSzMTa6D?aFSaz$dUR@VnqCqfneAx1lxwc$Ux?zD=$%h02l_aBA0avZ*Ghgix^3%^Cm&7I zKzekzP{4Z}gpthl%A!{L)V<{a;H2vSL)r#Ux0dEOA`+8(uoBHUIR8CrXrQT{Bwhq0 zCcvx|fE;K(@hsHf!53(4`AsVDg@f#BGxI9V(B{b1sRREaA zlc@Vu`sz)2^BEdQ^Gx9JRYJm1ELxg_5g_%yD#+V9Y%!t>5e2XQxb2@H$YC)R3fPH> zqR3S~zS)Epmw~fgWz@?3`1 z^HmW!L#$wE#VUCI=iZ$Wh>mdGjqETtJAy#P8ao&XNbapZ9=XD|)G+Ud z^(CNAs8|Kn-}(-k3xSkci^uf{j|;3URwj>-=c@^4R3oc-3Ru(i9%4I_o-iWMhtuAd zMu%+I>^2J@;W1r_*g9wzcn5ZYB^GhA6eXxczJP~=KNDf+Al?9xZU;O&0=2iBNgCB< z2wSy^nKh-}Y~x|w;@3Ab^3m1cB*Kd_aK#R@;S_gr86ggENlNU$@HFQY|H*H`rb)-{ z)__h!kg6|}`QA5?y$N5l=XL|tF>XMU{D#|C4br`R4zIpexnEiWu{your#<9@J(vRc z7LfmJ0_8t$Zv5JJjvT{C4U#$I2Q-8jDtdaLrUrN6_u{!N<1l9{kOU8aOe-Zm@OvQz zAqF^CN#7|{^rWLc{NysQKXVOO1d1M!f*=b})zeGA96=+m(s>KuiTe#BE^&h>Ifd)k+yKN)$$;z}hem-C3+2Hi{S}eoTq{|%R{E$& zv=k*sOVUUJ_kpy386mc;CDt`ov{6Vl2U0 z#NM!Ji?;@x0wnM~cJK+P4;(w9j}hB8_&i6)hu6`kbvE{FgH71JUDtiXlOV@MigpO|K6c(anjwYUi)I6-)2)J1NUm$4$ zm)LsS*^^NWqV8}(MYGD~`-d>CvAIVOzyh^PQGQZ8HqwhpjoW_+Ym_yjsv~Lda$N_HeP@?z7I}z9-Mdd$Pcn#0kT1;!Sy) zypim?UVl26$aRh@EmyxO*c)OS!0&kBG= z-fZ473?fNrQQu1IIePC0#2dL92*{DZHAb!26XN3F-H+!)XNO0wpw!1{vjEJ;S%xF% zc=-wrI1XCC9?5J8YTODp01hsWS2F?9Gvml&+EW2H*=mt3(L~o6$?V4CAX%{fC`nBQ zgTdT0Q4H#lyFlpC=KAILwf^2d95hktJphr~t-@?G5St{{tp?U2HT4#0%qN$bA2EuIxRWs0l&cvt}i2L z&D;DBC!IW_$y|2&S4nF0@xw98nWJ!}I3}hUV8oDDy-&Ld!Ubo+q{y4J^Z75C(|lXN zA1xf;69d%iI>X}LkK^YP*!pg}d5J($709Qa{%B}{-vg=FjUfn_KwP*EESxnP132T! z51`2bF5-BxHysMfPE8rTmf%$ac?J?j-G(Tz;ttEsv#jQ0za+~Wfe|`ty|?AGo)cbe z{oV*t_gx^R8hhRLx&0Zufg5Ny$^u-n@oyk;N-g3oV8%TIs+d)vk;eV%pue given\./' # Require a redesign of the underlying Symfony components - - '#Panthere\\[a-zA-Z\\]+::__construct\(\) does not call parent constructor from Symfony\\Component\\(BrowserKit|DomCrawler)\\[a-zA-Z]+\.#' + - '#Panther\\[a-zA-Z\\]+::__construct\(\) does not call parent constructor from Symfony\\Component\\(BrowserKit|DomCrawler)\\[a-zA-Z]+\.#' diff --git a/src/Client.php b/src/Client.php index 2b33736a..e3fdacc1 100644 --- a/src/Client.php +++ b/src/Client.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere; +namespace Symfony\Component\Panther; use Facebook\WebDriver\WebDriver; use Facebook\WebDriver\WebDriverBy; @@ -22,13 +22,13 @@ use Symfony\Component\BrowserKit\Response; use Symfony\Component\DomCrawler\Form; use Symfony\Component\DomCrawler\Link; -use Symfony\Component\Panthere\Cookie\CookieJar; -use Symfony\Component\Panthere\DomCrawler\Crawler; -use Symfony\Component\Panthere\DomCrawler\Form as PanthereForm; -use Symfony\Component\Panthere\DomCrawler\Link as PanthereLink; -use Symfony\Component\Panthere\ProcessManager\BrowserManagerInterface; -use Symfony\Component\Panthere\ProcessManager\ChromeManager; -use Symfony\Component\Panthere\ProcessManager\SeleniumManager; +use Symfony\Component\Panther\Cookie\CookieJar; +use Symfony\Component\Panther\DomCrawler\Crawler; +use Symfony\Component\Panther\DomCrawler\Form as PantherForm; +use Symfony\Component\Panther\DomCrawler\Link as PantherLink; +use Symfony\Component\Panther\ProcessManager\BrowserManagerInterface; +use Symfony\Component\Panther\ProcessManager\ChromeManager; +use Symfony\Component\Panther\ProcessManager\SeleniumManager; /** * @author Kévin Dunglas @@ -123,7 +123,7 @@ public function getServerParameter($key, $default = '') public function click(Link $link) { - if ($link instanceof PanthereLink) { + if ($link instanceof PantherLink) { $link->getElement()->click(); return $this->crawler = $this->createCrawler(); @@ -134,7 +134,7 @@ public function click(Link $link) public function submit(Form $form, array $values = []) { - if ($form instanceof PanthereForm) { + if ($form instanceof PantherForm) { $button = $form->getButton(); null === $button ? $form->getElement()->submit() : $button->click(); diff --git a/src/Cookie/CookieJar.php b/src/Cookie/CookieJar.php index 2a1ce06d..d8da5d53 100644 --- a/src/Cookie/CookieJar.php +++ b/src/Cookie/CookieJar.php @@ -1,7 +1,7 @@ * @@ -11,14 +11,14 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Cookie; +namespace Symfony\Component\Panther\Cookie; use Facebook\WebDriver\Cookie as WebDriverCookie; use Facebook\WebDriver\WebDriver; use Symfony\Component\BrowserKit\Cookie; use Symfony\Component\BrowserKit\CookieJar as BaseCookieJar; use Symfony\Component\BrowserKit\Response; -use Symfony\Component\Panthere\ExceptionThrower; +use Symfony\Component\Panther\ExceptionThrower; /** * @author Kévin Dunglas diff --git a/src/DomCrawler/Crawler.php b/src/DomCrawler/Crawler.php index 63a1355d..bd2a7db0 100644 --- a/src/DomCrawler/Crawler.php +++ b/src/DomCrawler/Crawler.php @@ -1,7 +1,7 @@ * @@ -11,14 +11,14 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler; +namespace Symfony\Component\Panther\DomCrawler; use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\WebDriver; use Facebook\WebDriver\WebDriverBy; use Facebook\WebDriver\WebDriverElement; use Symfony\Component\DomCrawler\Crawler as BaseCrawler; -use Symfony\Component\Panthere\ExceptionThrower; +use Symfony\Component\Panther\ExceptionThrower; /** * @author Kévin Dunglas diff --git a/src/DomCrawler/Field/ChoiceFormField.php b/src/DomCrawler/Field/ChoiceFormField.php index 59d73305..2c8a9eec 100644 --- a/src/DomCrawler/Field/ChoiceFormField.php +++ b/src/DomCrawler/Field/ChoiceFormField.php @@ -1,7 +1,7 @@ * @@ -11,12 +11,12 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler\Field; +namespace Symfony\Component\Panther\DomCrawler\Field; use Facebook\WebDriver\WebDriverSelect; use Facebook\WebDriver\WebDriverSelectInterface; use Symfony\Component\DomCrawler\Field\ChoiceFormField as BaseChoiceFormField; -use Symfony\Component\Panthere\WebDriver\WebDriverCheckbox; +use Symfony\Component\Panther\WebDriver\WebDriverCheckbox; /** * @author Kévin Dunglas diff --git a/src/DomCrawler/Field/FormFieldTrait.php b/src/DomCrawler/Field/FormFieldTrait.php index 4eeae2aa..852e87f7 100644 --- a/src/DomCrawler/Field/FormFieldTrait.php +++ b/src/DomCrawler/Field/FormFieldTrait.php @@ -1,7 +1,7 @@ * @@ -11,10 +11,10 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler\Field; +namespace Symfony\Component\Panther\DomCrawler\Field; use Facebook\WebDriver\WebDriverElement; -use Symfony\Component\Panthere\ExceptionThrower; +use Symfony\Component\Panther\ExceptionThrower; /** * @internal diff --git a/src/DomCrawler/Field/InputFormField.php b/src/DomCrawler/Field/InputFormField.php index 01c348f4..a745ea8e 100644 --- a/src/DomCrawler/Field/InputFormField.php +++ b/src/DomCrawler/Field/InputFormField.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler\Field; +namespace Symfony\Component\Panther\DomCrawler\Field; use Symfony\Component\DomCrawler\Field\InputFormField as BaseInputFormField; diff --git a/src/DomCrawler/Field/TextareaFormField.php b/src/DomCrawler/Field/TextareaFormField.php index 85462287..7d812756 100644 --- a/src/DomCrawler/Field/TextareaFormField.php +++ b/src/DomCrawler/Field/TextareaFormField.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler\Field; +namespace Symfony\Component\Panther\DomCrawler\Field; use Symfony\Component\DomCrawler\Field\TextareaFormField as BaseTextareaFormField; diff --git a/src/DomCrawler/Form.php b/src/DomCrawler/Form.php index 7dbfb323..0b6cf932 100644 --- a/src/DomCrawler/Form.php +++ b/src/DomCrawler/Form.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler; +namespace Symfony\Component\Panther\DomCrawler; use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\Support\XPathEscaper; @@ -22,11 +22,11 @@ use Facebook\WebDriver\WebDriverSelectInterface; use Symfony\Component\DomCrawler\Field\FormField; use Symfony\Component\DomCrawler\Form as BaseForm; -use Symfony\Component\Panthere\DomCrawler\Field\ChoiceFormField; -use Symfony\Component\Panthere\DomCrawler\Field\InputFormField; -use Symfony\Component\Panthere\DomCrawler\Field\TextareaFormField; -use Symfony\Component\Panthere\ExceptionThrower; -use Symfony\Component\Panthere\WebDriver\WebDriverCheckbox; +use Symfony\Component\Panther\DomCrawler\Field\ChoiceFormField; +use Symfony\Component\Panther\DomCrawler\Field\InputFormField; +use Symfony\Component\Panther\DomCrawler\Field\TextareaFormField; +use Symfony\Component\Panther\ExceptionThrower; +use Symfony\Component\Panther\WebDriver\WebDriverCheckbox; /** * @author Kévin Dunglas diff --git a/src/DomCrawler/Image.php b/src/DomCrawler/Image.php index a3472785..b1f51fca 100644 --- a/src/DomCrawler/Image.php +++ b/src/DomCrawler/Image.php @@ -1,7 +1,7 @@ * @@ -11,11 +11,11 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler; +namespace Symfony\Component\Panther\DomCrawler; use Facebook\WebDriver\WebDriverElement; use Symfony\Component\DomCrawler\Image as BaseImage; -use Symfony\Component\Panthere\ExceptionThrower; +use Symfony\Component\Panther\ExceptionThrower; /** * @author Kévin Dunglas diff --git a/src/DomCrawler/Link.php b/src/DomCrawler/Link.php index cbbbdcca..8111ce13 100644 --- a/src/DomCrawler/Link.php +++ b/src/DomCrawler/Link.php @@ -1,7 +1,7 @@ * @@ -11,11 +11,11 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\DomCrawler; +namespace Symfony\Component\Panther\DomCrawler; use Facebook\WebDriver\WebDriverElement; use Symfony\Component\DomCrawler\Link as BaseLink; -use Symfony\Component\Panthere\ExceptionThrower; +use Symfony\Component\Panther\ExceptionThrower; /** * @author Kévin Dunglas diff --git a/src/ExceptionThrower.php b/src/ExceptionThrower.php index 9d521361..b024fde7 100644 --- a/src/ExceptionThrower.php +++ b/src/ExceptionThrower.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere; +namespace Symfony\Component\Panther; /** * @internal diff --git a/src/PanthereTestCase.php b/src/PantherTestCase.php similarity index 58% rename from src/PanthereTestCase.php rename to src/PantherTestCase.php index 88ee10f6..acb4cf4b 100644 --- a/src/PanthereTestCase.php +++ b/src/PantherTestCase.php @@ -1,7 +1,7 @@ * @@ -11,19 +11,19 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere; +namespace Symfony\Component\Panther; use PHPUnit\Framework\TestCase; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; if (\class_exists(WebTestCase::class)) { - abstract class PanthereTestCase extends WebTestCase + abstract class PantherTestCase extends WebTestCase { - use PanthereTestCaseTrait; + use PantherTestCaseTrait; } } else { - abstract class PanthereTestCase extends TestCase + abstract class PantherTestCase extends TestCase { - use PanthereTestCaseTrait; + use PantherTestCaseTrait; } } diff --git a/src/PanthereTestCaseTrait.php b/src/PantherTestCaseTrait.php similarity index 72% rename from src/PanthereTestCaseTrait.php rename to src/PantherTestCaseTrait.php index cb6d5ed5..7ea19143 100644 --- a/src/PanthereTestCaseTrait.php +++ b/src/PantherTestCaseTrait.php @@ -1,7 +1,7 @@ * @@ -11,12 +11,12 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere; +namespace Symfony\Component\Panther; use Goutte\Client as GoutteClient; use GuzzleHttp\Client as GuzzleClient; -use Symfony\Component\Panthere\Client as PanthereClient; -use Symfony\Component\Panthere\ProcessManager\WebServerManager; +use Symfony\Component\Panther\Client as PantherClient; +use Symfony\Component\Panther\ProcessManager\WebServerManager; /** * Eases conditional class definition. @@ -25,7 +25,7 @@ * * @author Kévin Dunglas */ -trait PanthereTestCaseTrait +trait PantherTestCaseTrait { /** * @var string|null @@ -48,9 +48,9 @@ trait PanthereTestCaseTrait protected static $goutteClient; /** - * @var PanthereClient|null + * @var PantherClient|null */ - protected static $panthereClient; + protected static $pantherClient; public static function tearDownAfterClass() { @@ -59,9 +59,9 @@ public static function tearDownAfterClass() self::$webServerManager = null; } - if (null !== self::$panthereClient) { - self::$panthereClient->quit(); - self::$panthereClient = null; + if (null !== self::$pantherClient) { + self::$pantherClient->quit(); + self::$pantherClient = null; } if (null !== self::$goutteClient) { @@ -78,8 +78,8 @@ protected static function startWebServer(?string $webServerDir = null, string $h } if (null === $webServerDir) { - // Try the local $webServerDir property, or the PANTHERE_WEB_SERVER_DIR env var or default to the Flex directory structure - $webServerDir = static::$webServerDir ?? $_SERVER['PANTHERE_WEB_SERVER_DIR'] ?? __DIR__.'/../../../../public'; + // Try the local $webServerDir property, or the PANTHER_WEB_SERVER_DIR env var or default to the Flex directory structure + $webServerDir = static::$webServerDir ?? $_SERVER['PANTHER_WEB_SERVER_DIR'] ?? __DIR__.'/../../../../public'; } self::$webServerManager = new WebServerManager($webServerDir, $hostname, $port); @@ -88,14 +88,14 @@ protected static function startWebServer(?string $webServerDir = null, string $h self::$baseUri = "http://$hostname:$port"; } - protected static function createPanthereClient(string $hostname = '127.0.0.1', int $port = 9000): PanthereClient + protected static function createPantherClient(string $hostname = '127.0.0.1', int $port = 9000): PantherClient { self::startWebServer(null, $hostname, $port); - if (null === self::$panthereClient) { - self::$panthereClient = Client::createChromeClient(null, null, [], self::$baseUri); + if (null === self::$pantherClient) { + self::$pantherClient = Client::createChromeClient(null, null, [], self::$baseUri); } - return self::$panthereClient; + return self::$pantherClient; } protected static function createGoutteClient(): GoutteClient diff --git a/src/ProcessManager/BrowserManagerInterface.php b/src/ProcessManager/BrowserManagerInterface.php index 18f0c2d6..a490e2e1 100644 --- a/src/ProcessManager/BrowserManagerInterface.php +++ b/src/ProcessManager/BrowserManagerInterface.php @@ -1,7 +1,7 @@ * @@ -19,7 +19,7 @@ * file that was distributed with this source code. */ -namespace Symfony\Component\Panthere\ProcessManager; +namespace Symfony\Component\Panther\ProcessManager; use Facebook\WebDriver\WebDriver; diff --git a/src/ProcessManager/ChromeManager.php b/src/ProcessManager/ChromeManager.php index 15a614d9..f9f093e5 100644 --- a/src/ProcessManager/ChromeManager.php +++ b/src/ProcessManager/ChromeManager.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\ProcessManager; +namespace Symfony\Component\Panther\ProcessManager; use Facebook\WebDriver\Chrome\ChromeOptions; use Facebook\WebDriver\Remote\DesiredCapabilities; @@ -66,17 +66,15 @@ public function quit(): void private function findChromeDriverBinary(): string { - if ($binary = $_SERVER['PANTHERE_CHROME_DRIVER_BINARY'] ?? null) { + if ($binary = $_SERVER['PANTHER_CHROME_DRIVER_BINARY'] ?? null) { return $binary; } switch (PHP_OS_FAMILY) { case 'Windows': return __DIR__.'/../../chromedriver-bin/chromedriver.exe'; - break; case 'Darwin': return __DIR__.'/../../chromedriver-bin/chromedriver_mac64'; - break; default: return __DIR__.'/../../chromedriver-bin/chromedriver_linux64'; } @@ -84,11 +82,11 @@ private function findChromeDriverBinary(): string private function getDefaultArguments(): array { - // Enable the headless mode unless PANTHERE_NO_HEADLESS is defined - $args = ($_SERVER['PANTHERE_NO_HEADLESS'] ?? false) ? [] : ['--headless', 'window-size=1200,1100', '--disable-gpu']; + // Enable the headless mode unless PANTHER_NO_HEADLESS is defined + $args = ($_SERVER['PANTHER_NO_HEADLESS'] ?? false) ? [] : ['--headless', 'window-size=1200,1100', '--disable-gpu']; - // Disable Chrome's sandbox if PANTHERE_NO_SANDBOX is defined or if running in Travis - if ($_SERVER['PANTHERE_NO_SANDBOX'] ?? $_SERVER['HAS_JOSH_K_SEAL_OF_APPROVAL'] ?? false) { + // Disable Chrome's sandbox if PANTHER_NO_SANDBOX is defined or if running in Travis + if ($_SERVER['PANTHER_NO_SANDBOX'] ?? $_SERVER['HAS_JOSH_K_SEAL_OF_APPROVAL'] ?? false) { // Running in Travis, disabling the sandbox mode $args[] = '--no-sandbox'; } diff --git a/src/ProcessManager/SeleniumManager.php b/src/ProcessManager/SeleniumManager.php index d2899247..86231c65 100644 --- a/src/ProcessManager/SeleniumManager.php +++ b/src/ProcessManager/SeleniumManager.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\ProcessManager; +namespace Symfony\Component\Panther\ProcessManager; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; diff --git a/src/ProcessManager/WebServerManager.php b/src/ProcessManager/WebServerManager.php index fb161b35..86909709 100644 --- a/src/ProcessManager/WebServerManager.php +++ b/src/ProcessManager/WebServerManager.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\ProcessManager; +namespace Symfony\Component\Panther\ProcessManager; use Symfony\Component\Process\PhpExecutableFinder; use Symfony\Component\Process\Process; diff --git a/src/ProcessManager/WebServerReadinessProbeTrait.php b/src/ProcessManager/WebServerReadinessProbeTrait.php index 344f00a2..abd542f0 100644 --- a/src/ProcessManager/WebServerReadinessProbeTrait.php +++ b/src/ProcessManager/WebServerReadinessProbeTrait.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\ProcessManager; +namespace Symfony\Component\Panther\ProcessManager; use Symfony\Component\Process\Process; diff --git a/src/WebDriver/WebDriverCheckbox.php b/src/WebDriver/WebDriverCheckbox.php index 42487c12..29622bd5 100644 --- a/src/WebDriver/WebDriverCheckbox.php +++ b/src/WebDriver/WebDriverCheckbox.php @@ -1,7 +1,7 @@ * @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\WebDriver; +namespace Symfony\Component\Panther\WebDriver; use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\Exception\UnexpectedTagNameException; diff --git a/tests/ClientTest.php b/tests/ClientTest.php index 388bf1b3..2737e99f 100644 --- a/tests/ClientTest.php +++ b/tests/ClientTest.php @@ -1,7 +1,7 @@ * @@ -11,16 +11,16 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests; +namespace Symfony\Component\Panther\Tests; use Facebook\WebDriver\WebDriver; use Symfony\Component\BrowserKit\Client as BrowserKitClient; use Symfony\Component\BrowserKit\Cookie; use Symfony\Component\BrowserKit\CookieJar as BrowserKitCookieJar; use Symfony\Component\DomCrawler\Crawler as DomCrawlerCrawler; -use Symfony\Component\Panthere\Client; -use Symfony\Component\Panthere\Cookie\CookieJar; -use Symfony\Component\Panthere\DomCrawler\Crawler; +use Symfony\Component\Panther\Client; +use Symfony\Component\Panther\Cookie\CookieJar; +use Symfony\Component\Panther\DomCrawler\Crawler; /** * @author Kévin Dunglas @@ -29,7 +29,7 @@ class ClientTest extends TestCase { public function testCreateClient() { - $client = self::createPanthereClient(); + $client = self::createPantherClient(); $this->assertInstanceOf(BrowserKitClient::class, $client); $this->assertInstanceOf(WebDriver::class, $client); } diff --git a/tests/DomCrawler/CrawlerTest.php b/tests/DomCrawler/CrawlerTest.php index 3c997d75..6672d0b6 100644 --- a/tests/DomCrawler/CrawlerTest.php +++ b/tests/DomCrawler/CrawlerTest.php @@ -1,7 +1,7 @@ * @@ -11,14 +11,14 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests\DomCrawler; +namespace Symfony\Component\Panther\Tests\DomCrawler; use Facebook\WebDriver\WebDriverElement; use Symfony\Component\DomCrawler\Crawler; -use Symfony\Component\Panthere\Client; -use Symfony\Component\Panthere\DomCrawler\Image; -use Symfony\Component\Panthere\DomCrawler\Link; -use Symfony\Component\Panthere\Tests\TestCase; +use Symfony\Component\Panther\Client; +use Symfony\Component\Panther\DomCrawler\Image; +use Symfony\Component\Panther\DomCrawler\Link; +use Symfony\Component\Panther\Tests\TestCase; /** * @author Kévin Dunglas @@ -27,7 +27,7 @@ class CrawlerTest extends TestCase { public function testCreateCrawler(): void { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/basic.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/basic.html'); $this->assertInstanceOf(Crawler::class, $crawler); $this->assertInstanceOf(WebDriverElement::class, $crawler); } diff --git a/tests/DomCrawler/FormTest.php b/tests/DomCrawler/FormTest.php index 3a96198d..cd602a47 100644 --- a/tests/DomCrawler/FormTest.php +++ b/tests/DomCrawler/FormTest.php @@ -1,7 +1,7 @@ * @@ -11,10 +11,10 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests\DomCrawler; +namespace Symfony\Component\Panther\Tests\DomCrawler; use Symfony\Component\DomCrawler\Field\ChoiceFormField; -use Symfony\Component\Panthere\Tests\TestCase; +use Symfony\Component\Panther\Tests\TestCase; /** * @author Kévin Dunglas diff --git a/tests/ProcessManager/ChromeManagerTest.php b/tests/ProcessManager/ChromeManagerTest.php index 677458b0..7cf0d6bf 100644 --- a/tests/ProcessManager/ChromeManagerTest.php +++ b/tests/ProcessManager/ChromeManagerTest.php @@ -1,7 +1,7 @@ * @@ -11,10 +11,10 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests\ProcessManager; +namespace Symfony\Component\Panther\Tests\ProcessManager; use PHPUnit\Framework\TestCase; -use Symfony\Component\Panthere\ProcessManager\ChromeManager; +use Symfony\Component\Panther\ProcessManager\ChromeManager; /** * @author Kévin Dunglas diff --git a/tests/ProcessManager/SeleniumManagerTest.php b/tests/ProcessManager/SeleniumManagerTest.php index 7f4fc086..6233924c 100644 --- a/tests/ProcessManager/SeleniumManagerTest.php +++ b/tests/ProcessManager/SeleniumManagerTest.php @@ -1,7 +1,7 @@ * @@ -11,12 +11,12 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests\ProcessManager; +namespace Symfony\Component\Panther\Tests\ProcessManager; use Facebook\WebDriver\Chrome\ChromeOptions; use PHPUnit\Framework\TestCase; -use Symfony\Component\Panthere\ProcessManager\ChromeManager; -use Symfony\Component\Panthere\ProcessManager\SeleniumManager; +use Symfony\Component\Panther\ProcessManager\ChromeManager; +use Symfony\Component\Panther\ProcessManager\SeleniumManager; /** * @author Dmitry Kuzmin diff --git a/tests/ProcessManager/WebServerManagerTest.php b/tests/ProcessManager/WebServerManagerTest.php index a543d1d3..8dd10f42 100644 --- a/tests/ProcessManager/WebServerManagerTest.php +++ b/tests/ProcessManager/WebServerManagerTest.php @@ -1,7 +1,7 @@ * @@ -11,10 +11,10 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests\ProcessManager; +namespace Symfony\Component\Panther\Tests\ProcessManager; use PHPUnit\Framework\TestCase; -use Symfony\Component\Panthere\ProcessManager\WebServerManager; +use Symfony\Component\Panther\ProcessManager\WebServerManager; /** * @author Kévin Dunglas diff --git a/tests/TestCase.php b/tests/TestCase.php index 9c4b87cb..348a270a 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,7 +1,7 @@ * @@ -11,26 +11,26 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests; +namespace Symfony\Component\Panther\Tests; use Goutte\Client as GoutteClient; use Symfony\Component\DomCrawler\Crawler; -use Symfony\Component\Panthere\Client as PanthereClient; -use Symfony\Component\Panthere\PanthereTestCase; +use Symfony\Component\Panther\Client as PantherClient; +use Symfony\Component\Panther\PantherTestCase; /** * @author Kévin Dunglas */ -abstract class TestCase extends PanthereTestCase +abstract class TestCase extends PantherTestCase { protected static $webServerDir = __DIR__.'/fixtures'; public function clientFactoryProvider(): array { - // Tests must pass with both Panthere and Goutte + // Tests must pass with both Panther and Goutte return [ [[static::class, 'createGoutteClient'], GoutteClient::class], - [[static::class, 'createPanthereClient'], PanthereClient::class], + [[static::class, 'createPantherClient'], PantherClient::class], ]; } diff --git a/tests/WebDriver/WebDriverCheckBoxTest.php b/tests/WebDriver/WebDriverCheckBoxTest.php index 3e9962b8..5a8b2a84 100644 --- a/tests/WebDriver/WebDriverCheckBoxTest.php +++ b/tests/WebDriver/WebDriverCheckBoxTest.php @@ -1,7 +1,7 @@ * @@ -11,10 +11,10 @@ declare(strict_types=1); -namespace Symfony\Component\Panthere\Tests\WebDriver; +namespace Symfony\Component\Panther\Tests\WebDriver; -use Symfony\Component\Panthere\Tests\TestCase; -use Symfony\Component\Panthere\WebDriver\WebDriverCheckbox; +use Symfony\Component\Panther\Tests\TestCase; +use Symfony\Component\Panther\WebDriver\WebDriverCheckbox; /** * @author Kévin Dunglas @@ -23,7 +23,7 @@ class WebDriverCheckBoxTest extends TestCase { public function testWebDriverCheckboxIsMultiple() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $checkboxElement = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($checkboxElement); @@ -39,7 +39,7 @@ public function testWebDriverCheckboxIsMultiple() */ public function testWebDriverCheckboxGetOptions(string $type, array $options) { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath("//input[@type='$type']")->getElement(0); $c = new WebDriverCheckbox($element); @@ -61,7 +61,7 @@ public function getOptionsDataProvider() public function testWebDriverCheckboxGetFirstSelectedOption() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $checkboxElement = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($checkboxElement); @@ -79,7 +79,7 @@ public function testWebDriverCheckboxGetFirstSelectedOption() */ public function testWebDriverCheckboxSelectByValue(string $type, array $selectedOptions) { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath("//input[@type='$type']")->getElement(0); $c = new WebDriverCheckbox($element); @@ -107,7 +107,7 @@ public function selectByValueDataProvider() */ public function testWebDriverCheckboxSelectByValueInvalid() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -119,7 +119,7 @@ public function testWebDriverCheckboxSelectByValueInvalid() */ public function testWebDriverCheckboxSelectByIndex(string $type, array $selectedOptions) { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath("//input[@type='$type']")->getElement(0); $c = new WebDriverCheckbox($element); @@ -147,7 +147,7 @@ public function selectByIndexDataProvider() */ public function testWebDriverCheckboxSelectByIndexInvalid() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -159,7 +159,7 @@ public function testWebDriverCheckboxSelectByIndexInvalid() */ public function testWebDriverCheckboxSelectByVisibleText(string $type, string $text, string $value) { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath("//input[@type='$type']")->getElement(0); $c = new WebDriverCheckbox($element); @@ -182,7 +182,7 @@ public function selectByVisibleTextDataProvider() */ public function testWebDriverCheckboxSelectByVisiblePartialText(string $type, string $text, string $value) { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath("//input[@type='$type']")->getElement(0); $c = new WebDriverCheckbox($element); @@ -202,7 +202,7 @@ public function selectByVisiblePartialTextDataProvider() public function testWebDriverCheckboxDeselectAll() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -214,7 +214,7 @@ public function testWebDriverCheckboxDeselectAll() public function testWebDriverCheckboxDeselectByIndex() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -226,7 +226,7 @@ public function testWebDriverCheckboxDeselectByIndex() public function testWebDriverCheckboxDeselectByValue() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -238,7 +238,7 @@ public function testWebDriverCheckboxDeselectByValue() public function testWebDriverCheckboxDeselectByVisibleText() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -250,7 +250,7 @@ public function testWebDriverCheckboxDeselectByVisibleText() public function testWebDriverCheckboxDeselectByVisiblePartialText() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="checkbox"]')->getElement(0); $c = new WebDriverCheckbox($element); @@ -265,7 +265,7 @@ public function testWebDriverCheckboxDeselectByVisiblePartialText() */ public function testWebDriverCheckboxDeselectAllRadio() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="radio"]')->getElement(0); $c = new WebDriverCheckbox($element); $c->deselectAll(); @@ -276,7 +276,7 @@ public function testWebDriverCheckboxDeselectAllRadio() */ public function testWebDriverCheckboxDeselectByIndexRadio() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="radio"]')->getElement(0); $c = new WebDriverCheckbox($element); $c->deselectByIndex(0); @@ -287,7 +287,7 @@ public function testWebDriverCheckboxDeselectByIndexRadio() */ public function testWebDriverCheckboxDeselectByValueRadio() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="radio"]')->getElement(0); $c = new WebDriverCheckbox($element); $c->deselectByValue('val'); @@ -298,7 +298,7 @@ public function testWebDriverCheckboxDeselectByValueRadio() */ public function testWebDriverCheckboxDeselectByVisibleTextRadio() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="radio"]')->getElement(0); $c = new WebDriverCheckbox($element); $c->deselectByVisibleText('AB'); @@ -309,7 +309,7 @@ public function testWebDriverCheckboxDeselectByVisibleTextRadio() */ public function testWebDriverCheckboxDeselectByVisiblePartialTextRadio() { - $crawler = self::createPanthereClient()->request('GET', self::$baseUri.'/form.html'); + $crawler = self::createPantherClient()->request('GET', self::$baseUri.'/form.html'); $element = $crawler->filterXPath('//input[@type="radio"]')->getElement(0); $c = new WebDriverCheckbox($element); $c->deselectByVisiblePartialText('AB');