java webdriver的api的封裝

來源:互聯網
上載者:User

標籤:

我們來看一下官網提供的代碼寫法,即最原始的寫法:

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的封裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.