php-webdriver 是一个自动化测试的工具,这篇文章将介绍 php-webdriver 中常见的功能。
打开指定网页
get
- $driver->get("http://www.google.com.tw/");
输入框操作
sendKeys
输入框操作是最基本的,你必需先使用 findElement 来找到你要输入的 input ,然后透过 sendKeys 将指定的值输入。
- clear :清空 input
- sendKeys:输入 input
- $element = $driver->findElement(
- WebDriverBy::cssSelector('.input')
- );
- $element->clear(); //清空
- $element->sendKeys("test value");
操作方向键
sendKeys: WebDriverKeys::LEFT
下面这个范例,会在 input 中会填入 "AC" 这两个字,然后操作方向键往左边移动一格,接著再输入 B ,最后结果, input 中就会有字串 "ABC"
- $element = $driver->findElement( WebDriverBy::cssSelector('input'));
- $element->sendKeys("AC");
- $element->sendKeys(WebDriverKeys::LEFT);
- $element->sendKeys("B");
Select 选择
selectByValue
一般来说你可以使用 sendKeys 的方式来选取 option,但是 selenium 预设的 method sendKeys,是选取你看到的文字内容,例如我有一个选单 value="math", text="数学" ,那么我的程式要这样写 sendKeys("数学"),文字内容有可能会因为各种原因而改变其值,所以我会倾向去对 value 来做选取。
而 php-webdriver 已经有提供另一种方式来选取 option ,你可以使用 WebDriverSelect 的 selectByValue 就能够直接选择 value 而不是 text,是不是方便很多呢。
- $elm = $driver->findElement(
- WebDriverBy::cssSelector("select")
- );
- $selectAcao = new WebDriverSelect($elm);
- $selectAcao->selectByValue("math");
改变 select 的值,并触发 Change Event
用 php-webdriver sendKeys 方式去选择 select 会有两个问题,第一问题是你只能指定要选择的 label 名称,而不能指定 value ,第二个问题则是,选了 select 的选项之后,浏览器不会自动执行 select change event ,因为 Selenium 原本就是用 Javascript 写的, Selenium 它本身就会用 Javascript 去修改 select 的值,这样无法触发 change event 。
这里我使用 YUI 3 来选取 select 的 value ,并自动去执行 select 的 change event (你要测试的网页必需要有载入 YUI 3,当然你也可以用 executeScript 的方式去载入 YUI 3 )。
- $driver->executeScript('YUI().use("node","node-event-simulate", function(Y) { var s = Y.one(".class select").set("value", "xxx"); });');
- $driver->executeScript('YUI().use("node","node-event-simulate", function(Y) { Y.one(".class select").simulate("change"); });');
执行 Javascript
executeScript
使用 Selenium 有个很方便的 method ,那就是 executeScript,很多 Selenium 没有支援的功能,你都可以直接使用 Javascript 来执行。
- $driver->executeScript('var d = document.querySelector(".class"); d.style.visibility="visible";');
拖拉物件 : drag and drop
- $sourceElm = $driver->findElement(WebDriverBy::cssSelector('.source'));
- $targetElm = $driver->findElement(WebDriverBy::cssSelector('.target'));
- $action = $driver->action();
- $action->dragAndDrop($sourceElm, $targetElm)->perform();
Element 操作
- getText : element 内容
- getTagName : 取得 element 名称
- getAttribute
- getCSSValue
- getLocation : 取得 element 所在位置
- getLocationOnScreenOnceScrolledIntoView
- getSize
- getID
- isEnabled
- isSelected
- isDisplayed
- clear
- click
- sendKeys
- submit
getText 取得 element 的 innerText 内容
Element 必需是可见的,不能隐藏,例如 「display: none, opacity: 0;, visibility: hidden」 都会造成无法取得 text。
- $elm = $driver->findElement(
- WebDriverBy::cssSelector('.classname')
- );
- echo $elm->getText();