1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver\Remote; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Facebook\WebDriver\WebDriverBy; 6*04fd306cSNickeau 7*04fd306cSNickeau/** 8*04fd306cSNickeau * Compatibility layer between W3C's WebDriver and the legacy JsonWire protocol. 9*04fd306cSNickeau * 10*04fd306cSNickeau * @internal 11*04fd306cSNickeau */ 12*04fd306cSNickeauabstract class JsonWireCompat 13*04fd306cSNickeau{ 14*04fd306cSNickeau /** 15*04fd306cSNickeau * Element identifier defined in the W3C's WebDriver protocol. 16*04fd306cSNickeau * 17*04fd306cSNickeau * @see https://w3c.github.io/webdriver/webdriver-spec.html#elements 18*04fd306cSNickeau */ 19*04fd306cSNickeau const WEB_DRIVER_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf'; 20*04fd306cSNickeau 21*04fd306cSNickeau public static function getElement(array $rawElement) 22*04fd306cSNickeau { 23*04fd306cSNickeau if (array_key_exists(self::WEB_DRIVER_ELEMENT_IDENTIFIER, $rawElement)) { 24*04fd306cSNickeau // W3C's WebDriver 25*04fd306cSNickeau return $rawElement[self::WEB_DRIVER_ELEMENT_IDENTIFIER]; 26*04fd306cSNickeau } 27*04fd306cSNickeau 28*04fd306cSNickeau // Legacy JsonWire 29*04fd306cSNickeau return $rawElement['ELEMENT']; 30*04fd306cSNickeau } 31*04fd306cSNickeau 32*04fd306cSNickeau /** 33*04fd306cSNickeau * @param WebDriverBy $by 34*04fd306cSNickeau * @param bool $isW3cCompliant 35*04fd306cSNickeau * 36*04fd306cSNickeau * @return array 37*04fd306cSNickeau */ 38*04fd306cSNickeau public static function getUsing(WebDriverBy $by, $isW3cCompliant) 39*04fd306cSNickeau { 40*04fd306cSNickeau $mechanism = $by->getMechanism(); 41*04fd306cSNickeau $value = $by->getValue(); 42*04fd306cSNickeau 43*04fd306cSNickeau if ($isW3cCompliant) { 44*04fd306cSNickeau switch ($mechanism) { 45*04fd306cSNickeau // Convert to CSS selectors 46*04fd306cSNickeau case 'class name': 47*04fd306cSNickeau $mechanism = 'css selector'; 48*04fd306cSNickeau $value = sprintf('.%s', self::escapeSelector($value)); 49*04fd306cSNickeau break; 50*04fd306cSNickeau case 'id': 51*04fd306cSNickeau $mechanism = 'css selector'; 52*04fd306cSNickeau $value = sprintf('#%s', self::escapeSelector($value)); 53*04fd306cSNickeau break; 54*04fd306cSNickeau case 'name': 55*04fd306cSNickeau $mechanism = 'css selector'; 56*04fd306cSNickeau $value = sprintf('[name=\'%s\']', self::escapeSelector($value)); 57*04fd306cSNickeau break; 58*04fd306cSNickeau } 59*04fd306cSNickeau } 60*04fd306cSNickeau 61*04fd306cSNickeau return ['using' => $mechanism, 'value' => $value]; 62*04fd306cSNickeau } 63*04fd306cSNickeau 64*04fd306cSNickeau /** 65*04fd306cSNickeau * Escapes a CSS selector. 66*04fd306cSNickeau * 67*04fd306cSNickeau * Code adapted from the Zend Escaper project. 68*04fd306cSNickeau * 69*04fd306cSNickeau * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 70*04fd306cSNickeau * @see https://github.com/zendframework/zend-escaper/blob/master/src/Escaper.php 71*04fd306cSNickeau * 72*04fd306cSNickeau * @param string $selector 73*04fd306cSNickeau * @return string 74*04fd306cSNickeau */ 75*04fd306cSNickeau private static function escapeSelector($selector) 76*04fd306cSNickeau { 77*04fd306cSNickeau return preg_replace_callback('/[^a-z0-9]/iSu', function ($matches) { 78*04fd306cSNickeau $chr = $matches[0]; 79*04fd306cSNickeau if (mb_strlen($chr) === 1) { 80*04fd306cSNickeau $ord = ord($chr); 81*04fd306cSNickeau } else { 82*04fd306cSNickeau $chr = mb_convert_encoding($chr, 'UTF-32BE', 'UTF-8'); 83*04fd306cSNickeau $ord = hexdec(bin2hex($chr)); 84*04fd306cSNickeau } 85*04fd306cSNickeau 86*04fd306cSNickeau return sprintf('\\%X ', $ord); 87*04fd306cSNickeau }, $selector); 88*04fd306cSNickeau } 89*04fd306cSNickeau} 90