標籤:
我們來看一下官網提供的代碼寫法,即最原始的寫法:
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類裡。。。
java webdriver的api的封裝