Selenium RC

Selenium RC是一款測(cè)試工具,允許你為web應(yīng)用編寫自動(dòng)化的用戶接口測(cè)試,支持任何程序設(shè)計(jì)語(yǔ)言、任何HTTP站點(diǎn)以及任何主流瀏覽器。它使用Selenium Core,這是個(gè)利用JavaScript執(zhí)行自動(dòng)瀏覽器任務(wù)的庫(kù)。Selenium測(cè)試直接運(yùn)行于瀏覽器中,就像真實(shí)做的那樣。這些測(cè)試既可用于驗(yàn)收測(cè)試(通過(guò)在集成系統(tǒng)上執(zhí)行更高級(jí)的測(cè)試而不是只獨(dú)立地測(cè)試系統(tǒng)的各個(gè)單元),又可用于瀏覽器兼容性測(cè)試(通過(guò)測(cè)試不同操作系統(tǒng)和瀏覽器上的web應(yīng)用)。

我看看下Selenium RC是如何安裝的:

  1. 下載一個(gè)Selenium RC分發(fā)包存檔。
  2. 分發(fā)包存檔并拷貝server/selenium-server.jar/usr/local/bin(例如)。
  3. 通過(guò)運(yùn)行java -jar /usr/local/bin/selenium-server.jar啟動(dòng)Selenium RC服務(wù)器。

現(xiàn)在我們可以利用它的客戶/服務(wù)器協(xié)議向Selenium RC服務(wù)器發(fā)送命令了。

PHPUnit_Extensions_SeleniumTestCase

PHPUnit_Extensions_SeleniumTestCase測(cè)試用例擴(kuò)展將同Selenium RC通話的客戶/服務(wù)器協(xié)議實(shí)現(xiàn)為專門用于web測(cè)試的斷言方法。

范例 19.1顯示如何測(cè)試http://www.example.com/站點(diǎn)的<title>元素的內(nèi)容。

范例 19.1: PHPUnit_Extensions_SeleniumTestCase使用舉例

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser('*firefox /usr/lib/firefox/firefox-bin');
        $this->setBrowserUrl('http://www.example.com/');
    }
 
    public function testTitle()
    {
        $this->open('http://www.example.com/');
        $this->assertTitleEquals('Example Web Page');
    }
}
?>

不同于PHPUnit_Framework_TestCase類,擴(kuò)展了PHPUnit_Extensions_SeleniumTestCase的測(cè)試用例類必須提供setUp()方法。該方法用于配置Selenium RC會(huì)話。可用于此的方法列表見(jiàn)表 19.1

表 19.1. Selenium RC API:裝配

方法含義
void setBrowser(string $browser)Selenium RC服務(wù)器使用的瀏覽器。
void setBrowserUrl(string $browserUrl)設(shè)置用于測(cè)試的基址URL。
void setHost(string $host)設(shè)置連接到Selenium RC服務(wù)器的主機(jī)名。
void setPort(int $port)設(shè)置連接到Selenium RC服務(wù)器的端口號(hào)。
void setTimeout(int $timeout)設(shè)置連接到Selenium RC服務(wù)器的超時(shí)時(shí)間。
void setSleep(int $seconds)設(shè)置Selenium RC客戶端向Selenium RC服務(wù)器發(fā)送動(dòng)作指令之間睡眠的秒數(shù)。

你也可以使用一組瀏覽器運(yùn)行每一個(gè)測(cè)試:在你的測(cè)試用例類中聲明一個(gè)名為$browserspublic static數(shù)組代替使用setBrowser()設(shè)置一個(gè)瀏覽器。該數(shù)組中的每一項(xiàng)都描述一個(gè)瀏覽器配置。這些瀏覽器中的每一個(gè)都能被不同的Selenium RC服務(wù)器接待:

范例 19.2: 設(shè)置多瀏覽器配置

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox /usr/lib/firefox/firefox-bin',
        'host'    => 'my.linux.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on MacOS X',
        'browser' => '*safari',
        'host'    => 'my.macosx.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Safari on Windows XP',
        'browser' => '*custom C:\Program Files\Safari\Safari.exe -url',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      ),
      array(
        'name'    => 'Internet Explorer on Windows XP',
        'browser' => '*iexplore',
        'host'    => 'my.windowsxp.box',
        'port'    => 4444,
        'timeout' => 30000,
      )
    );
 
    protected function setUp()
    {
        $this->setBrowserUrl('http://www.example.com/');
    }
 
    public function testTitle()
    {
        $this->open('http://www.example.com/');
        $this->assertTitleEquals('Example Web Page');
    }
}
?>

PHPUnit_Extensions_SeleniumTestCase能夠收集測(cè)試經(jīng)由Selenium運(yùn)行時(shí)的代碼覆蓋率信息:

  1. 拷貝PHPUnit/Extensions/SeleniumTestCase/phpunit_coverage.php到你的web服務(wù)器的文件根目錄中。
  2. 在你的web服務(wù)器的php.ini配置文件中,配置PHPUnit/Extensions/SeleniumTestCase/prepend.phpPHPUnit/Extensions/SeleniumTestCase/append.php分別作為auto_prepend_fileauto_append_file
  3. 在你的擴(kuò)展了PHPUnit_Extensions_SeleniumTestCase的測(cè)試用例類中,使用
    protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';
    配置用于phpunit_coverage.php腳本的URL。

表 19.2列出PHPUnit_Extensions_SeleniumTestCase提供的各種斷言方法。

表 19.2. 斷言

斷言含義
void assertAlertPresent()如果不存在警告(對(duì)話框)則報(bào)錯(cuò)。
void assertNoAlertPresent()如果存在警告(對(duì)話框)則報(bào)錯(cuò)。
void assertChecked(string $locator)如果$locator標(biāo)識(shí)的元素未選中則報(bào)錯(cuò)。
void assertNotChecked(string $locator)如果$locator標(biāo)識(shí)的元素被選中則報(bào)錯(cuò)。
void assertConfirmationPresent()如果不存在確認(rèn)(對(duì)話框)則報(bào)錯(cuò)。
void assertNoConfirmationPresent()如果存在確認(rèn)(對(duì)話框)則報(bào)錯(cuò)。
void assertEditable(string $locator)如果$locator標(biāo)識(shí)的元素不可編輯則報(bào)錯(cuò)。
void assertNotEditable(string $locator)如果$locator標(biāo)識(shí)的元素可編輯則報(bào)錯(cuò)。
void assertElementValueEquals(string $locator, string $text)如果$locator標(biāo)識(shí)的元素的值不等于給定的$text則報(bào)錯(cuò)。
void assertElementValueNotEquals(string $locator, string $text)如果$locator標(biāo)識(shí)的元素的值等于給定的$text則報(bào)錯(cuò)。
void assertElementContainsText(string $locator, string $text)如果$locator標(biāo)識(shí)的元素不含給定的$text則報(bào)錯(cuò)。
void assertElementNotContainsText(string $locator, string $text)如果$locator標(biāo)識(shí)的元素包含給定的$text則報(bào)錯(cuò)。
void assertElementPresent(string $locator)如果$locator標(biāo)識(shí)的元素不存在則報(bào)錯(cuò)。
void assertElementNotPresent(string $locator)如果$locator標(biāo)識(shí)的元素存在則報(bào)錯(cuò)。
void assertLocationEquals(string $location)如果當(dāng)前位置(location)不等于給定的$location則報(bào)錯(cuò)。
void assertLocationNotEquals(string $location)如果當(dāng)前位置(location)等于給定的$location則報(bào)錯(cuò)。
void assertPromptPresent()如果不存在提示(對(duì)話框)則報(bào)錯(cuò)。
void assertNoPromptPresent()如果存在提示(對(duì)話框)則報(bào)錯(cuò)。
void assertSelectHasOption(string $selectLocator, string $option)如果給定的選項(xiàng)不可用則報(bào)錯(cuò)。
void assertSelectNotHasOption(string $selectLocator, string $option)如果給定的選項(xiàng)可用則報(bào)錯(cuò)。
void assertSelected($selectLocator, $option)如果給定的標(biāo)簽未選中則報(bào)錯(cuò)。
void assertNotSelected($selectLocator, $option)如果給定的標(biāo)簽被選中則報(bào)錯(cuò)。
void assertIsSelected(string $selectLocator, string $value)如果給定的值未選中則報(bào)錯(cuò)。
void assertIsNotSelected(string $selectLocator, string $value)如果給定的值被選中則報(bào)錯(cuò)。
void assertSomethingSelected(string $selectLocator)如果$selectLocator標(biāo)識(shí)的選項(xiàng)未選中則報(bào)錯(cuò)。
void assertNothingSelected(string $selectLocator)如果$selectLocator標(biāo)識(shí)的選項(xiàng)被選中則報(bào)錯(cuò)。
void assertTextPresent(string $pattern)如果給定的$pattern不存在則報(bào)錯(cuò)。
void assertTextNotPresent(string $pattern)如果給定的$pattern存在則報(bào)錯(cuò)。
void assertTitleEquals(string $title)如果當(dāng)前標(biāo)題不等于給定的$title則報(bào)錯(cuò)。
void assertTitleNotEquals(string $title)如果當(dāng)前標(biāo)題等于給定的$title則報(bào)錯(cuò)。
void assertVisible(string $locator)如果$locator標(biāo)識(shí)的元素不可見(jiàn)則報(bào)錯(cuò)。
void assertNotVisible(string $locator)如果$locator標(biāo)識(shí)的元素可見(jiàn)則報(bào)錯(cuò)。

表 19.3顯示PHPUnit_Extensions_SeleniumTestCase的兩個(gè)模板方法:

表 19.3. 模板方法

方法含義
void defaultAssertions()重寫以執(zhí)行一個(gè)測(cè)試用例中的所有測(cè)試共享的斷言。該方法在發(fā)送給Selenium RC服務(wù)器的每個(gè)命令之后被調(diào)用。
void sharedAssertions()重寫以執(zhí)行一個(gè)測(cè)試用例中的所有測(cè)試共享的斷言。該方法在一個(gè)測(cè)試執(zhí)行結(jié)束之前被調(diào)用。

請(qǐng)查閱Selenium Core的文檔獲得關(guān)于可用的命令以及如何使用的參考。

利用runSelenese($filename)方法,你也能從它的Selenese/HTML規(guī)范運(yùn)行一個(gè)Selenium測(cè)試。此外,利用靜態(tài)屬性$seleneseDirectory,你能從一個(gè)包含Selenese/HTML文件的目錄自動(dòng)地創(chuàng)建測(cè)試對(duì)象。指定的目錄被遞歸地搜索預(yù)期包含Selenese/HTML的.htm文件。 范例 19.3顯示一個(gè)例子。

范例 19.3: 使用Selenese/HTML文件的目錄作為測(cè)試

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
class SeleneseTests extends PHPUnit_Extensions_SeleniumTestCase
{
    public static $seleneseDirectory = '/path/to/files';
}
?>