好長一段時間沒有寫技術博客了,渾渾噩噩的過了這麼多日子,一直處於瞎忙的狀態,荒廢了好多時光。今天靜下來想想,繼續上路。
之前有記錄了關於怎樣搭建webdriver的測試環境,也記錄了一些小技巧,也給出實例怎樣真正開始動手寫一個自動化測試的case.但是真正的自動化測試項目中,只會那些還是遠遠不夠的,細想一下,如果每一個步驟要有driver.findElement只論可讀性的話就該夠你喝一壺的了,更別談維護了。這時腦子上燈突然閃了下,貌似你好像有了些靈感,那些重複的語句,可以封裝嗎?那麼我們就先從findElement的方法開始我們的框架設計之旅。
我們首先來看看原生的webdriver找元素的方法,以id爲例: driver.findElement(By.id(" ")),暫時拋開driver, findElement方法中包含了2個部分By 和id(元素的屬性)By是原生的關鍵字,這裏我們也先不動它,我們先從id入手,其實不光id,有很多通過元素屬性找元素的方法,比如: id,name,cssSelector,xpath,linkText,tagName等等等。。
這裏我們就可以做文章了,比如我們實例化一個By locator 的方法,把有可能用到的元素屬性都列在裏面,根據用戶提供的元素屬性的不同調用不同的方法,元素屬性包含2個部分:屬性名稱,屬性value中間可用‘:’隔開。
1. 如果用戶的輸入沒有‘:’,那麼默認調用By.id()方法
2. 如果用戶的輸入包含':',那麼根據實際情況來判斷,通過‘:’把元素用戶輸入分開,通過':'左邊分離出來的字符串來判斷具體的調用方法。通過‘:’右邊分離出來的字符串來傳入實際的屬性value
public static By locator(String locator) {
if (!locator.contains(":")) {
return By.id(locator);
} else {
String[] lArr = locator.split(":");
String by = lArr[0];
//取到冒號後面的具體的元素屬性
String using =locator.substring(by.length()+1);
if (by.equalsIgnoreCase("id")) {
return By.id(using);
} else if (by.equalsIgnoreCase("name")) {
return By.name(using);
} else if (by.equalsIgnoreCase("xpath")) {
return By.xpath(using);
} else if (by.equalsIgnoreCase("cssSelector")) {
return By.cssSelector(using);
} else if (by.equalsIgnoreCase("linkText")) {
return By.linkText(using);
} else if (by.equalsIgnoreCase("partialLinkText")) {
return By.partialLinkText(using);
} else if (by.equalsIgnoreCase("tagName")) {
return By.tagName(using);
} else if (by.equalsIgnoreCase("className")) {
return By.className(using);
} else {
throw new IllegalArgumentException("Cannot find elements when name text is null.");
}
}
}
3. 定義一個getEelment的方法
public static WebElement getWebElement(String locator) {
WebElement we;
we = driver.findElement(locator(locator));
return we;
}
這樣找元素的方法就簡單的完成了,但是這麼做有什麼好處呢?
a) 不用過分關心底層找元素的方法,我只要提供對元素的屬性就可以了,可以是id,name....
b) 重用了findElement方法,不用寫很多次,只定義一次,無限次調用
c) 維護更容易,不用頻繁的該代碼,出錯了只要改很少的地方,實現了屬性和方法的分離
d)可擴展性更強