我們來看一下官網提供的代碼寫法,即最原始的寫法:
driver.findElement(By.id("kw")).click()
這樣寫是沒任何問題的,但這樣沒有把元素對象,數據,業務邏輯分離,達不到裝逼的效果,為了使這三方面分離,我們先來分析一下這句代碼:這里面涉及到了三個對象:driver對象,By對象,WebElement對象。由於現在大多數人使用了所謂的Page-Object模式,具體請參考我另一篇博客:
http://www.cnblogs.com/zhangfei/p/3456159.html
這樣即達到了元素對象與腳本分離的效果,最后把上面這句代碼可以變為這樣的:
page.getElement("百度按鈕").click();
這樣以后,似乎看起來很不錯了,但是有的人希望在click時,自動的輸出log,但click是WebElement的方法,又沒接口,又不讓繼承,無法辦到,倒是可以使用AOP框架來注入,亦或者字節碼注入的方式,這兩種方式,我都只是聽過,根本不會用啊,暫且不表。我們來看看大多數人使用的方法:
public void click(String key){
WebElement element = this.getElement("key");
System.out.println("click the: "+element.toString());
element.click();
}
page.click("百度按鈕");
這樣似乎也達到了log自動輸出的效果,但是,這樣好看嗎?不惡心嗎?有面向對象的感覺嗎?尼瑪click是個動作,原本是先找到對象再去點擊,你這樣寫,就是先發出一個點擊動作,然后再去尋找對象,太惡心了,簡直不能接受啊。經過一位看過我文檔的人的女士提示,我加工了一下,是這樣的封裝方式:
1.先寫一個ExtendWebElement類:用於存放所有的webdriver的api
package com.test.base;
import org.openqa.selenium.WebElement;
public class ExtendWebElement {
private WebElement element;
public void setElement(WebElement element) {
this.element = element;
}
public void click(){
System.out.println("click the: "+element.toString());
/**
* do something
*/
element.click();
/**
* do something
*/
}
}
2.在Locator類(即元素管理篇中的Deml類)里,添加
private ExtendWebElement extWebElement;
public Locator(WebDriver driver) {
this.driver = driver;
extWebElement = new ExtendWebElement();
}
3.更改getLocator方法:
private ExtendWebElement getLocator(String key, String[] replace, boolean wait) {
WebElement element = null;
if (ml.containsKey(key)) {
Map<String, String> m = ml.get(key);
String type = m.get("type");
String value = m.get("value");
if (replace != null)
value = this.getLocatorString(value, replace);
By by = this.getBy(type, value);
if (wait) {
element = this.watiForElement(by);
boolean flag = this.waitElementToBeDisplayed(element);
if (!flag)
element = null;
} else {
try {
element = driver.findElement(by);
} catch (Exception e) {
element = null;
}
}
} else
Log.logInfo("Locator " + key + " is not exist in " + yamlFile
+ ".yaml");
extWebElement.setElement(element);
return extWebElement;
}
4.最后的調用方式還是:
page.getElement("百度按鈕").click();
且你能在里面添加你想要添加的代碼,最終的腳本,根本不用改啥。。。簡直屌爆!
當然,這個也有弱點,就是要把常用的webdriver的API都封裝在這個ExtendWebElement類里。。。
