selenium(1)

refer 朝天椒的夏天

一.selenium入门概念篇

最近开始接触selenium,刚开始时仅仅是知道它是一个开源的web自动化测试工具,然后自然想到了QTP,查了下资料差不多了解到selenium和QTP的主要区别:selenium灵活轻巧免费,QTP功能强大收费。

好吧,那就开始吧,然而开始学习selenuim的道路却是艰难的,网上查资料出现各种selenium,什么selenium IDE,selenium rc,selenium 2,selenium webdrive,selenium+java,selenium+python,简直吓死宝宝了。

本着磨刀不误砍柴工的想法,我先来整理下脑子里的那一团乱麻。

Selenium IDE:适合selenium的入门学习,它可以用来录制脚本,把你在浏览器上的操作记录下来,貌似现在只在FireFox浏览器下支持,安装一个selenium ide插件即可,主要就是一个录制回放功能,是不是很简单,对于我这种编程小白真是亲切感十足。

界面如下:

但是,IDE功能局限性很大,只能实现一个录制、回放,帮助识别对象,导出自动生成不同语言的代码功能,无法解决的问题如下:

So,高级版来了。

Selenium rc:我们平时所说的selenium说的都是selenium1,也就是Seleniumrc,rc是remote control的缩写,它是使用具体的语言来编写测试类,然后进行测试,功能就是用来模拟一个浏览器,主要测试web。它支持的语言非常多,C#,Java都行。

Selenium Webdrive:话说selenium1他曾经有个非常强的竞争对手就是Webdriver,后来Selenium团队发布了Selenium2。Selenium2= Selenium1+webdriver,也就是Selenium Webdrive。

而什么又是webdrive呢:WebDriver是一个用来进行复杂重复的web自动化测试的工具。意在提供一种比Selenium1.0更简单易学,有利于维护的API。它没有和任何测试框架进行绑定,所以他可以很好的在单元测试和main方法中调用。一旦创建好一个Selenium工程,你马上会发现WebDriver和其他类库一样:它是完全独立的,你可以直接使用而不需要考虑其他配置,这个SeleniumRC是截然相反的。

python+selenium以及Java+selenium:只是用selenium搭建不同的平台而已,使用语言分别为python、java。据说这些方式写脚本会更加灵活,更有效率,可读性强,重复运行稳定性高,而且也易于维护。这里的selenium应该指的是Selenium Webdrive。

有没有觉得思路稍微清晰些呢?关于各种方式的详细使用还是等小白慢慢学习后再来显摆吧。

二、Selenium IDE

1.前面已经说过,selenium ide仅支持firefox,(可点击查看selenium入门概念篇)所以先下载firefox浏览器,版本不需要太高,太新的版本可能有不兼容的问题出现,我下载的版本是32.0.3,下载完成后设置firefox浏览器不自动更新(在工具-选项-更新中选择不检查更新)

2.下载selenium ide,firefox浏览器有自带的selenium ide组件,但是很久未更新,可在工具-附加组件中查看,所以推荐手动下载selenium-ide-2.9.0.xpi,应该算是比较新的。下载后直接拖到firefox页面,会弹出提示是否安装附加组件,点击安装即可。重启浏览器可看到工具下多了selenium ide项。

3.selenium ide界面如下:

主要就是录制,设置断言(检查点),识别对象,回放,导出代码功能。

4.实例:当弹出上面的IDE窗口后,就可以开始Selenium的脚本录制了,点击右上角红色圆点,当它下按时就表示IDE正在进行脚本录制。录制的时候,直接操作Firefox浏览器窗口就可以了,IDE会自动记录你的操作步骤

l录制:我的操作步骤如下:在百度首页,输入“自动化测试”,点击百度一下,然后在跳转页面点击第一个标题“MTC-专业APP测试平台”,记录步骤如下:

l回放:点击绿色的回放按键,回放失败,提示未找到MTC链接,因为网页加载有延时,而脚本执行速度很快,所以会出现这样的现象

l 插入等待时间:解决方法是加入等待时间后再执行点击MTC链接步骤,选中点击MTC链接的步骤,右键,insert new command

在command处输入waitfor,会出来很多参数,这个大家可以自己研究,我这里选择waitforelementpresent,即等待我设置的对象出来后再执行下一步操作

点击select,再点击find按键,将鼠标移到网页中,直接选择我们下一步需要点击的链接,对象识别成功

再次回放,这次就回放成功了。

l验证:需要验证是否回放成功,可以设置检查点,比如,步骤执行完后,检验是否有出现baiduMTC|移动云测试中心,如检测到则证明回放成功。

还是插入一个command,但是类型为assertelementpresent,选中上图框选的对象,即可对结果进行验证。

l 脚本转换:点击标签页source,可查看默认的html脚本

Selenium IDE还有一个重要的功能就是把脚本的转换,可以把HTML的脚本转为C#,JAVA等等其他语言的脚本,为日后写Selenium RC的测试案例提供了极大的方便。

selenium上传本地图片

selenium进行自动化测试时,会碰到需要上传本地图片功能,一般操作是点击上传按键,弹出系统自带的选择文件对话框,然后选择图片,确定。

如果上传按键的属性为type:file时,操作就很简单,使用sendKeys("文件路径")即可。

如获取的上传按键元素为:

操作代码如下,就可以实现成功自动上传图片:

driver.findElement(By.id(s1)).sendKeys("E:\\test1.jpg");

做web自动化时,常常会碰到需要定位的元素id不是固定的,无法通过id进行定位,比如,我碰到的一个上传本地图片的“上传”按键元素,通过firebug查看该元素为

selenium定位动态id元素

因该元素id是动态的,无法通过id属性进行定位,只好换成xpath.

1.通过绝对路径定位:

By.xpath("/html/body/div[3]/div[2]/div/form/div/div[5]/div/div[3]/div/div[3]/div/div/span/input[9]")----无法定位

2.通过元素索引定位:

By.xpath("//input[9]")---成功定位

顺便补上xpath的另外几种定位方式:

3.使用xpath属性定位

By.xpath("//input[@id='kw1']")

By.xpath("//input[@type='name' and @name='kw1']")

4.使用部分属性值匹配(最强大的方法)

By.xpath("//input[start-with(@id,'file')

By.xpath("//input[ends-with(@id,'_11')

By.xpath("//input[contains(@id,'_')]")

当然,还有其他的方式比如css,name等等,根据定位元素的属性进行选择,一种方式不行时就多试几种其他的方式。

另外,可通过查找动态id的规律,来获取id并定位元素。

比如:

我这里测试需求是,需要上传4张图片,则需要定位4个上传按键,使用上面的//input[9]只能成功定位到第一个按键,后面3个还是无法定位,通过firebug查看元素发现,4个按键的id值虽然是动态的,但是有一定的规律,后面两项的数值是依次递增的,只要在获取的第一个ID值上进行累加即可。

所以成功定位了第一个上传按键后,获取到他的ID值,就可以根据规律算出后面3个按键的id值,即可再通过id属性对其他的三个按键进行定位。

部分代码如下:

Strings1=driver.findElement(By.xpath("//input[9]")).getAttribute("id");

//获取第一个上传按键的id file_0_35440853_1000001_9

System.out.print(s1+"\n");

//获取前半截不变字串file_0_35440853_

String ss1=s1.substring(0,16);

//获取变化字符串1000001

int ss2=Integer.parseInt(s1.substring(16, 23));

//获取变化字符串72

int ss4=Integer.parseInt(s1.substring(24,s1.length()));

//第二个上传按键idfile_0_35440853_1000002_10

String s2=ss1+Integer.toString(ss2+1)+"_"+Integer.toString(ss4+1);

//第三个上传按键id file_0_35440853_1000003_11

String s3=ss1+Integer.toString(ss2+2)+"_"+Integer.toString(ss4+2);

//第四个上传按键id file_0_35440853_1000004_12

String s4=ss1+Integer.toString(ss2+3)+"_"+Integer.toString(ss4+3);


Selenium获取并验证下拉框选项值

在编写自动化测试用例时,我们有时候会需要编写脚本来验证下拉框的选项个数,以及验证下拉选项描述是否与需求一致。

如下图,测试需求为:

1.验证该下拉框选项个数为8

2.验证该下拉框不可多选

3.验证8个下拉选项描述正确

4.选择“无社保”项

测试脚本如下:

public void SheBao() throws Exception {

/** 检查社保信息核实选项**/

// 预期的选项内容存放在StateOptions

List StateOptions = Arrays.asList(new String[] {"请选择","社保单位名称与申请表一致",

"社保单位名称与申请表不一致","无社保","无法验证社保信息","其他","欺诈嫌疑","未填"});

//获取StateOptions选项内容个数

int size1=StateOptions3.size();

/** 遍历下拉列表所有选项**/

Select selectState = new Select(driver.findElement(By.name("MCRG03"))); //通过name属性定位到社保选项

// 验证下拉列表不支持多选

Assert.assertFalse(selectState.isMultiple());

List act_StateOptions= new ArrayList();//实例化一个list表

// 判断选择内容

for (WebElement e : selectState.getOptions()) {

// 将实际的下拉列表内容注入到act_StateOptions中

act_StateOptions.add(e.getText());

}

//将实际结果与预期的选项内容进行比较。

Assert.assertEquals(StateOptions.toArray(), act_StateOptions.toArray());

//选择“无社保”项

selectState.selectByVisibleText("无社保");

//打印结果信息

System.out.println("社保信息核实--下拉列表共"+size1+"项,不可多选,选项均显示正确");

}

}


Selenium获取页面指定元素个数

测试需求:

获取页面中下拉框个数,并验证是否与预期个数一致

方法1:因下拉框的tagname属性值为select,可通过获取标签为select的元素来获取下拉框个数

List elements = driver.findElements(By.tagName("select"));

int number=elements.size();

Assert.assertEquals(number,12);//验证是否为12

方法2:因下拉框默认显示“请选择”,可通过获取页面的“请选择”元素来获取下拉框个数。

List elements = driver.findElements(By.xpath("//*[text()='请选择']"));

int number=elements.size();

Assert.assertEquals(number,12);//验证是否为12

xpath用法扩展:

1.contains

driver.findElement(By.xpath("//a[contains(@href, 'logout')]"));

寻找页面中href属性值包含有logout这个单词的所有a元素,其中@后面可以跟该元素任意的属性名。

driver.findElement(By.xpath("//*[contains(text(), '退出')]"));

直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找

如果知道超链接元素的文本内容,也可以用

driver.findElement(By.xpath("//a[contains(text(), '退出')]"));

2.starts-with

driver.findElement(By.xpath("//a[starts-with(@class, 'a')]"));

超链接上显示部分或全部文本信息时,可以使用。

寻找class属性以a开头的a元素。其中@后面的class可以替换成元素的任意其他属性.

3.关于网页中的动态属性的定位

a.starts-with

例子:input[starts-with(@id,'ctrl')]解析:匹配以ctrl开始的属性值

b.ends-with

例子:input[ends-with(@id,'_userName')]解析:匹配以userName结尾的属性值

c.contains()

例子:Input[contains(@id,'userName')]解析:匹配含有userName属性值


测试需求:

对提交的表单数据评分规则进行验证,如其中一项,申请人社保信息核实,选项以及每个选项的得分如下:

手工编写测试用例步骤如下:

使用testng+xml进行自动化测试时,需要准备如下步骤:

1.编写测试脚本(工具eclipse,语言java)

2.在xml文件中设置测试参数

3.执行xml文件

l 编写测试脚本,主要包括定义需要传递的参数名称,定位测试项,以及输出选项得分

package test1;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.ui.Select;

import org.testng.annotations.Parameters;

import org.testng.annotations.Test;

public class NewTest1 {

WebDriver driver;

@Parameters({ "SheBao" })

@Test

public void Part2(String SheBao) {

// 定位社保选项

new Select(driver.findElement(By.name("MCRG03")))

.selectByVisibleText(SheBao);

// 输出选项的对应分值

if ("社保单位名称与申请表不一致".equals(SheBao) | "无社保".equals(SheBao)

| "无法验证社保信息".equals(SheBao) | "其他".equals(SheBao)

| "未填".equals(SheBao)) {

System.out.println("社保=0");

} else if ("社保单位名称与申请表一致".equals(SheBao)) {

System.out.println("社保=1");

} else {

System.out.println("社保=-50");

}

}

}

使用@Parameters为测试方法传递参数,第一步是在测试类中定义测试方法时,通过@Parameters为测试方法声明参数的名称;第二步是在testng.xml配置文件中通过测试参数的名称为测试参数赋值。

注:@Parameters可以声明多个参数,但是要与测试方法、testng.xml的参数,一一对应.

l 在testng.xml中设置测试参数,参数值为社保选项得分为1的值,格式如下:


l 执行用例,选中testng.xml,右键,run as-testng suite

则可自动选中社保选项"社保单位名称与申请表一致",并打印出“社保=1”。

以上就是成功执行了手工用例中的第一条用例。执行其余步骤同上。

虽然看起来似乎会觉得就验证这样一个选项花费了太多的时间,还不如手动点击验证下,但是实际上以上只是一个页面中的其中一个验证点而已,如果有多个验证点时,则可在xml文件中设置多个参数,在回归测试中就可以体现出来优势了,而且使用xml文件管理测试数据,也实现了代码和数据的分离,便于后期的维护,修改测试数据也很方便。

推荐阅读更多精彩内容