Selenium是一款開源的web自動化測試工具,可以運行于IE、Firefox等若干瀏覽器上,驅動web頁面元素,如點擊按鈕、填寫表單等等,可以錄制用戶操作和通過Java、Python等語言來定制,可以說功能相當強大。
本來這個工具的初衷是用于web開發人員的單元測試或者兼容性測試等,但我發現它對于系統測試也很有用——比如自動化錄制系統測試腳本。隨著web 2.0技術的不斷發展,富客戶端應用層出不窮,這給系統測試帶來了很大問題——測試腳本隨著軟件build的不斷更新(web頁面的很多細節發生變化),無法用于新build的測試,這導致測試人員經常重復性的手動錄制腳本,再加上數據關聯等工作,耗時費力。
而Selenium則提供了一個很好的解決方案,它是通過識別web頁面元素來定位頁面控件,所以通過Selenium錄制一次測試腳本,以后每次需要錄制腳本時,都使用Selenium驅動第一次的腳本來重新錄制(像RPTLoad Runner都用跟蹤http請求和響應),這樣的話,Selenium基本可以較好的識別修改以后的控件,而RPT等系統測試工具則可以得到正確的http內容,這個過程不再需要測試人員手動錄制,完全靠Selenium自動驅動。
Selenium包括很多組件,其中我現在用的是Selenium RC和Selenium IDE。Selenium IDE是Firefox的一個插件,我們可以使用它錄制頁面操作。
Selenium IDE安裝完畢之后,可以從工具菜單中激活,然后我們可以在firefox中訪問需要測試的網頁,進行各種頁面操作,Selenium IDE在這個過程中會記錄我們的頁面控件和動作。完成錄制之后,Selenium IDE生成一個HTML文件保存腳本,比如
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://www.baidu.com/" />
<title>baidu</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">baidu</td></tr>
</thead><tbody>
<tr>
<td>open</td>
<td>/</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>kw</td>
<td>ckword</td>
</tr>
<tr>
<td>clickAndWait</td>
<td>sb</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
我們可以導出成Java文件,比如:
package com.example.tests;
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
public class NewTest extends SeleneseTestCase {
public void setUp() throws Exception {
setUp("http://www.baidu.com/", "*chrome");
}
public void testNew() throws Exception {
selenium.open("/");
selenium.type("kw", "ckword");
selenium.click("sb");
selenium.waitForPageToLoad("30000");
}
}
只要導入相應的selenium和Junit包可運行。
有一點需要注意的是在回放腳本時,應該添加setSpeed方法,參數是ms,因為Selenium IDE雖然可以選擇回放速度(慢——中——快),但實際上即使選擇慢速,Selenium IDE仍然運行的有些快,導致其在順序執行用戶操作時,可以發生沒等到頁面加載完畢執行下一個命令的現象,導致下一個命令找不到響應的頁面控件。除了setSpeed之外,Selenium IDE還可以添加大量的命令。具體見Selenium IDE界面。
另外一個關鍵是如何識別頁面控件。自動化的核心是錄制的控件識別方法可以復用,Selenium IDE支持的識別格式包括ID、Name、XPath:attributes、DOM index和XPath : position,而且允許正則表達式,所以非常靈活,根據我使用的情況來看,對于富客戶端應用,控件ID通常都增加了一個隨機數,不適合做識別,Name還不錯,但是如何這個控件Name帶有版本信息,比如控件在不斷升級,從1.3升到1.4,那么Name可以會失效,要小心。XPath: position我用的多,也覺得定位準。但是Selenium IDE有時抓不到某些操作,比如,可以某一個Logout鏈接,是由span來實現的,此時Selenium IDE抓不到,此時可以XPath:attributes識別,這樣寫://span[text()='Log out'],搞定。
對于Selenium IDE,還有很多細節需要學習,比如正則表達式的應用,如何寫出通用的識別方法,等等。我準備使用Selenium IDE錄制腳本,然后導出成java文件,做一些修改之后用Selenium RC驅動。