The Agenda
This tutorial explains how to write a script that would tale a list of URLs, and create a snapshot images with them. Next time when you run the script it will compare the images and alert if there are some differences.
This is very helpful while active developing because it could identify unexpected changes in the pages and potential errors.
Run Selenium standalone server
Download Selenium Standalone Server from here
You could put the jar file wherever you want but I personally prefer to keep things more organized and to put it in my home directory.
cp selenium-server-standalone-3.141.59.jar ~/.
Also we could create a shell script to start the server.
./start-selenium.sh
java -jar selenium-server-standalone-3.141.59.jar
Start the server ./start-selenium.sh
and check if the server is running by navigating the browser to : http://localhost:4444/wd/hub/static/resource/hub.html
Install PHP composer.
Next step will be to install composer in our home folder, since we will need it to install the webDriver. Create a new shell scripts with the following contents:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');"
then add execute rights chmod +x script.sh
and run the script. This will install the composer.
install webDriver
composer require facebook/webdriver
Install chrome driver
brew cask install chromedriver
And now let’s write some PHP code.
<?php use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\WebDriverBy; use Facebook\WebDriver\WebDriverDimension; use Facebook\WebDriver\WebDriverExpectedCondition; use Facebook\WebDriver\WebDriverPoint; $composer_dir = '/Users/toninichev/composer'; require_once $composer_dir . '/vendor/autoload.php'; $host = 'http://127.0.0.1:4444/wd/hub'; // this is the default port $driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome()); // Set size $driver->manage()->window()->setPosition(new WebDriverPoint(0,0)); $driver->manage()->window()->setSize(new WebDriverDimension(1280,800)); function takeScreenshot($driver, $url, $id) { // Navigate to the page $driver->get($url); $driver->wait(3); // Take a screenshot $driver->takeScreenshot(__DIR__ . "/screenshots/scr" . $id . "-tmp.png"); } $urls = array('https://www.toni-develops.com/', 'https://www.toni-develops.com/2017/04/27/git-bash-cheatsheet/', 'https://www.toni-develops.com/webpack/', 'https://www.toni-develops.com/algorithms/'); //$urls = array('https://www.toni-develops.com/', 'https://www.toni-develops.com/2017/04/27/git-bash-cheatsheet/'); $html = ''; for($i = 0; $i < count($urls); $i++) { takeScreenshot($driver,$urls[$i], $i); $a = sha1_file(__DIR__ . "/screenshots/scr" . $i . "-tmp.png"); $b = file_exists(__DIR__ . "/screenshots/scr" . $i . ".png") ? sha1_file(__DIR__ . "/screenshots/scr" . $i . ".png") : null; if($a == $b || $b == null) { $className = "match"; }else { $className = "noMatch"; } rename(__DIR__ . "/screenshots/scr" . $i . "-tmp.png", __DIR__ . "/screenshots/scr" . $i . ".png"); $html .= '<div class="picWrapper ' .$className . '"><div><input type="test" value="' . $urls[$i] . '" readonly /></div><img src="screenshots/scr' . $i . '.png"/></div>'; } // Close the Chrome browser $driver->quit(); ?> <html> <head> <style> .picWrapper input { width: 100%; text-align:center; } .picWrapper { text-align: center; } .match { background: green; } .noMatch { background: red; } </style> </head> <body> <?php echo $html; ?> </body> </html>