element-34/php-webdriver

thin php client for webdriver

v1.12.0 2013-08-22 01:01 UTC

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();