我們來看一下官網提供的代碼寫法,即最原始的寫法:
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類里。。。