1. Go to this page and download the library: Download symfony/panther library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
symfony / panther example snippets
use Symfony\Component\Panther\Client;
r, 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!
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
}
}
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
// ...
}
}
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 👋😻');
}
}
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
}
}
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 = self::createPantherClient([
'hostname' => 'example.com', // Defaults to 127.0.0.1
'port' => 8080, // Defaults to 9080
]);
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
}
}
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
}
}
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
}
}
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', '/');
}
}