利用Selenium自动化测试android wap页
针对智能手机端的应用的自动化测试,目前主要分两类:一是基于APP的apk自动化测试,二是浏览器的wap页测试。目前做的较多的是第一种情况,应用的自动化测试框架也较多,如NativeDriver、Robotium、calabash等;而第二种情况的自动化测试框架就较少了,目前较常用的为Selenium。
而利用Selenium的测试框架有Selenium+Junit、Selenium+testng为最常用。这里我就介绍下利用Selenium+testng测试手机端的wap页的页面展示。
该框架测试有个明显的缺点是:它利用AndroidDriver驱动,提供webview来显示http请求返回的内容,不能在其他浏览器上运行,就是说不能测试浏览器的兼容性。但这个可以测试不同机型的手机,做适配测试。因为webview使用android内置webkitt内核,不同机型的内核是有异的。
第一步,利用该框架测试手机端wap页时,必须在测试工程中(java project)导入selenium-server-standalone-2.25.0.jar和testng.jar。同时在手机端需要安装(webdriver)android-server-xxx.apk作为服务端分发http请求命令和显示返回内容。
第二步,在工程中,在准备好了上面的条件,可以通过命令来打开手机端的webdriver和连接服务端(启动手机端的webdriver)——放在测试用例执行前;当然也可以手动启动webdriver和在DOS下运行命令:
如
@BeforeTest
public void setUp() {
// 启动手机端的webdriver——作为服务端,没有其他前台应用
try {
//打开webdriver
Runtime.getRuntime().exec( "adb shell am start -a android.intent.action.MAIN " + "-n org.openqa.selenium.android.app/.MainActivity");
/*连接服务端webdriver,连接用的端口为8080,如果本地有开启了或使用了该端口,需要关闭(http://localhost:8080/exit),不然连接不上服务端webdriver */
Runtime.getRuntime().exec("adb forward tcp:8080 tcp:8080");
} catch (IOException e) {
e.printStackTrace();
}
driver = new AndroidDriver();
}
第三步,写测试用例,如
//用例中要用到外来数据时,作为参数queryString1传递,来源为dataProvider = “testdata”中的数据
@Test(dataProvider = "testdata")
public void testQuery1(String queryString1) {
//具体的用例执行(包括调用滑动和截屏,来达到获取想要的页面)
}
第四步,用例执行完之后,需要关闭终止驱动
@AfterTest
public void tearDown() {
driver.quit();
}
二、关于testng用例中带参数的数据源获取,在testng中大概有三种方法:一种是在testng.xml里配置,用@Parameters引用;第二种是使用DataProvider;第三种是继承FeedTest类获取数据。
这里主要讲下,第二种和第三种的使用:
1、使用DataProvider时,会在用例方法前有@Test(dataProvider = “testdata”),如
@Test(dataProvider = "testdata")
public void testQuery1(String queryString1) {
try {
// 统一编码格式
QUERY = URLEncoder.encode(queryString1.trim(), "utf-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//具体的用例执行
}
同时有个方法是获取数据源的,如以下例子,从txt文件中读取数据,并放在filelist中,为了DataProvider方便执行,返回列表的迭代器。读取数据时,有个编码encoding处理,这个是为了保证txt文件存储格式(UTF-8)一致,一遍用例执行使用的数据不会出现数据表示不一致的情况。当然为了任何地方一致,用例中对数据也最好处理,如上。
@DataProvider(name = "testdata")
public Iterator<String[]> getData() {
ArrayList<String[]> filelist = new ArrayList<String[]>();
String filepath = Data.getFileString();
try {
String encoding = "UTF-8";
File file = new File(filepath);
if (file.isFile() && file.exists()) {
// 判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);
// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = "";
while ((lineTxt = bufferedReader.readLine()) != null) {
String[] str = new String[1];
str[0] = lineTxt.trim();
filelist.add(str);
}
read.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return filelist.iterator();
}
2、使用FeedTest获取数据时,必须导入feed4testng-1.0-dist里的jar包才能使用,然后在测试类中继承FeedTest类就行,这个能自动读取数据,现在支持自动读取的有.xls和.cvs文件
如
public class OneTest extends FeedTest {
@Test(dataProvider = "feeder")
// 数据来源excel文件xls(97-2003版的)
@Source("D:/case/testcase2.xls")
public void testQuery1(String queryString1) {
/* 参数分别是读取xls文件的第一列、、、,第一行数据读不出,那是因为默认数据字段名称 */ }
}
使用该方式读取数据,我们可以不用再自己写方法读取数据了。但缺点就是数据来源的路径是固定的,如果在运行时要改变数据来源,是不行的。
除了支持两种文件可以@Source自动读取,可以读取其他类型的文件和数据库,具体可参见:
http://databene.org/feed4testng.html
三、针对自动化测试wap页面展示问题,当要测试的展示页面是通过在页面输入一个搜索词query的返回结果时,且query较多。在这种情况下我们手工输入再看页面展示,工作量就较大了。所以需要自动化测试(利用selenium),这样我们就不需要手动输入query再滑动页面看页面展示了;只需要看截下来的页面展示图就可以了 。那我们要实现的自动化就有搜索词展示、滑动页面到能看到的视区内、截屏。
- 针对搜索词query,有个注意的地方就是:搜索词不能有中文,如 element.sendKeys(“比亚迪”);就是不行,webdriver调起输入法时,只有英文输入那个界面。解决这个问题的方法就是把搜索词query放在URL里,如driver.get(“http://m.so.com/s?q=”+”比亚迪”);
- 针对搜索词的结果页,当前屏幕显示的不一定是需要的展示,而我们要截屏,又只能截取当前显示的,那么就只能滑动页面到当前显示的界面。
滑动有两种方法:两种方法都依赖于定位的元素element
如:下面的代码表示我想找测试类别为“汽车”的搜索词的某种展示,结果显示条数>=1。
// 该方法可以根据测试要求改变,(定位到什么元素)
public WebElement scrollCondition(WebDriver driver, String queryclass) {
// 寻找当前显示是否到达要求的显示,不是的话滑动
if (!queryclass.isEmpty()) {
if (queryclass.contains("汽车")) {
// 汽车类
elements = driver.findElements(By
.xpath("//h1 [@class='car-title icon-mobile']"));
}
}
if ((elements != null) && (elements.size() > 0)) {
element = elements.get(0);
}
}
方法一:
//该方法滑动后不停留,不利于截屏,不建议使用
Actions action=new Actions(driver);
action.moveToElement(element).perform();
方法二:
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
关于截屏可以利用ddmlib来截取(需要ddmlib.jar)
http://blogs.360.cn/360qtest/2014/02/28/通过ddmlib实现截图以及获取手机相关信息/
利用Selenium自动化测试android wap页的更多相关文章
- 利用selenium自动化测试样例一
import argparse import logging import psycopg2 import datetime,time import os,sys from selenium impo ...
- 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...
- Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...
- Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通
Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通Selenium接口性能自动化测试基础部分:分层自动化思想Slenium介绍Selenium1.0/2.0/3.0Slenium R ...
- Selenium自动化测试Python五:WebDriver设计模式
WebDriver 设计模式 欢迎阅读WebDriver进阶讲义.本篇讲义将会重点介绍Selenium WebDriver 自动化框架的设计,着重使用Page Object设计模式,以及使用HTML测 ...
- 【python爬虫】利用selenium和Chrome浏览器进行自动化网页搜索与浏览
功能简介:利用利用selenium和Chrome浏览器,让其自动打开百度页面,并设置为每页显示50条,接着在百度的搜索框中输入selenium,进行查询.然后再打开的页面中选中“Selenium - ...
- Python:利用 selenium 库抓取动态网页示例
前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...
- 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...
- 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...
随机推荐
- node.js中net模块创建服务器和客户端(TCP)
node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...
- 【2017-02-28】C# 冒泡排序
冒泡排序 重复地走访过要排序的数列,一次比较两个元素的大小,如果他们的顺序错误就把他们交换过来 通过两个For循环嵌套来实现 思路——以从小到大为例 第一个for循环抽取第一个数和第二个数进行比较,如 ...
- 【Hive学习之一】Hive简介
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...
- 网关绑定命令,解决arp攻击
一般家里的宽带都采用ADSL设备,通过固定IP地址接入Internet,但是经常会出现断网的现象,那么如何通过ARP命令绑定默认网关来解决这个问题呢? 工具/原料 ARP命令 CMD命令提示符 方法/ ...
- 用django统计代码行数+注释行数
实现统计代码行数: 1.首先在url.py中配置 from django.conf.urls import url from django.contrib import admin from app0 ...
- Python使用闭包结合配置自动生成函数
背景 在构建测试用例集时,常常需要编写一些函数,这些函数接受基本相同的参数,仅有一个参数有所差异,并且处理模式也非常相同.可以使用Python闭包来定义模板函数,然后通过参数调节来自动化生产不同的函数 ...
- 区块链公链分片技术(sharding)方案,配思维导图
区块链公链分片技术(sharding)方案,配思维导图 分片技术(sharding)方案 以太坊分片思路 其基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之 ...
- Linux 进程管理 ps、top、pstree命令
ps命令:查看系统中正在运行的进程 ps 是用来静态地查看系统中正在运行的进程的命令.不过这个命令有些特殊,它的部分选项不能加入"-",比如命令"ps aux" ...
- CentOS7安装MySQL冲突和问题解决小结
摘自:https://blog.csdn.net/typa01_kk/article/details/49059729 问题1: [root@localhost install-files]# rpm ...
- ubuntu_virtualenv
sudo pip install virtualenv 1.安装virtualenv(需要先安装pip): $ [sudo] pip install virtualenv 2.创建虚拟环境: $ vi ...