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是如何安裝的:
- 下載一個(gè)Selenium RC分發(fā)包存檔。
- 分發(fā)包存檔并拷貝
server/selenium-server.jar
至/usr/local/bin
(例如)。 - 通過(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è)名為$browsers
的public 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í)的代碼覆蓋率信息:
- 拷貝
PHPUnit/Extensions/SeleniumTestCase/phpunit_coverage.php
到你的web服務(wù)器的文件根目錄中。 - 在你的web服務(wù)器的
php.ini
配置文件中,配置PHPUnit/Extensions/SeleniumTestCase/prepend.php
和PHPUnit/Extensions/SeleniumTestCase/append.php
分別作為auto_prepend_file
和auto_append_file
。 - 在你的擴(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';
}
?>