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

原文地址:https://www.cnblogs.com/zhangfei/p/4548649.html