[php-webdriver/webdriver]用PHP控制浏览器做自动化测试

2022-03-10 奥古斯宏
Php-webdriver 是一个PHP写的Selenium WebDriver扩展库,可以编写浏览器自动脚本.

php-webdriver/webdriver是一个PHP写的Selenium 扩展库,可以用PHP控制浏览器的各种操作.

可以看这样一段代码,执行之后会打开浏览器,打开百度网页,然后搜索PHP并且提交表单.

<?php

namespace Facebook\WebDriver;

use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;

require_once('vendor/autoload.php');

// 设置selenium的服务器
$host = 'http://localhost:4444/wd/hub';

// 还用火狐浏览器
$capabilities = DesiredCapabilities::chrome();

$driver = RemoteWebDriver::create($host, $capabilities);

// 打开一个网页
$driver->get('https://www.baidu.com');

// 找到搜索框的DOM,然后在搜索框输入PHP
$driver->findElement(WebDriverBy::id('kw')) 
    ->sendKeys('PHP')
    ->submit(); // 提交表单

有时候我们要做一个自动化脚本演示,这是这个库就派上用场了.

他封装了众多的selenium的命令,比如:

打开网页

$result = $driver->get('https://phpreturn.com/');

操作DOM元素

定位元素

// 定位一个元素:
$element = $driver->findElement(WebDriverBy::cssSelector('div.header'));
$headerText = $element->getText();
// 定位多个元素:
$elements = $driver->findElements(WebDriverBy::cssSelector('ul.foo > li'));
foreach ($elements as $element) {
    var_dump($element->getText());
}

支持多种选择器:

  • Css 选择器- WebDriverBy::cssSelector('h1.foo > small')
  • Xpath - WebDriverBy::xpath('(//hr)[1]/following-sibling::div[2]')
  • Id - WebDriverBy::id('heading')
  • Class 类 - WebDriverBy::className('warning')
  • Name 属性 (inputs) - WebDriverBy::name('email')
  • 标签名 - WebDriverBy::tagName('h1')
  • 链接的文本 - WebDriverBy::linkText('搜索')
  • 链接的部分文本- WebDriverBy::partialLinkText('搜')

等待页面的某个部分加载完成

$element = $driver->wait()->until(
    WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::cssSelector('div.bar'))
);

获取元素文本

$title = $driver->findElement(WebDriverBy::id('sign-in'))->getAttribute('title');

// Get value of an input/textarea element
$inputElement = $driver->findElement(WebDriverBy::id('username'));
$value = $inputElement->getAttribute('value');

获取元素属性

$title = $driver->findElement(WebDriverBy::id('sign-in'))->getDomProperty('innerHTML');

点击元素

$driver->findElement(WebDriverBy::id('sign-in'))->click();

输入内容

$driver->findElement(WebDriverBy::id('element id'))->sendKeys('PHP武器库');

清空输入

$driver->findElement(WebDriverBy::id('element id'))->clear();

实现其他鼠标事件

$element = $driver->findElement(WebDriverBy::id('some_id'));
$driver->getMouse()->mouseMove($element->getCoordinates());

复杂的点击事件

如果元素可见,那么执行点击:

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

$element = $driver->findElement(WebDriverBy::id('element id'));
if ($element->isDisplayed()) {
    // 做点什么
}

检查Select是否选中

$checkboxElement = $driver->findElement(WebDriverBy::id('myCheckbox'));
if ($checkboxElement->isSelected()) {
    // ...
}

各种对于select的操作

$selectElement = $driver->findElement(WebDriverBy::name('language-select'));
$select = new WebDriverSelect($selectElement); // 对于radio则使用WebDriverRadio 

// 获取第一个(默认的)选项:
echo $select->getFirstSelectedOption()->getText();

// 获取全部的选项
$selectedOptions = $select->getAllSelectedOptions();

// 选择一个选项
$select->selectByValue('fr');
$select->selectByIndex(1);
$select->selectByVisibleText('Czech');
$select->selectByVisiblePartialText('UK');

提交表单

对于一个表单,有多种提交方式.

<form id="myForm" method="post">
    <input type="text" name="query">
    <input type="submit" name="submit" value="Submit">
</form>
$driver->findElement(WebDriverBy::id('myForm'))
    ->submit(); // 标准的提交事件

$driver->findElement(WebDriverBy::name('query'))
    ->submit(); // 在input的提交事件
$driver->findElement(WebDriverBy::name('submit'))
    ->click(); // 点击提交按钮

其他浏览器操作

  • 警告框/选择/取消
  • 页面刷新/后退
  • 操作tab/iframe
  • 最大化/最小化/全屏
  • 执行注入JS
  • 截屏等

总之,它是一个健全的Selenium 操作库,可以使用PHP完成浏览器自动化脚本.

评论
点击登录