好长一段时间没有写技术博客了,浑浑噩噩的过了这么多日子,一直处于瞎忙的状态,荒废了好多时光。今天静下来想想,继续上路。
之前有记录了关于怎样搭建webdriver的测试环境,也记录了一些小技巧,也给出实例怎样真正开始动手写一个自动化测试的case.但是真正的自动化测试项目中,只会那些还是远远不够的,细想一下,如果每一个步骤要有driver.findElement只论可读性的话就该够你喝一壶的了,更别谈维护了。这时脑子上灯突然闪了下,貌似你好像有了些灵感,那些重复的语句,可以封装吗?那么我们就先从findElement的方法开始我们的框架设计之旅。
我们首先来看看原生的webdriver找元素的方法,以id为例: driver.findElement(By.id(” “)),暂时抛开driver, findElement方法中包含了2个部分By 和id(元素的属性)By是原生的关键字,这里我们也先不动它,我们先从id入手,其实不光id,有很多通过元素属性找元素的方法,比如: id,name,cssSelector,xpath,linkText,tagName等等等。。
这里我们就可以做文章了,比如我们实例化一个By locator 的方法,把有可能用到的元素属性都列在里面,根据用户提供的元素属性的不同调用不同的方法,元素属性包含2个部分:属性名称,属性value中间可用‘:’隔开。
1. 如果用户的输入没有‘:’,那么默认调用By.id()方法
2. 如果用户的输入包含’:’,那么根据实际情况来判断,通过‘:’把元素用户输入分开,通过’:’左边分离出来的字符串来判断具体的调用方法。通过‘:’右边分离出来的字符串来传入实际的属性value
public static By locator(String locator) {
if (!locator.contains(“:”)) {
return By.id(locator);
} else {
String[] lArr = locator.split(“:”);
String by = lArr[0];
//取到冒号后面的具体的元素属性
String using =locator.substring(by.length()+1);
if (by.equalsIgnoreCase(“id”)) {
return By.id(using);
} else if (by.equalsIgnoreCase(“name”)) {
return By.name(using);
} else if (by.equalsIgnoreCase(“xpath”)) {
return By.xpath(using);
} else if (by.equalsIgnoreCase(“cssSelector”)) {
return By.cssSelector(using);
} else if (by.equalsIgnoreCase(“linkText”)) {
return By.linkText(using);
} else if (by.equalsIgnoreCase(“partialLinkText”)) {
return By.partialLinkText(using);
} else if (by.equalsIgnoreCase(“tagName”)) {
return By.tagName(using);
} else if (by.equalsIgnoreCase(“className”)) {
return By.className(using);
} else {
throw new IllegalArgumentException(“Cannot find elements when name text is null.”);
}
}
}
3. 定义一个getEelment的方法
public static WebElement getWebElement(String locator) {
WebElement we;
we = driver.findElement(locator(locator));
return we;
}
这样找元素的方法就简单的完成了,但是这么做有什么好处呢?
a) 不用过分关心底层找元素的方法,我只要提供对元素的属性就可以了,可以是id,name….
b) 重用了findElement方法,不用写很多次,只定义一次,无限次调用
c) 维护更容易,不用频繁的该代码,出错了只要改很少的地方,实现了属性和方法的分离
d)可扩展性更强
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/193268.html