State of Selenium Webdriver in PHP

Кто это такой

О чем пойдет речь

PHP Сейчас

Почему PHP

Особенности работы PHP

Типичный PHP

if (isset($_GET['code'])) {
  if (strval($_SESSION['state']) !== strval($_GET['state'])) {
    die('The session state did not match.');
  }

  $client->authenticate($_GET['code']);
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: ' . $redirect);
}

php программист после чтения чужого кода

Темное прошлое

Современный PHP

namespace Acme\HelloBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HelloController extends Controller
{
   /*
    * @Route("/{id}", requirements={"name" = "\w+"})
    */
    public function indexAction($name)
    {
        return $this->render(
            'Hello:index.html.twig', ['name' => $name]
        );
    }
}            

Современный php программист не боится читать код

Светлое настоящее

И очень светлое будущее

Фреймворки

Тренды

Selenium Webdriver

WebDriver

PHPUnit_Extensions_Selenium2TestCase

Демо

$this->url('index.php');

$form = $this->byCssSelector('form');

$action = $form->attribute('action');
$this->assertContains('admin.php', $action);

$this->byName('username')->value('davert');
$this->byName('password')->value('1234');
$form->submit();

$welcome = $this->byCssSelector('h1')->text();

$this->assertRegExp('/davert/i', $welcome);

Минусы

Плюсы

instaclick/php-webdriver
element34/php-webdriver

Демо

$wd->open("https://api.jquery.com/dblclick/");
$iframe = $wd->element(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "iframe");
$wd->moveto(array("element" => $iframe->getID()));
$wd->switch_to_frame($iframe);
$e = $wd->element(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div");
$clazz = $e->attribute('class');
$this->assertEquals(null, $clazz);
$ac = new PHPWebDriver_WebDriverActionChains($wd);
$ac->doubleClick($wd->element(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div"));
$ac->perform();

Минусы

Плюсы

facebook/php-webdriver

Демо

$search = $wd->findElement(WebDriverBy::id('js-command-bar-field'));
$search->click();
// typing into field
$wd->getKeyboard()->sendKeys('php-webdriver');
// pressing "Enter"
$wd->getKeyboard()->pressKey(WebDriverKeys::ENTER);
$firstResult = $wd->findElement(WebDriverBy::cssSelector('ul#list li'));
$firstResult->click();

Минусы

Плюсы

Сравним их!

Закажем билеты на сайте https://booking.uz.gov.ua/

Мы написали тесты для всех клиентов

github.com/DavertMik/WebDriverDemos

Заметки

Выводы

Бенчмарки на коленке

Testing Frameworks

Feature

Feature: Search
  In order to see a word definition
  As a website user
  I need to be able to search for a word

  Scenario: Searching for a page that does exist
    Given I am on "/wiki/Main_Page"
    When I fill in "search" with "Behavior Driven Development"
    And I press "searchButton"
    Then I should see "agile software development"
    

Step c PageObject

/**
 * @Given /^(?:|I )change my password$/
 */
public function iChangeMyPassword()
{
    // $page = get page...
    $page->login('kuba', '123123')
       ->changePassword('abcabc')
       ->logout();
}

Codeception

Тест

$I = new WebGuy($scenario);
$I->wantTo('create wiki page');
$I->amOnPage('/');
$I->click('Pages');
$I->click('New', '.nav');
$I->see('New Page');
$I->fillField('title', 'Hobbit');
$I->fillField('body', 'By Peter Jackson');
$I->click('#save');
$I->see('page created');

Тест с PageObject / StepObject

function createPage($title, $body)
{
  $this->amOnPage('/pages/new');
  $this->fillField(NewPage::$titleField, $title);
  $this->fillField(NewPage::$bodyField, $body);
  $this->click(NewPage::$saveButton);
}

$I = new WebGuy($scenario);
$I->wantTo('create wiki page');
$I->createPage('Hobbit', 'By Peter Jackson');
$I->see('page created'); // notice generated

Что где используется

Выводы

Что использовать

Спасибо за внимание. Боднарчук Михаил @davert