重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
好长一段时间没有写技术博客了,浑浑噩噩的过了这么多日子,一直处于瞎忙的状态,荒废了好多时光。今天静下来想想,继续上路。
企业建站必须是能够以充分展现企业形象为主要目的,是企业文化与产品对外扩展宣传的重要窗口,一个合格的网站不仅仅能为公司带来巨大的互联网上的收集和信息发布平台,创新互联建站面向各种领域:橡塑保温等成都网站设计、网络营销推广解决方案、网站设计等建站排名服务。
之前有记录了关于怎样搭建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)可扩展性更强