zoukankan      html  css  js  c++  java
  • 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类里。。。

  • 相关阅读:
    JAVA设计模式---总述篇
    Java中对象创建时的内存分配
    for循环打印空心菱形的新方法
    springcloud2.X通过actuator加载配置无效问题
    golang-错误处理
    golang-字符串
    golang-方法和接口
    golang-结构体与指针
    golang-数组、切片、映射
    golang-流程控制
  • 原文地址:https://www.cnblogs.com/zhangfei/p/4548649.html
Copyright © 2011-2022 走看看