1.管理文件格式:yaml
2.Yaml里面的内容格式:

 
3.格式说明:
baidu_input后面接上":",直接回车,然后空两格
type与value这两个key是固定的,后面接上":",然后空一格,也可以不空,如果value后面是xpath,建议用加上引号
在webdriver中,有By.id,By.name,By.xpath,By.className,By.linkText等,我们选取这几种常见的,所以type的冒包后面可用的值为id,name,xpath
value的值为type中对应的类型的值,比如百度首页上的输入框的id='kw'

4.解析yaml文件

5.我们在写脚本时,元素对象一般是这样写的WebElement element = driver.findElement(By.id(“kw”));所以接下来我们要把ml变量里的“value”转换成By对象。添加如下代码,这样通过ml中的type与value的值就对产生一个By对象。

6.By对象产生后,就可以把这个对象传给driver.findElement方法,继而生成一个WebElement对象.

7.到这里,已经成功了一半,因为已经把yaml文件中保存的元素成功的转化成了WebElement对象。但是还不够,接下来我们引入一下同步点的概念,就 是在调用locator时,保证locator是显示在页面上的,webdriver中有个WebDriverWait对象,代码如下:

8.于是乎getElement方法里面就可以改为

9.到这一步,又改进了一点,新的问题也随之产生了,watiForElement这个方法,返回的WebElement对象包括隐藏的,如果是隐藏的,那么在操作的时候,自然而然会报错,所以,我们得把隐藏的去掉,只显示displayed的元素对象,增加一个方法。

10.如此一来,getElement方法又可以改进一下了。

11.既然有等待元素对象显示的,那么反之就有等待元素对象消失的方法。

12.看上去一切很美好了,but....如果我们要验证一个元素对象不出现在页面上,就会出现问题了,于是增加一个方法

13.现在的问题是getElement与getElementNoWait的方法体很接近,于是我们来重构下这部分的代码,先增加一个方法,存放相同的方法体

14.再把getElement与getElementNoWait方法进行修改

15.元素对象的参数化:

16.在这里面的参数用%s来表示,于是在脚本中,我们调用getElement与getElementNoWait方法时需要我们把value给传进去,我们再来处理下这部分,增加一个方法。

17.重构getLocator方法:

18.可以看到getLocator方法的参数变了,于是要重新的更改getElement与getElementNoWait方法,同时重载这两个方法。

具体代码如下

Locator.java:

package com.test.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map; import org.ho.yaml.Yaml;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class Locator {
private String yamlfile;
private WebDriver driver;
private Map<String, Map<String, String>> ml; public Locator(WebDriver driver) {
yamlfile = "TestBaidu";
this.getYamlFile();
this.driver = driver;
} public void getYamlFile() {
File f = new File("locator/" + yamlfile + ".yaml");
try {
ml = Yaml.loadType(new FileInputStream(f.getAbsolutePath()),
HashMap.class);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } private By getBy(String type, String value) {
By by = null;
if (type.equals("id")) {
by = By.id(value);
}
if (type.equals("xpath")) {
by = By.xpath(value);
}
return by;
} public WebElement getElement(String key) {
// String type = ml.get(key).get("type");
// String value = ml.get(key).get("value");
// // return driver.findElement(this.getBy(type, value));
// // return this.waitForElement(this.getBy(type, value));
// WebElement element;
// element = this.waitForElement(this.getBy(type, value));
// if (!this.waitElementToBeDisplayed(element))
// element = null;
// return element;
// return this.getLocator(key, true);
return this.getLocator(key, null, true);
} public WebElement getElement(String key, String[] replace) { return this.getLocator(key, replace, false);
} private boolean waitElementToBeDisplayed(final WebElement element) {
boolean wait = false;
if (element == null)
return wait;
try {
wait = new WebDriverWait(driver, config.waitTime)
.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return element.isDisplayed();
}
});
} catch (Exception e) {
System.out.println(element.toString() + " is not displayed");
}
return wait;
} private boolean waitElementToBeNonDisplayed(final WebElement element) {
boolean wait = false;
if (element == null)
return wait;
try {
wait = new WebDriverWait(driver, config.waitTime)
.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return !element.isDisplayed();
}
});
} catch (Exception e) {
System.out.println(element.toString() + " is also displayed");
}
return wait;
} private WebElement waitForElement(final By by) {
WebElement element = null;
int waitTime = config.waitTime;
try {
element = new WebDriverWait(driver, waitTime)
.until(new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver d) {
return d.findElement(by);
}
});
} catch (Exception e) {
System.out.println(by.toString() + " is not exist until "
+ waitTime);
}
return element;
} public WebElement getElementNoWait(String key) {
// WebElement element;
// String type = ml.get(key).get("type");
// String value = ml.get(key).get("value");
// try {
// element = driver.findElement(this.getBy(type, value));
// } catch (Exception e) {
// element = null;
// }
// return element;
// return this.getLocator(key, false);
return this.getLocator(key, null, false);
} // 多态形式,字符串替换
public WebElement getElementNoWait(String key, String[] replace) { return this.getLocator(key, replace, false);
} // 由于getElement和getElementNoWait非常相似,所以重构一下这两个方法
private WebElement 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.waitForElement(by);
boolean flag = this.waitElementToBeDisplayed(element);
if (!flag)
element = null;
} else {
try {
element = driver.findElement(by);
} catch (Exception e) {
element = null;
}
}
} else {
System.out.println("Locator " + key + " is not exists in "
+ yamlfile + ".yaml");
}
return element;
} private String getLocatorString(String locatorString, String[] ss) {
for (String s : ss) {
locatorString = locatorString.replaceFirst("%s", s);
}
return locatorString;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SeleniumDriver selenium = new SeleniumDriver();
WebDriver driver = selenium.getDriver();
Locator l = new Locator(driver);
driver.navigate().to("http://www.baidu.com");
WebElement element;
element = l.getElement("baidu_input1");
// String[] replace = new String[] { "kw" };// element = l.getElement("baidu_input", replace);
element.sendKeys("aa");
} }

TestBaidu.yaml:

baidu_input:
type:id
value:"%s"
baidu_button:
type:id
value:"%s%s"
baidu_input1:
type:id
value:kw
baidu_button1:
type:xpath
value:"//div[@id='%productId%']//div"

最后打个广告,不要介意哦~

最近我在Dataguru学了《软件自动化测试Selenium2》网络课程,挺不错的,你可以来看看!要是想报名,可以用我的优惠码 G863,立减你50%的固定学费!

链接:http://www.dataguru.cn/invite.php?invitecode=G863

selenium2-元素管理方式及解析的更多相关文章

  1. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  2. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

  3. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  4. ObjC如何通过runtime修改Ivar的内存管理方式

    ObjC如何通过runtime修改Ivar的内存管理方式 为什么要这么做? 在iOS 9之前,UITableView(或者更确切的说是 UIScrollView)有一个众所周知的问题: propert ...

  5. 反射 类的加载 Schema DOM 解析方式和解析器 命名空间

    Day15 反射 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. l 加载 就是指将class文件读入内存,并为之创建 ...

  6. 【Android 应用开发】AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

  7. Ulua对象管理方式

    不管是C++中还是在C#中,在都绕不开一个问题:类对象怎么在Lua中使用的问题,还好Lua提供了Userdata以及ligh Userdata结构类型,通过扩展可以处理这方面的问题.现在的很多框架也大 ...

  8. 8 -- 深入使用Spring -- 4...6 AOP代理:基于注解的XML配置文件的管理方式

    8.4.6 基于XML配置文件的管理方式 Spring 2.x 提供一个新的aop:命名空间来定义切面.切入点和增强处理. XML配置方式优点: ⊙ 如果应用没有使用JDK 1.5 以上版本,那么应用 ...

  9. AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

随机推荐

  1. vi命令使用

    在vi下如何显示行号? 按Esc切换到命令行模式,输入: :set nu 如果您想每次进入vi都标出行号,编辑~/.vimrc文件.也就是在用户的主目录下,编辑存档.vimrc文件.里边写一行: se ...

  2. Java选择排序算法

    package com.jckb; /**选择排序 * * @author gx *算法原理: *第一个数和后面每个数进行比较,如果大于后面的数就进行位置交换, *第一次比较结束后得到了最小值 */ ...

  3. fleet - 基于Machine Metadata的任务调度

    基于Machine Metadata的任务调度 复杂和特定的要求的应用程序可以针对一个子集的集群调度通过machine metadata.强大的部署拓扑结构,可以实现的基础上的机器的地区,机架位置,磁 ...

  4. IO流----转换流、缓冲流

    打开一个文本文件,另存为: Ansi就是系统默认编码(就是gbk) 建一个编码是utf-8的txt文件, 例: import java.io.FileWriter; import java.io.IO ...

  5. ribbon hystrix仪表盘

    Circuit Breaker: Hystrix Dashboard (断路器:hystrix 仪表盘) 基于service-ribbon 改造下: pom.xml加入: <dependency ...

  6. window.open()弹出窗口参数说明及居中设置

    window.open()可以弹出一个新的窗口,并且通过参数控制窗口的各项属性. 最基本的弹出窗口代码 window.open('httP://codeo.cn/'); window.open()各参 ...

  7. COGS 2794. 爱摔跤的比利海灵顿

    ★☆   输入文件:find_k.in   输出文件:find_k.out   简单对比时间限制:1.4 s   内存限制:128 MB [题目描述] B•海灵顿•雷想要和n个巨人比试摔♂跤,他想先和 ...

  8. 51nod 1101 换零钱

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元.   ...

  9. @Param注解在dao层的使用

    有时在前台用ajax传过来许多参数,不知道在mybatis如何封装,就要用到@Param注解了,这时就不需要在映射文件写传入参数了,这种方法虽然比较取巧,但还是很实用的,如下图:

  10. JDBC连接数据库报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. ......

    问题:Java程序使用JDBC连接MySQL数据库时,控制台报错如下: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' ...