java webdriver的api的封裝


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

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類里。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM