Selenium 2 大的更新是集成了WebDriver。這兩者是什么關系呢?如果你搜索WebDriver,第一條結果是Selenium。其實WebDriver和Selenium可以說是在實現UI Automation的競爭對手。Selenium是運行在JavaScript的sandbox里面,所以很容易支持不同的瀏覽器;而WebDriver則是直接操作瀏覽器本身,更接近用戶的真實操作,但正因為如此,所以WebDriver在多瀏覽器/操作系統的支持上要落后于Selenium。不過從Selenium 2開始,這兩個項目合并了,可以繼續用原來的Selenium,也可以考慮遷移到WebDriver。我個人認為WebDriver應該是以后的大趨勢,還是值得遷移的。至于你信不信,我反正是信了。
作為一個輕量級的UI Automation框架,需要寫一些驅動它的代碼,大部分人會選擇JUnit,因為JUnit是單元測試的事實標準;但是我會用TestNG。這些UI Automation的東西,它們本身不是單元測試,而且也沒有太多單元測試的風格。
從一段簡單的測試開始
public class GoogleTest {
@Test
public void search(ITestContext context) {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys("magus");
element.submit();
Assert.assertTrue(driver.getTitle().contains("magus"), "Something wrong with title");
}
}
TestNG應用了Java的Annotations,只需要在測試方法上面打上@Test可以標示出search是一個測試方法。用TestNG運行測試還需要一個testng.xml的文件,文件名其實可以隨便起,沒有關系的。
<suite name="Magus demo" verbose="2">
<test name="Search function">
<classes>
<class name="test.GoogleTest">
<methods>
<include name="search" />
</methods>
</class>
</classes>
</test>
</suite>
我想讓測試更加靈活,1. 可以配置使用任意支持的瀏覽器進行測試;2. 配置所有Google的URL;3. 配置搜索的關鍵字。修改后的代碼:
public class GoogleTest {
WebDriver driver;
@Parameters({"browser"})
@BeforeTest
public void setupBrowser(String browser){
if (browser.equals("firefox")){
driver = new FirefoxDriver();
} else {
driver = new ChromeDriver();
}
}
@Parameters({ "url", "keyword" })
@Test
public void search(String url, String keyword, ITestContext context) { driver.get(url);
WebElement element = driver.findElement(By.name("q"));
element.sendKeys(keyword);
element.submit();
Assert.assertTrue(driver.getTitle().contains(keyword), "Something wrong with title"); }
}