Poum - Mot-clé - forkDe la qualité logicielle, méthodes agiles et outils logiciels libres ...2023-08-25T16:53:12+01:00Poumurn:md5:6b5c625a812aff31ffa1cd1f3648e14bDotclearphp-webdriverurn:md5:55c68f3228a01f75bd61095b0ce765912012-01-31T11:08:00+01:002012-01-31T16:56:08+01:00PoumQualité logicielleforklicence ApachePEARPHPphp-webdriverPHPWebDriverSeleniumWebDriver<p><img src="http://philippe.poumaroux.free.fr/public/selenium-logo.png" alt="selenium-logo.png" title="selenium-logo.png, janv. 2012" /> <img src="http://philippe.poumaroux.free.fr/public/php-logo.png" alt="PHP" title="PHP, janv. 2012" /></p>
<p><a href="http://philippe.poumaroux.free.fr/index.php?tag/PHPWebDriver">PHPWebDriver</a> (<a href="https://github.com/Element-34/php-webdriver" title="https://github.com/Element-34/php-webdriver">https://github.com/Element-34/php-w...</a>) est un <a href="http://philippe.poumaroux.free.fr/index.php?tag/fork">fork</a> de projet Facebook <a href="http://philippe.poumaroux.free.fr/index.php?tag/php-webdriver">php-webdriver</a> (<a href="https://github.com/facebook/php-webdriver" title="https://github.com/facebook/php-webdriver">https://github.com/facebook/php-web...</a>) avec quelques différences:</p>
<ul>
<li>distribution via <a href="http://philippe.poumaroux.free.fr/index.php?tag/PEAR">PEAR</a></li>
<li>ajoute de la classe WebDriverWait</li>
<li>ajout de ActionChains</li>
<li>interface nettoyée pour réduire le couplage avec l'implémentation de <a href="http://philippe.poumaroux.free.fr/index.php?tag/WebDriver">WebDriver</a></li>
</ul>
<p>Ce fork résulte de l'insatisfaction de son auteur avec les autres implémentations <a href="http://philippe.poumaroux.free.fr/index.php?tag/PHP">PHP</a>. Pour mémoire, aucune de ces implémentations n'est officiellement soutenue par <a href="http://philippe.poumaroux.free.fr/index.php?tag/Selenium">Selenium</a>. Évidemment, c'est libre et distribué sous la <a href="http://philippe.poumaroux.free.fr/index.php?tag/licence%20Apache">licence Apache</a> 2 (comme le reste de la suite Selenium). L'auteur offre un support commercial et une correction prioritaire des bugs (<a href="http://element34.ca/blog" title="http://element34.ca/blog">http://element34.ca/blog</a>).</p>
<p>Ce qui suit est la traduction de la documentation actuellement fournie....</p> <h2>Description</h2>
<p>Ce client se veut aussi léger que possible en tirant partie de la nature dynamique de PHP pour permettre à presque tous les appels d'API d'être une transformation directe de ce qui est défini dans le protocole WebDriver lui-même.</p>
<p>La plupart des clients nécessitent d'abord de lire le protocole pour voir ce qui est possible, puis d'étudier le client lui-même pour voir comment l'appeler. Ce client-ci essaie de rendre inutile cette seconde étape, au lieu de quoi vous pouvez vous reposer exclusivement sur <a href="http://code.google.com/p/selenium/wiki/JsonWireProtocol" title="http://code.google.com/p/selenium/wiki/JsonWireProtocol">http://code.google.com/p/selenium/w...</a>.</p>
<p>Chaque commande correspond simplement au nom de l'appel de fonction et chaque chemin additionnel un autre appel de fonction chaîné. Le paramètre de la fonction est soit un array() si la commande prend des paramètres JSON, soit une primitive individuelle si elle attend une URL.</p>
<p>La valeur de retour de la fonction est exactement ce que le serveur renvoie comme partie de la définition du protocole. Si une erreur est renvoyée, la fonction va lancer l'instance appropriée de WebDriverException.</p>
<h2>Pour débuter</h2>
<p>Pour démarrer avec PHPWebDriver, il faut avoir PEAR d'installé, puis:</p>
<pre> $ sudo pear channel-discover element-34.github.com/pear
$ sudo pear install -f element-34/PHPWebDriver</pre>
<p>Comme serveur, tout ce dont vous avez besoin est le fichier selenium-server-standalone-#.jar fourni ici: <a href="http://code.google.com/p/selenium/downloads/list" title="http://code.google.com/p/selenium/downloads/list">http://code.google.com/p/selenium/d...</a></p>
<p>Téléchargez et lancer ce fichier en remplaçant # par la version actuelle du serveur.</p>
<pre> $ java -jar selenium-server-standalone-#.jar</pre>
<p>Puis, quand la session est créée, assurez-vous de passer l'URL correspondant à l'endroit où le serveur s'excute.</p>
<pre> // Ceci doit être l'URL de la machine exécutant server-standalone.jar
$wd_host = 'http://localhost:4444/wd/hub';
$web_driver = new PHPWebDriver_WebDriver($wd_host);
// Le premier paramètre de session() est le 'browserName' (default = 'firefox')
// Le second paramètre est un objet JSON contenant les 'desiredCapabilities' additionnelles
// POST /session
$session = $web_driver->session('firefox');</pre>
<h2>Exemples simples</h2>
<p>Notez qu'ils suivent tous exactement le protocole.</p>
<ul>
<li>Se placer à un endroit précis de l'écran</li>
</ul>
<pre> // POST /session/:sessionId/moveto
$session->moveto(array('xoffset' => 3, 'yoffset' => 300));</pre>
<ul>
<li>Récupérer l'URL actuelle</li>
</ul>
<pre> // GET /session/:sessionId/url
$session->url();</pre>
<ul>
<li>Changer le focus sur une autre frame</li>
</ul>
<pre> // POST /session/:sessionId/frame
$session->frame(array('id' => 'some_frame_id'));</pre>
<ul>
<li>Obtenir la liste des gestionnaires de fenêtre de toutes les fenêtres ouvertes</li>
</ul>
<pre> // GET /session/:sessionId/window_handles
$session->window_handles();</pre>
<ul>
<li>Acquitter la boîte d'avertissement (alert) actuellement affichée</li>
</ul>
<pre> // POST /session/:sessionId/accept_alert
$session->accept_alert();</pre>
<ul>
<li>Modifier le délai d'expiration du script asynchrone</li>
</ul>
<pre> // POST /session/:sessionId/timeouts/async_script
$session->timeouts()->async_script(array('ms' => 2000));</pre>
<ul>
<li>Double cliquer sur un élément sur un écran tactile</li>
</ul>
<pre> // POST session/:sessionId/touch/doubleclick
$session->touch()->doubleclick(array('element' => $element->getID())</pre>
<ul>
<li>Vérifier si 2 élements sont égaux</li>
</ul>
<pre> // GET /session/:sessionId/element/:id/equals/:other
$element->equals($other_element->getID()))</pre>
<ul>
<li>Obtenir la valeur d'un propriété CSS d'un élément</li>
</ul>
<pre> // GET /session/:sessionId/element/:id/css/:propertyName
$element->css($property_name)</pre>
<h2>GET, POST ou DELETE pour les mêmes exemples de commande</h2>
<p>Quand vous pouvez utiliser plusieurs méthodes HTTP pour la même commance, appelez la commande directement pour GET ou ajoutez la méthode HTTP pour POST ou DELETE.</p>
<ul>
<li>Choisir l'orientation paysage avec POST</li>
</ul>
<pre> // POST /session/:sessionId/orientation
$session->postOrientation(array('orientation' => 'LANDSCAPE'));</pre>
<ul>
<li>Récupérer l'orientation avec le GET normal</li>
</ul>
<pre> // GET /session/:sessionId/orientation
$session->orientation();</pre>
<ul>
<li>Régler la taille de la fenêtre attachée à $window_handle avec POST</li>
</ul>
<pre> // Si omis, $window_handle est mis par défaut à 'current'
// POST /session/:sessionId/window/:windowHandle/size
$session
->window($window_handle)
->postSize(array('width' => 10, 'height' => 10));</pre>
<ul>
<li>Obtenir la taille actuelle de la fenêtre avec GET</li>
</ul>
<pre> // GET /session/:sessionId/window/:windowHandle/size
$session->window()->size();</pre>
<h2>Quelques exceptions inévitables à la traduction directe du protocole</h2>
<ul>
<li>Ouvrir une page</li>
</ul>
<pre> // POST /session/:sessionId/url
$session->open('http://philippe.poumaroux.free.fr');</pre>
<ul>
<li>Interagir avec la session</li>
</ul>
<pre> // DELETE /session/:sessionId
$session->close();</pre>
<pre> // GET /session/:sessionId
$session->capabilities();</pre>
<ul>
<li>Trouver des éléments</li>
</ul>
<pre> // POST /session/:sessionId/element
$element = $session->element($using, $value);</pre>
<pre> // POST /session/:sessionId/elements
$session->elements($using, $value);</pre>
<pre> // POST /session/:sessionId/element/:id/element
$element->element($using, $value);</pre>
<pre> // POST /session/:sessionId/element/:id/elements
$element->elements($using, $value);</pre>
<ul>
<li>Obtenir l'élément actif</li>
</ul>
<pre> // POST /session/:sessionId/element/active
$session->activeElement();</pre>
<ul>
<li>Manipuler des cookies</li>
</ul>
<pre> // GET /session/:sessionId/cookie
$session->getAllCookies();
// GET /session/:sessionId/cookie
$session->getCookie($name);</pre>
<pre> // POST /session/:sessionId/cookie
//
// champs obligatoires de $cookie_array
// - nom: string
// - valeur: string
//
// champs facultatifs $cookie_array
// - chemin: string
// - domaine: string
// - sécurisé: boolean
// - expiration: nombre (secondes depuis epoch)
$session->setCookie($cookie_array);</pre>
<pre> // DELETE /session/:sessionId/cookie
$session->deleteAllCookies()</pre>
<pre> // DELETE /session/:sessionId/cookie/:name
$session->deleteCookie($name)</pre>
<ul>
<li>Manipuler des fenêtres</li>
</ul>
<pre> // POST /session/:sessionId/window
$session->focusWindow($window_handle);</pre>
<pre> // DELETE /session/:sessionId/window
$session->deleteWindow();</pre>
<h2>Attendre</h2>
<ul>
<li>Attendre un élément</li>
</ul>
<pre> $w = new PHPWebDriver_WebDriverWait($session);
$w->until(function($session) {$session->element("id", "overlayPanelProfileovolp-pad");});</pre>
<h2>Interagir avec des éléments</h2>
<ul>
<li>Envoyer des caractères via le protocole (beurk)</li>
</ul>
<pre> $e1 = $this->session->element("id", "un id");
$e1->value(array("value" => array("pumpkins")));</pre>
<ul>
<li>Envoyer des carctères un peu plus élégamment</li>
</ul>
<pre> $e2 = $this->session->element("id", "some id");
$e2->sendKeys("turtles");</pre>
<ul>
<li>Envoyer un caractère spécial (voir <a href="http://raw.github.com/element-34/php-webdriver/PHPWebDriverWebDriverKeys.php/" title="http://raw.github.com/element-34/php-webdriver/PHPWebDriverWebDriverKeys.php/">http://raw.github.com/element-34/ph...</a>)</li>
</ul>
<pre> $e3 = $this->session->element("id", "un id");
$e3->sendKeys(PHPWebDriver_WebDriverKeys::SpaceKey());</pre>
<ul>
<li>Faire défiler la page en utilisant la touche espace</li>
</ul>
<pre> $e4 = $this->session->element("tag name", "body");
$e4->sendKeys(PHPWebDriver_WebDriverKeys::SpaceKey());</pre>