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 }
4.最后的调用方式还是:
1 page.getElement("百度按钮").click();
且你能在里面添加你想要添加的代码,最终的脚本,根本不用改啥。。。简直屌爆!
当然,这个也有弱点,就是要把常用的webdriver的API都封装在这个ExtendWebElement类里。。。

浙公网安备 33010602011771号