Selenium工具集
Selenium Remote Control 原始版本
Selenium WebDriver
Selenium Server 调用远程浏览器
Selenium Client 脚本端
Selenium IDE 录制脚本
Selenium Grid 分布式
Grid的原理
使用HUB来控制服务端对应的节点,我们只要通过脚本来控制HUB,来通过HUB来通过对应的服务来执行用例即可
优点:
1、所有测试的中心入口点
2、管理和控制浏览器,手机设备等运行的NOdes/环境
3、扩展
4、并行运行测试
5、跨平台的测试
6、负载平衡
安装
官方下载https://www.selenium.dev/downloads/
Selenium Grid文档:https://github.com/SeleniumHQ/selenium/wiki/Grid2
Appium Grid文档:https://www.selenium.dev/documentation/zh-cn/grid/
启动
1、Selenium Grid启动
https://www.selenium.dev/documentation/zh-cn/grid/grid_3/setting_up_your_own_grid/
Appium Grid启动
到对应jar包下运行
java -jar selenium-server-standalone-3.141.59.jar -role hub
注册node节点:java -jar selenium-server-standalone-3.141.59.jar -role node -nodeConfig node.json
2、然后进入:http://30.203.160.103:4444/grid
地址:http://30.203.160.103:4444/grid/console
3、然后通过http://appium.io/docs/cn/advanced-concepts/grid/获取到配置文件
原配置文件
{
"capabilities":
[
{
"browserName": "<e.g._iPhone5_or_iPad4>",
"version":"<version_of_iOS_e.g._7.1>",
"maxInstances": 1,
"platform":"<platform_e.g._MAC_or_ANDROID>"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://<host_name_appium_server_or_ip-address_appium_server>:<appium_port>/wd/hub",
"host": <host_name_appium_server_or_ip-address_appium_server>,
"port": <appium_port>,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": <grid_port>,
"hubHost": "<Grid_host_name_or_grid_ip-address>"
"hubProtocol": "<Protocol_of_Grid_defaults_to_http>"
}
}
配置后
{
"capabilities":
[
{
"browserName": "Android",
"version":"6.0",
"maxInstances": 1,
"platform":"Android"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://localhost:4723/wd/hub",
"host":"localhost",
"port":4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "30.203.160.103",
"hubProtocol": "http"
}
}
appium --nodeconfig node.json # 这时不要启动appium服务
这时再访问下【http://30.203.160.103:4444/grid/console】就可以发现多一个设备注册成功了。
在HUB端查看注册出的节点
添加节点到脚本中
class App(BasePage):
_package = "com.xueqiu.android"
_activity = ".view.WelcomeActivityAlias"
def start(self):
if self._driver is None:
desire_cap = dict()
desire_cap["platformName"] = "android"
desire_cap["deviceName"] = "emulator-5554"
desire_cap["appPackage"] = self._package
desire_cap["appActivity"] = self._activity
desire_cap["noReset"] = True
self._driver = webdriver.Remote('http://30.203.160.103:4444/wd/hub',desire_cap) # 通过HUB注册出的脚本
else:
self._driver.start_activity(self._activity,self._package)
self._driver.implicitly_wait(15)
return self
def main(self):
return Main(self._driver)
多设备时,添加新的json文件(注意指明设备udid)
{
"capabilities":
[
{
"browserName": "Android",
"version":"6.0",
"maxInstances": 1,
"platform":"Android"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4725/wd/hub", # 更改了端口
"host":"127.0.0.1",
"port":4725, # 更改了端口
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "30.203.160.122",
"hubProtocol": "http"
}
}
client端指定设备名udid
class App(BasePage):
_package = "com.xueqiu.android"
_activity = ".view.WelcomeActivityAlias"
def start(self):
if self._driver is None:
desire_cap = dict()
desire_cap["platformName"] = "android"
desire_cap["deviceName"] = "emulator-5554"
desire_cap["udid"] = os.getenv("udid",None) # 获取系统的udid
desire_cap["appPackage"] = self._package
desire_cap["appActivity"] = self._activity
desire_cap["noReset"] = True
self._driver = webdriver.Remote('http://30.203.160.122:4444/wd/hub',desire_cap)
else:
self._driver.start_activity(self._activity,self._package)
self._driver.implicitly_wait(15)
return self
def main(self):
return Main(self._driver)
使用shell脚本一步运行该文件的多条用例
for i in `adb devices | grep 'device$' | awk '{print $1}'`
do
echo $i
udid = $i pytest test_search.py &
done
google android 原生monkey、app crawler
百度 smartmonkey
腾讯 newmonkey
vigossjjj smart_monkey
macaca 的 NoSmoke
头条的zhangzhao maxim
weveniruby appcrawler
简介:
Monkey是一个子啊模拟器或设备上运行的程序
生产用户事件的伪随机流
安装
Android SDK提供了Monkey工具
使用移动设备
使用
基本配置选项,例如设置事件数量
操作约束,例如对指定App进行测试
事件类型和频率
调试选项
adb shell monkey [options] 事件计数
使用Monkey基本命令
abd shell monkey 100 对所有包随机操作
adb shell monkey -p com.xueqiu.android 100 指定包
adb shell monkey -p com.xueqiu.android -s 20 80 时间种子(方便回溯,重复同样的操作)
adb shell monkey -p com.xueqiu.andorid -vv -s 20 80 详细日志 (-s 指定有规律的)
adb shell monkey -p com.xueqiu.android --throttle 5000 100 时间延迟
adb shell monkey -p com.xueqiu.android --pct-touch 10 1000 提升事件百分比(这里是提升touch事件到10%)
相关事件:
–pct-touch:触摸事件,比如:点击
–pct-motion:动作事件,比如:滑动
–pct-trackball:轨迹事件,比如:移动 + 点击,曲线滑动
–pct-majornav:主要导航事件,比如:回退按钮,菜单按键
Android Monkey 进行改进
1、基于遍历规则
2、高性能
使用
下载地址:https://github.com/zhangzhao4444/Maxim
将 framework.jar , monkey.jar push 到手机上某个目录中,建议/sdcard
adb push framework.jar /sdcard
adb push monkey.jar /sdcard
命令行模式
cmd 命令 : adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatormix --running-minutes 60 -v -v
参数说明:
tv.panda.test.monkey.Monkey: monkey入口类,不要修改
com.panda.videoliveplatform: 被测app包名,需要修改
–uiautomatormix: 遍历策略
策略
1、模式DFS–uiautomatordfs
- 增加深度遍历算法
2、模式Mix–uiautomatormix
- 使用accessibilityserver获取界面接口解析各控件
- 随机选取一个控件执行touch操作
- 同时与原monkey其他操作按比例混合使用
策略
1、模式 Mix (基于事件概率的压力测试)
--uiautomatormix
直接使用底层accessibiltyserver获取界面接口 解析各控件,随机选取一个控件执行touch操作。
同时与原monkey 其他操作按比例混合使用
默认accessibilityserver action占比50%,其余各action分剩余的50%
accessibilityserver action占比可配置 --pct-uiautomatormix n
2、模式 DFS
--uiautomatordfs
深度遍历算法
3、模式Troy
--uiautomatortroy
控件选择策略按max.xpath.selector配置的高低优先级来进行深度遍历
4、保留原始monkey
5、总运行时长 --running-minutes 3 运行3分钟
6、–act-whitelist-file /sdcard/awl.strings 定义白名单 --act-blacklist-file
其他参数与原始monkey一致
后续…
介绍
1、地址:https://github.com/openstf/stf
2、OpenSTF是一个手机设备管理平台
3、可以对手机进行远程管理、调试、远程手机桌面监控等操作
4、最好使用Linux系统、Mac系统
5、NODE_VERSION=8.16.1
Mac安装:
brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config
windows安装
使用Docker安装
1、拉取镜像
docker pull openstf/stf:latest
docker pull sorccu/adb:latest
docker pull rethinkdb:latest
2、启动上面拉去的镜像
启动rethinkdb
docker run -d --name rethinkdb -v /宿主机目录:/data --net host rethinkdb
rethinkdb --bind all --cache-size 8192 --help-port 8090
启动stf
docker run -d --name stf --net host openstf/stf stf local --allow-remote
然后访问:localhost:7100
API使用说明
说明文档:https://github.com/openstf/stf/blob/master/doc/API.md
远程连接手机
1、将手机使用手机线连接到电脑,并且在手机的设置中打开开发者模式。
2、在电脑终端,使用adb devices查看设备是否连接上,然后在stf中查看是否连接上
3、给手机开一个远程调试端口 使用命令
adb -s 手机设备名 tcpip 6666
4、查看手机ip地址(部分手机设置了权限无法查看,这时就只能直接在手机上查看了)
adb -s 手机设备名 shell ifconfg
5、查看主机ip确认是否和手机是在一个网段下(确认在同一网段后)
6、开始使用远程连接来连这个设备,终端操作
adb connect 自己手机的IP地址:6666 (加上开的调试端口这是是6666)
7、这时再使用adb devices查看下是否连接成功,然后在stf网页中查看是否连接上。如果成功就连接成功了。
如果没有成功,可以重新连接下:
adb kill-server
adb start-server
adb connect 自己手机的IP地址:6666 (加上开的调试端口这是是6666)
Instruments 使用说明:https://www.jianshu.com/p/dcc342cda042?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
Traceview 使用说明:https://www.jianshu.com/p/7e9ca2c73c97