我们来看一下官网提供的代码写法,即最原始的写法:
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类里。。。
时间: 2024-11-05 16:02:52