element-34 / php-webdriver
thin php client for webdriver
This package is not auto-updated.
Last update: 2024-09-22 02:56:11 UTC
README
描述
此客户端旨在尽可能薄,利用PHP的动态性质,允许几乎所有API调用都是WebDriver协议本身定义的直接转换。
大多数客户端都需要你首先阅读协议以了解可能的操作,然后研究客户端本身以了解如何调用它。本希望消除这一步骤,并邀请你几乎完全依赖Selenium JSON Wire Protocol。
每个命令只是函数调用的名称,每个额外的路径只是另一个链式函数调用。如果命令接受JSON参数,则函数参数为array()
,如果它接受URL参数,则为单个原始数据类型。
函数的返回值是协议定义中作为一部分从服务器返回的确切内容。如果返回错误,函数将抛出适当的WebDriverException
实例。
注意 - 这是一个维护的facebook/php-webdriver克隆,以下有一些不同
- 类名略有不同,以便在PEAR中进行打包
- 实现WebDriverWait
版本说明
新增功能、删除功能和修复内容列在版本说明中。好吧,无论如何,细节程度各有不同。
入门
- 此驱动程序已打包通过PEAR进行分发。所以...
pear channel-discover element-34.github.com/pear pear install -f element-34/PHPWebDriver
注意:如果在channel-discover设置期间收到404,请确保您正在使用PEAR的当前版本。如果不是,则需要
pear upgrade pear
-
此客户端所需的服务器是selenium-server-standalone-#.jar。
-
下载并运行该文件,将#替换为当前服务器版本。
java -jar selenium-server-standalone-#.jar
-
然后,在创建会话时,请务必传递服务器运行的URL。
// This would be the url of the host running the server-standalone.jar $wd_host = 'http://localhost:4444/wd/hub'; $web_driver = new PHPWebDriver_WebDriver($wd_host); // First param to session() is the 'browserName' (default = 'firefox') // Second param is a JSON object of additional 'desiredCapabilities' // POST /session $session = $web_driver->session('firefox');
- 有效的浏览器字符串
- firefox
- chrome
- ie
- internet explorer
- opera
- htmlunit
- htmlunitjs
- iphone
- ipad
- android
简单示例
注意,所有这些都与协议完全匹配
-
移动到屏幕上的特定位置
// POST /session/:sessionId/moveto $session->moveto(array('xoffset' => 3, 'yoffset' => 300));
-
获取当前URL
// GET /session/:sessionId/url $session->url();
-
获取所有打开窗口的窗口句柄列表
// GET /session/:sessionId/window_handles $session->window_handles();
-
点击元素
// POST session/:sessionId/element/:id/click $session->element($using, $value)->click("")
-
在触摸屏上双击元素
// POST session/:sessionId/touch/doubleclick $session->touch()->doubleclick(array('element' => $element->getID())
-
检查两个元素是否相等
// GET /session/:sessionId/element/:id/equals/:other $element->equals($other_element->getID()))
-
获取元素上CSS属性的值
// GET /session/:sessionId/element/:id/css/:propertyName $element->css($property_name)
'GET', 'POST', 或 'DELETE' 到同一命令示例
当可以为同一命令执行多个HTTP方法时,对于'GET'直接调用命令,对于'POST'或'DELETE',请将HTTP方法前置。
-
使用'POST'设置横屏方向
// POST /session/:sessionId/orientation $session->postOrientation(array('orientation' => 'LANDSCAPE'));
-
使用常规'GET'获取横屏方向
// GET /session/:sessionId/orientation $session->orientation();
-
使用'POST'设置具有$window_handle的窗口大小
// If excluded, $window_handle defaults to 'current' // POST /session/:sessionId/window/:windowHandle/size $session ->window($window_handle) ->postSize(array('width' => 10, 'height' => 10));
-
使用'GET'获取当前窗口大小
// GET /session/:sessionId/window/:windowHandle/size $session->window()->size();
对直接协议翻译的某些不可避免的例外。
-
打开页面
// POST /session/:sessionId/url $session->open('https://#');
-
处理会话
// DELETE /session/:sessionId $session->close(); // GET /session/:sessionId $session->capabilities();
-
查找元素
// POST /session/:sessionId/element $element = $session->element($using, $value);
// POST /session/:sessionId/elements $session->elements($using, $value);
// POST /session/:sessionId/element/:id/element $element->element($using, $value);
// POST /session/:sessionId/element/:id/elements $element->elements($using, $value);
$using
是位置方法,可以是以下字符串值之一
- id
- 使用xpath
- 链接文本
- 部分链接文本
- 名称
- 标签名
- 类名
- CSS选择器
或通过WebDriverBy.php中定义的常量(见下文)。这样做的好处是您可以更快地知道(在编译时)是否犯了错误。
ID
XPATH
LINK_TEXT
PARTIAL_LINK_TEXT
NAME
TAG_NAME
CLASS_NAME
CSS_SELECTOR
换句话说,以下内容是等价的
// POST /session/:sessionId/element $element = $session->element("id", $value);
// POST /session/:sessionId/element $element = $session->element(PHPWebDriver_WebDriverBy::ID, $value);
-
获取活动元素
// POST /session/:sessionId/element/active $session->activeElement();
-
操作cookie
// GET /session/:sessionId/cookie $session->getAllCookies(); // GET /session/:sessionId/cookie $session->getCookie($name); // POST /session/:sessionId/cookie // // $cookie_array mandatory fields // - name: string // - vale: string // // $cookie_array optional fields // - path: string // - domain: string // - secure: boolean // - expiry: number (seconds since epoch) $session->setCookie($cookie_array); // DELETE /session/:sessionId/cookie $session->deleteAllCookies() // DELETE /session/:sessionId/cookie/:name $session->deleteCookie($name)
-
操作窗口
// POST /session/:sessionId/window $session->focusWindow($window_handle); // DELETE /session/:sessionId/window $session->deleteWindow();
等待
until函数将一直触发,直到返回PHP认为是True的结果
-
等待您要使用的元素出现
$w = new PHPWebDriver_WebDriverWait($session); $e = $w->until( function($session) { return $session->element(PHPWebDriver_WebDriverBy::ID, "overlayPanelProfileovolp-pad"); } );
-
等待元素的呈现
$w = new PHPWebDriver_WebDriverWait($session); $w->until( function($session) { return count($session->elements(PHPWebDriver_WebDriverBy::ID, "overlayPanelProfileovolp-pad")); } );
超时
-
配置隐式等待(以秒为单位)
$this->$session->implicitlyWait(3);
-
禁用隐式等待
$this->$session->implicitlyWait(0);
-
等待执行或execute_async的时间长度(以秒为单位)
$this->$session->setScriptTimeout(3);
-
等待页面加载完成的时间长度(以秒为单位)
$this->$session->setPageLoadTimeout(3);
-
如何直接设置上述超时。除非您确实需要毫秒级精度,否则不要这样做
$this->$session->setTimeouts(array('type' => 'implicit', 'ms' => 5)); $this->$session->setTimeouts(array('type' => 'script', 'ms' => 5)); $this->$session->setTimeouts(array('type' => 'page load', 'ms' => 5));
与元素交互
-
按照协议发送字符(很糟糕)
$e1 = $this->session->element(PHPWebDriver_WebDriverBy::ID, "some id"); $e1->value(array("value" => array("pumpkins")));
-
以更优雅的方式发送字符
$e2 = $this->session->element(PHPWebDriver_WebDriverBy::ID, "some id"); $e2->sendKeys("turtles");
-
发送一个“特殊”字符(见WebDriverKeys.php中的列表WebDriverKeys.php)
$e3 = $this->session->element(PHPWebDriver_WebDriverBy::ID, "some id"); $e3->sendKeys(PHPWebDriver_WebDriverKeys::SpaceKey());
-
使用空格键前进页面
$e4 = $this->session->element(PHPWebDriver_WebDriverBy::TAG_NAME, "body"); $e4->sendKeys(PHPWebDriver_WebDriverKeys::SpaceKey());
代理
-
HTTP代理
$server = 'http://localhost:4444/wd/hub'; $driver = new PHPWebDriver_WebDriver($server); $desired_capabilities = array(); $proxy = new PHPWebDriver_WebDriverProxy(); $proxy->httpProxy = '127.0.0.1:9091; $proxy->add_to_capabilities($desired_capabilities); $session = $driver->session('firefox', $desired_capabilities);
截图
-
截图作为base64字符串从服务器返回
$img = $session->screenshot(); $data = base64_decode($img); $file = 'gramophon.com.png'; $success = file_put_contents($file, $data);
框架
-
切换到另一个框架
// find your iframe $iframe = self::$session->element(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "iframe"); // switch context to it self::$session->switch_to_frame($iframe); // interact $ps = self::$session->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "p"); $this->assertEquals(count($ps), 6); // switch back self::$session->switch_to_frame();
警报
-
切换到警报
$p = $this->session->switch_to_alert();
-
获取警报/提示的文本
$p->text;
-
接受警报/提示
$p->accept();
-
忽略警报/提示
$p->dismiss();
-
在提示中设置一些文本(在警报上这样做将抛出
PHPWebDriver_ElementNotDisplayedWebDriverError
)$p->sendKeys('cheese'); $p->accept();
配置文件
- 将Firefox配置文件通过网络发送到远程Se服务器。如何配置取决于您。
$driver = new PHPWebDriver_WebDriver(); $profile = new PHPWebDriver_WebDriverFirefoxProfile('path/to/a/firefox/profile'); $session = $driver->session('firefox', array(), array(), $browser_profile=$profile); $session->close();
全屏
- 要最大化浏览器窗口,只需使用API。现在在ChromeDriver版本2中支持Chrome。
$session->window()->maximize();