java webdriver的api的封装

我们来看一下官网提供的代码写法,即最原始的写法:

1 driver.findElement(By.id("kw")).click()

 这样写是没任何问题的,但这样没有把元素对象,数据,业务逻辑分离,达不到装逼的效果,为了使这三方面分离,我们先来分析一下这句代码:这里面涉 及到了三个对象:driver对象,By对象,WebElement对象。由于现在大多数人使用了所谓的Page-Object模式,具体请参考我另一篇 博客:

http://www.cnblogs.com/zhangfei/p/3456159.html

这样即达到了元素对象与脚本分离的效果,最后把上面这句代码可以变为这样的:

1 page.getElement("百度按钮").click();

 这样以后,似乎看起来很不错了,但是有的人希望在click时,自动的输出log,但click是WebElement的方法,又没接口,又不让 继承,无法办到,倒是可以使用AOP框架来注入,亦或者字节码注入的方式,这两种方式,我都只是听过,根本不会用啊,暂且不表。我们来看看大多数人使用的 方法:

1  public void click(String key){
2     WebElement element = this.getElement("key");
3     System.out.println("click the: "+element.toString());
4     element.click();       
5 }
6  
7     page.click("百度按钮"); 

 这样似乎也达到了log自动输出的效果,但是,这样好看吗?不恶心吗?有面向对象的感觉吗?尼玛click是个动作,原本是先找到对象再去点击, 你这样写,就是先发出一个点击动作,然后再去寻找对象,太恶心了,简直不能接受啊。经过一位看过我文档的人的女士提示,我加工了一下,是这样的封装方式:

1.先写一个ExtendWebElement类:用于存放所有的webdriver的api

 1 package com.test.base;
 2  
 3 import org.openqa.selenium.WebElement;
 4  
 5 public class ExtendWebElement {
 6      
 7     private WebElement element;
 8  
 9     public void setElement(WebElement element) {
10         this.element = element;
11     }
12      
13     public void click(){
14         System.out.println("click the: "+element.toString());
15         /**
16          * do something
17          */
18         element.click();
19         /**
20          * do something
21          */
22     }
23      
24 }

 2.在Locator类(即元素管理篇中的Deml类)里,添加

1 private ExtendWebElement extWebElement;
2 public Locator(WebDriver driver) {       
3         this.driver = driver;
4         extWebElement = new ExtendWebElement();
5     }

 3.更改getLocator方法:

 1 private ExtendWebElement getLocator(String key, String[] replace, boolean wait) {
 2         WebElement element = null;
 3         if (ml.containsKey(key)) {
 4             Map<String, String> m = ml.get(key);
 5             String type = m.get("type");
 6             String value = m.get("value");
 7             if (replace != null)
 8                 value = this.getLocatorString(value, replace);
 9             By by = this.getBy(type, value);
10             if (wait) {
11                 element = this.watiForElement(by);
12                 boolean flag = this.waitElementToBeDisplayed(element);                
13                 if (!flag)
14                     element = null;
15             } else {
16                 try {
17                     element = driver.findElement(by);
18                 } catch (Exception e) {
19                     element = null;
20                 }
21             }
22         } else
23             Log.logInfo("Locator " + key + " is not exist in " + yamlFile
24                     + ".yaml");
25         extWebElement.setElement(element);
26         return extWebElement;
27     }
View Code

 4.最后的调用方式还是:

1 page.getElement("百度按钮").click();

 且你能在里面添加你想要添加的代码,最终的脚本,根本不用改啥。。。简直屌爆!

当然,这个也有弱点,就是要把常用的webdriver的API都封装在这个ExtendWebElement类里。。。

posted @ 2015-10-23 15:31  TingJie  阅读(324)  评论(0)    收藏  举报