對於剛接觸到自動化的同學來說,通過錄制工具來學習自動化可能是最快捷的方式了,selenium可能也考慮到了這一點,所以很早之前就推出了一個叫Selenium IDE的工具來錄製腳本。http://docs.seleniumhq.org/download/ 可以在這個站點來下載。注意這個站點不知爲何被國內封了,我表示不太理解,所以需要翻牆,代理,VPN之類的工具來訪問並下載,當然,也可以在第三方站點找。最後更新的版本是2.9.0。 這個工具實際上是Firefox的一個插件,所以安裝前需要先裝Firefox,實際上Selenium Web的自動化最開始是在Firefox的基礎上做的,後來兼容谷歌的Chrome以及IE,並沒有Firefox完美。 上圖是安裝了Selenium IDE的Firefox,點擊這個按鈕就可以調出Selenium IDE。打開IDE後,錄製功能默認是打開的,最右端的紅色按鈕可以控制。用百度做例子,在Base URL中輸入http://www.baidu.com,然後在Firefox中輸入百度,輸入"test"進行搜索。這個時候切換到IDE中可以看到工具主體中有內容顯示出來,這就是錄製的結果,可以通過回放來看測試結果,這裏的回放是可以在當前的Firefox瀏覽器上重複剛纔的步驟,並生成測試結果。只是光看這個是無法瞭解腳本怎麼寫的,需要轉換成腳本。
這個功能可以把這段轉換成腳本,我選擇的是Java,當然如果你熟悉Ruby,Python或者C#的話,可以轉換成對應的開發語言。可以看到這裏有Remote Control和Web Driver,RC是Selenium1,而Web Driver是另外一個公司開發的,後來的Selenium2是RC公司收購了WD後產生的,除了大幅度提高了執行效率外,整合的API也實現了很多功能,包括現在的移動端自動化。IDE因爲很久沒有更新,所以RC也沒有拿掉。
以下代碼是剛纔錄製轉化過來的:
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class 1 {
private WebDriver driver; //實例化Webdriver
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before //執行測試類前的操作
public void setUp() throws Exception {
driver = new FirefoxDriver(); //把FirefoxDriver作爲一個對象給driver,開啓Firefox瀏覽器。
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); //這是一個隱形等待的方法,等待頁面加載完成。
}
@Test
public void test1() throws Exception {
driver.get(baseUrl + "/"); //get 方法,是在瀏覽器中輸入指定的URL
driver.findElement(By.id("kw")).click(); //這裏涉及到兩個方法, findElement是查找當前頁面元素,click是點擊這個元素,這個是
//WD查找並操作元素的核心部分。
driver.findElement(By.id("kw")).clear(); //clear是清空當前元素中的文本內容
driver.findElement(By.id("kw")).sendKeys("test"); //sendKeys是在當前元素中輸入文本內容。
driver.findElement(By.id("su")).click();
}
@After //執行測試類後的操作
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
//後面的三個方法是錄製生成的,對這條case沒有實質的意義,isElementPresent判斷指定元素是否顯示在頁面上,isAlertPresent判斷頁 //面是否有Alert彈出,closeAlertAndGetItsText關閉Alert窗口並獲取Alert的內容。
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
上面這個java文件可以直接用java來運行,當然要運行的話需要導入依賴的包。對於Java開發,Eclipse可能是最方便的集成開發環境了,具體我們後面再講。
錄製只能作爲學習手段,但不能完全代替自動化實施手段,譬如業內用得多的功能方向的QTP,性能的Loadrunner,錄製只是方便學習或者節省開發成本,腳本最後都是需要做處理才能用到產品線上。