文章目录
- 问题归整
- 1. [华为手机如何打开开发者权限](https://jingyan.baidu.com/article/49ad8bce96e1955835d8fa57.html)
- 2. 报错,大意:编译器没有找到对应的“name”方法
- 3. 报错:大意:由于目标计算机积极拒绝,无法连接。
- 4. 报错,大意“不能通过定义的元素属性定位到元素”?
- 5.报错,大意: selenium无法创建一个session(会话),已有一个会话在进行中。
- 6.使用uiautomatorviewer 查看android某些页面元素,报错大意:获取页面层级出错
- 7. 如何从Excel中获取脚本元素
- 8. 如何实现,定位不到某个元素的时候代码提示?
- 9. 如何实现识别app的tocat?
- 10. 如何实现滑动滑块?
- 11. 关于appium不能输入汉字的问题?
- 12. 脚本不能识别给定元素?
- 第一章 Apium初识
- 第二章 app元素的定位及操作
- 第三章 Unittest单元测试框架
- 第四章 app自动化实战
问题归整
https://www.cnblogs.com/chaoyangya/p/9774614.html
1. 华为手机如何打开开发者权限
2. 报错,大意:编译器没有找到对应的“name”方法
- appium1.5及以下版本支持name定位,v1.6+版本,统一都不支持 by_name元素定位方法!
3. 报错:大意:由于目标计算机积极拒绝,无法连接。
- 手机没有通过USB连接到电脑
- 手机连接到电脑上要关闭各种手机助手,不要安装手机管家,不要安装手机管家,不要安装手机管家。
- 没有启动appium
- USB连接后没有选择连接方式,要将连接方式 选择为“文件传输(NTC)”
- 代码中手机设备名称显示错误“adb devices”
- 可能是由于屏幕关闭的原因的造成的,所以要保持在case运行过程中,一定要让屏幕处于点亮状态
4. 报错,大意“不能通过定义的元素属性定位到元素”?
- 页面还没有跳转到对应界面,解决办法:添加time,sleep()
- 页面拥有该属性的元素不唯一,解决办法:改变定位元素方法
5.报错,大意: selenium无法创建一个session(会话),已有一个会话在进行中。
解决办法:
- 每执行一次脚本暂停一次appium连接,并清楚上次运行信息
- 关闭手机上上次已经运行过,但未关闭的应用进程
6.使用uiautomatorviewer 查看android某些页面元素,报错大意:获取页面层级出错
解决办法:
- 手机需要重启
- appium服务异常需要重新连接
- 可以尝试切换USB接口
- 最后可以把手机开发者选项的USB调试撤销权限,在重新获取
- 该app不支持该页面的截屏功能所以uiautomatorviewer捕捉不到
7. 如何从Excel中获取脚本元素
https://www.cnblogs.com/linyfeng/p/7123423.html
8. 如何实现,定位不到某个元素的时候代码提示?
- 解决办法:使用捕获异常语句进行捕获异常。当需要对全部元素进行捕获的时候,需要将所有的元素写在“try:”语句下方。常用的方法建议写成一个工具类,对某个元素进行查找
check=driver.find_element_by_id("****")
def Check_element(self,check)
try:
check
except:
print('获取元素失败')
9. 如何实现识别app的tocat?
10. 如何实现滑动滑块?
11. 关于appium不能输入汉字的问题?
- send_keys 本质是点击键盘, setValue本质是给控件属性value赋值。能不能输入汉字跟机器安装的输入法有关
-解决办法
desc = {
"deviceName": "S000960221055",
# "deviceName": "Z2X4C15C14015116",
"platofromVersiom": "6.0.1",
"platformName": "Android",
"appPackage": "com.ynh.gjia.tt",
"appActivity": "com.ynh.gjia.tt.WelcomeActivity",
"unicodeKeyboard" :"True",# 脚本中需要输入汉字的时候必须指明这种输入法
"resetKeyboard":"True",# 运行完成的时候回复默认之前输入法
}
12. 脚本不能识别给定元素?
- 原因:
- 给定的元素搜索信息标识不唯一
- app网络原因,没有添加思考时间,页面没有跳转就进行了识别
第一章 Apium初识
第一讲 Apium 概述
1 Appium简介
Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。Appium对IOS系统的支持得益于Dan Cuellar’s对于IOS自动化的研究。Appium也集成了Selendroid,来支持老android版本。
Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架。如果只使用Apple的UIAutomation,我们只能用javascript来编写测试用例,而且只能用Instruction来运行测试用例。同样,如果只使用Google的UIAutomation,我们就只能用java来编写测试用例。Appium实现了真正的跨平台自动化测试。
2 特点
- 使用自动化来测试一个app,且不需要重新编译它
- 写自动化case(用例),不需要学习特定的语言。
- appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。
“移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。
“移动web应用”是指使用移动浏览器访问的应用(appium支持iOS上的Safari和Android上的 Chrome)。
“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 Phonegap,可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。
- appium是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,增加了iOS和Android测试套件间代码的复用性。
第二讲 appiun与 Selenium
- appium与Selenium
- appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
- appium服务端定义了官方协议的扩展,为appium用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载App。这就是为什么我们需要appium特定的客户端,而不是通用的Selenium客户端.
- appium客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium客户端,所以他们仍然可以用来运行通用的Selenium会话。
第三讲 appium工作原理
1. Android
在Android端,appium基于WebDriver协议,利用Bootstrap.jar,最后通过调⽤用UiAutomator的命令,实现App的自动化测试。
UiAutomator测试框架是Android SDK自带的App UI自动化测试Java库。另外由于UiAutomator对H5的支持有限,appium引入了chromedriver以及safaridriver等来实现基于H5的自动化。
appium 在android端工作流
client端也就是我们 test script是我们的webdriver测试脚本。中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
appium server会把请求转发给中间件Bootstrap.jar ,它是用java写的,安装在手机上.Bootstrap监听4724端口并接收appium 的命令,最终通过调⽤用UiAutomator的命令来实现。
最后Bootstrap将执行的结果返回给appium server。
appium server再将结果返回给 appium client。
2. ios
在IOS端,appium同样使⽤WebDriver的一套协议。
与Android端测试框架不同的是,appium ios封装了apple的 Instruments框架,主要用了Instrument里的UI Automation(Apple的⾃自动化测试框架),然后在设备中注⼊入bootstrap.js进⾏行监听。
appium 在ios端工作流
client端 依然是 test script是我们的webdriver测试脚本。
中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
appium server调用instruments.js 启动⼀一个socket server,同时分出一个⼦子进程运⾏instruments.app,将bootstrap.js(一个UIAutomation脚本)注⼊入到device⽤于和外界进行交互
最后Bootstrap.js将执行的结果返回给appium server
appium server再将结果返回给 appium client。
所以我们可以看到android与ios区别在于appium 将请求转发到bootstrap.js或者bootstrap.jar.然后由bootstrap 驱动UIAutomation和UiAutomator去devices上完成具体的动作。
第四讲 环境搭建
- 安装nodejs
- 安装Appium(Appium——Sever)
- 安装Appium–desktop
- 本机安装JDK
- 本机安装Android SDk
- 本机安装Python
- 本机安装PYcharm
- 本机安装Python——appium——client(PYcharm插件安装)
- 根据自己所选的表写脚本代码的不同,选择不同的client
- 本机安装selenium
- 手机已打开开发者模式
第五讲 环境软件说明
- 为什么要安装JDK?安装Android?
Android语言基于Java语言,Android开发人员在安装的时候必须也要安装JDK环境才能编写Android前段代码。
- 为什么安装Python?
自动化脚本使用Python语言编写,故需要代建代码编写环境
- 为什么安装PYcharm?
Python:Python语言的开发集成环境
作用:方便代码的编写、调试、插件的安装
注意:pycharm中安装的插件不与电脑环境系统公用,是单独的一套。
- 为什么安装“Python——appium——client”?
- 为什么要Nodejs?
作用:方便在线安装appium(appium_sever)
- 为什么要安装Appium–sever 或 Appium–desktop?两者有什么区别?
Appium--sever 和Appium--desktop其实是一个东西。运行脚本调试用的。
2015 年底为界限,之前叫Appium-Server(即1/2/3篇中使用的appium) ,之后叫Appium-desktop ,当然, 两个软件是区分开的。Appium-Server当前仍然是可用的。
区别:
1.Appium--sever现在官方已经停止更新了。而Appium--desktop一直在更新。
2.Appium--sever版本已停止更新,“最新”的版本最高支持Android 6.*的系统。7.0以上的有些新的特性不支持。
3.Appium--sever在脚本调试的时候需要配置手机等信息,相比之下Appium--desktop直接可以使用不需要做任何特殊配置。
4.Appium--desktop可以获取手机界面元素,方便获取对应元素标识。前者则不行。
综合建议,使用Appium--desktop便捷。
- 自动化脚本的执行流程?
第六讲 获取前置信息获取
1. 获取设备名称deviceName
win+R——cmd——adb devices
2 获取包名appPackage、获取启动页appActivity
方法一:adb命令
| 具备条件 | 命令 | 操作方法 | 实际结果 |
|---|---|---|---|
| 有apk包文件 | aapt dump badging [yourapp.apk] | 1.apk所在电脑路径下打开dos窗口 2.执行命令aapt dump badging [yourapp.apk]>d:log.txt 直接将信息输出到文件。 3.txt文件里分别定为"package"和"Activity" | [外链图片转存失败(img-6TJG6STX-1567141318919)(EAF596D8A0274E818F59A4BF4E507D7B)][外链图片转存失败(img-r9dQDi4i-1567141318919)(FFD6590A69154E9696DC13FC4F639680)] |
方法二:appium
- 使用方法及步骤:
- 打开软件Appium,不需要启动连接
- 设置链接,选中包之后会默认将报名、启动页
[外链图片转存失败(img-YngLRV08-1567141318919)(CEA572B325504797B5B3478D3ED0692B)]
3. 定位元素工具
工具1:UI Automator Viewer
- 简介:UI Automator Viewer 是SDK自带的一个页面元素定位工具
- 位置: E:\android-sdk_r24.4.1-windows\android-sdk-windows\tools
使用方法及步骤
- 运行UI Automator Viewer
- 手机USB连接至电脑,保持界面常亮
- 点击启动按钮
- 点击对应页面元素
[外链图片转存失败(img-uBtfWWj2-1567141318920)(B61415B52084417A899993233E970B14)]
[外链图片转存失败(img-jxpW9oZ1-1567141318921)(DD6CBE0F58E247CC867A309768D4AA6E)]
[外链图片转存失败(img-NmQy1Czk-1567141318921)(1C10D5682BC046098D7268FED68FE2B0)]
工具2:Appium-Sever
- 简介:
- 使用方法及步骤:
打开软件Appium,不需要启动连接
设置链接
[外链图片转存失败(img-INHlUsL9-1567141318921)(CEA572B325504797B5B3478D3ED0692B)]确保手机链接到电脑,手机上保证没有安装这个软件。
启动appium的连接,左上角三角形的按钮,等待即可,会将APP自动装至app,并会运行app
待APP启动后,点击appium GUI界面上搜索图形按钮
APP进入一个页面,点击“refresh”(刷新),会将所有按钮的元素都显示出来。按个去找即可。
- 缺点:
- 每次启动一次连接,手机上都会重新安装一次应用
- 界面上的元素不能直接定位
- 运行过程中会无故报如下错误
[外链图片转存失败(img-IETKOQcr-1567141318921)(25E986F73629412D914A90E3370A1A1E)]
第二章 app元素的定位及操作
第一讲 元素定位方法
https://www.cnblogs.com/tuxiaomeng/p/10442514.html
appium共11中定位方式,在selenium的基础上加了三种。在pycharm中输入driver.find_element_by后会自动匹配出来
附加的三种:
- driver.find_element_by_accessibility_id()
- driver.find_element_by_android_uiautomator()
- driver.find_element_by_ios_uiautomator()# 先不管,iOS用的
1. ID定位
[外链图片转存失败(img-tm0wco5r-1567141318921)(58BB99D9504F4BB1A1B60BD8FF9CBB23)]
- 句式:driver.find_element_by_id(‘resource-id’)
2. class定位
[外链图片转存失败(img-KwdVPiBn-1567141318921)(EF6B44C993FE4A3587F78DD624D3C778)]
- 句式:driver.find_element_by_class_name(‘class’)
3. XPATH定位(重点、重点、重点)
使用appium亲测可用(绝对路径)
https://blog.csdn.net/xxlovesht/article/details/82791370
- Android:Android的Xpath定位与PC的XPATH定位大同小异,web项目使用Xpanth定位的时候可以选择“相对路径”或“绝对路径”,但是在APP中只能使用相对路径来定位,通过class和*属性来确定元素唯一性。亲测在使用绝对路径是定位不到的。
- iOS:iOS10 以上使用XCUITest框架后,原生框架不支持XPATH,Appium进行了转换,速度很慢不建议使用。
3.1 Class + Text(name)定位
[外链图片转存失败(img-3E0sDLcp-1567141318921)(C39D49EC8D3149D98D4B7A1C4AD135C8)]
例子:driver.find_element_by_xpath(u’//android.widget.TextView[contains(@text,“转入记录”)]’)
句式:driver.find_element_by_xpath(u’//Class值[contains(@text,“text值”)]’)
3.2 Class + Content(Content-desc)定位
[外链图片转存失败(img-6130fFK4-1567141318921)(D133BD27A44C4B5E89772640E24361C3)]
例子:driver.find_element_by_xpath(u’//android.widget.ImageButton[@content-desc=“转到上一层级”]’)
句式:driver.find_element_by_xpath(u’//Class值[@content-desc=“content-desc的值”]’)
3.3 父节点Class + 该节点Class定位
[外链图片转存失败(img-V5FsXWtD-1567141318922)(64107040DB3A428C8EC8D4134E5FF71B)]
例子:driver.find_element_by_xpath(’//android.support.v7.widget.RecyclerView/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.TextView[2]’)
句式:driver.find_element_by_xpath(’//父节点1Class值/父节点2Class值/该节点Class值’)
注意:如果定位不到,往上多写几层父节点就可以
4. AccessibilityId定位
- Android:Android的content-desc属性对应AccessibilityId定位方式,这个content-desc属性专门为残障人士设置,如果这个属性不为空则推荐使用。
- iOS:iOS的label和name属性都对应AccessibilityId定位方式,如果有则推荐使用。
[外链图片转存失败(img-hGdMyhyg-1567141318922)(C0B560938D3E4162AF4B32B9FB038D3B)]
- 句式: driver.find_element_by_accessibility_id(“accessibility_id”)
5.Name定位(不建议使用)
[外链图片转存失败(img-M2cHFbSz-1567141318922)(2826BC8554B9478F863E0BE4192B356F)]
appium1.5之前版本(不包括1.5版本),name定位。
- 句式:driver.find_element_by_name(“text(\中文\)”)
appium1.5及之后的版本废弃了name属性,如需要用name定位,则需要使用uiautomator的定位方式,使用text的内容)
- 句式:driver.find_element_by_android_uiautomator(“text(\中文\)”)
6. 坐标定位
[外链图片转存失败(img-uby9L34G-1567141318922)(A2F9710932554DD79A04064219FE3DD8)]
- 句式:driver.swipe(相对坐标X,相对坐标X,X,Y,1)
from appium import webdriver
# 注意是from appium import webdriver而不是from selenium import webdriver。后者没有Tap()函数
X=driver.get_window_size()['width']# 获取屏幕最大宽度
Y=driver.get_window_size()['height']# 获取屏幕最大高度
# 点击位置[610,500]
x=610/X #确定目标位置相对坐标
y=500/Y
driver.tap([(x*X,y*Y)],)# 调用点击函数"".tap"
- 缺点:
- 自动化设备更换的时候需要进行重新定位,根据设备的分辨率不一样的时候需要重新获取对应坐标。
- 可移植性弱,不到万不得已不要用此种定位方式
7.
第二讲 元素操作
找到元素后可以对元素进行的操作,例如上面讲的进一步定位元素
| 操作 | 对应方法 | 实例 |
|---|---|---|
| 点击操作 | .click() | driver.find_element_by_id(“com.wuba.zhuanzhuan:id/ae8”).click() |
| 清空输入框内容 | clear() | driver.find_element_by_id(“com.wuba.zhuanzhuan:id/ij”).clear() |
| 输入框内输入内容 | .send_keys(xx) | driver.find_element_by_id(“com.wuba.zhuanzhuan:id/ij”).send_keys(“test content”) |
| 获得元素的text内容 | .text | print(driver.find_element_by_xpath(“xxx”).text) |
| 锁定屏幕 | driver.lock(5) | |
| 把当前应用放到后台去 | driver.background_app(5) | |
| 长按住键盘 | driver.long_press_keycode(keycode) | |
| 检查应用是否已经安装 | driver.is_app_installed(‘packagename‘) |
6.安装应用到设备中去 driver.install_app(‘path/to/my.apk‘)
7.从设备中删除一个应用 driver.remove_app(‘com.example.android.apis‘)
8.模拟设备摇晃 driver.shake()
9.关闭应用 driver.close_app()
10.启动应用 driver.launch_app()
11.应用重置 driver.reset()
12.列出所有的可用上下文 driver.contexts
13.列出当前上下文 driver.current_context
14.将上下文切换到默认上下文 driver.switch_to.context(None)
15.截图 driver.get_screenshot_as_file(filename)
16.发送一个按键事件给设备 driver.keyevent(176)
17.Android only 得到当前 activity driver.current_activity
19.模拟用户滑动 driver.swipe(75, 500, 75, 0, 1000)
20.在 0% 到 100% 内双指缩放屏幕 driver.pinch(element=el)
21.放大屏幕 在 100% 以上放大屏幕 driver.zoom(element=el)
22.从设备中拉出文件 driver.pull_file(‘Library/AddressBook/AddressBook.sqlitedb‘)
23.推送文件到设备中去data = “some data for the file”
path = “/data/local/tmp/file.txt”
driver.push_file(path, data.encode(‘base64‘))
24.隐藏键盘 driver.hide_keyboard()
25.安装 appdriver.install_app(path)
26.卸载 appdriver.remove_app(app_id)
27.打印当前 activitydriver.current_activity
28.振动 driver.shake()
29.打开通知栏(api 18 以上)driver.open_notifications()
30.获取网络 driver.network_connection
31.获取手机屏幕分辨率 driver.get_window_size()
32.设置屏幕分辨率 driver.set_window_size(width,height)
33.获取当前坐标位置 driver.get_window_position()
34.开关定位服务 driver.toggle_location_services()
35.开关定位服务 driver.toggle_location_services()
36. 关闭 close
37.退出关闭所有连接 quit
- 获取当前页面源 page_source
39.获取当前页面网页 current_url
4.获取元素左上角坐标 location
41 获取元素大小 size - 元素是否可用 is_enabled()返回 True of False
43.元素是否可选择 is_selected()
44.清除 clear
45.点击 click
46.设置经纬度 用法 driver.set_location(纬度,经度,高度)
47.返回当前输入法包名 active_ime_engine
48.关闭当前输入法 deactivate_ime_engine
49.激活输入法 activate_ime_engine
用法
driver.activate_ime_engine(“com.android.inputmethod.latin/
.LatinIME”)
- s_ime_active
检查设备是否有输入法服务活动。返回真/假。 安卓 用法
print(driver.is_ime_active())
第三章 Unittest单元测试框架
第一讲 概念
1.什么是单元测试?
指对软件中的最小可测试单元进行检查和验证。
2.Unittest是什么?
Unittest是Python语言中实现单元测试的框架,同Java语言的junit相同。
第二讲 使用
1. Unittest介绍
主要使用的函数:
- def setUp(self): 每次执行一个用例(TestCase)之前必须执行的函数,一般做变量初始化使用。
- def test_name(self):测试用例(TestCase)
- def tearDown(self):执行用例后的善后工作
- unittest. main():主函数,,执行所有方法名称为“test_”开头的测试用例
2. Unittest框架使用格式
- 必须import语句引入unittest模块
- 测试的类都继承于TestCase类
- setUp()测试前的初始化工作; tearDown()测试后的清除工作(在每个测试方法运行时被调用)
- 所有类中方法的入参为self,定义方法的变量也要"self.变量
- 定义测试用例,以"test"开头命名的方法,方法的入参为self
- unittest. main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们
- 自己写的py文件不能,用unittest.py命名,不然会找不到TestCase
- main函数放在文档最前和末尾都可以,当放在最前时候,需要Tab缩进,末尾时,和类对其即可。
- 实例
案例一
Python是采用Unicode编码,不需要生命编码,为防止注释的汉字发生乱码,故此声明文档编码格式
import unittest
class Dome(unittest.TestCase):
if __name__ == '__main__':
unittest.main()
def setUp(self):
print('初始化值')
def test_name(self):
print('运行TsetCase')
def tearDown(self):
print('收尾工作')
def test_name1(self):
print('运行TsetCase2')
案例二
import unittest
class Dome(unittest.TestCase):
def setUp(self):
print('初始化值')
def test_name(self):
print('运行TsetCase')
def tearDown(self):
print('收尾工作')
def test_name1(self):
print('运行TsetCase2')
if __name__ == '__main__':
unittest.main()
执行结果
[外链图片转存失败(img-0qdH5oII-1567141318923)(CD60AAB829C74DFEBBBFE351ABA2EF96)]
第三讲 Unittest断言
- 实例
- 断言使用句式:
self.verifyString=‘aaa’
self.assertEqual(‘test’,self.verifyString,msg=‘两个值不相等’) #msg 定义出错信息 - 解释:字符串“test”和字符串self.verifyString的值得值比较是否相等。
- 相等概念:联系面向对象、Java值传递、计算机存储数据方式进行理解。
| 序号 | 方法 | 解释 | 例子 |
|---|---|---|---|
| 1 | assertEqual(a, b) | 判断ab是否相等 | |
| 2 | assertNotEqual(a, b) | 判断ab不相等 | |
| 3 | assertIs(a, b) | 判断a是b | |
| 4 | assertIsNot(a, b) | 判断a不是b | |
| 5 | assertIsNone(a) | 判断a是不是None | |
| 6 | assertIsNotNone(a) | 判断a不是None | |
| 7 | assertIn(a,b) | 判断a在b中,此时a与b可以相等 | |
| 8 | assertNotIn(a, b) | 判断a不在b中 | |
| 9 | assertIsInstance(a, b) | 判断a是否属于b的实例 | |
| 10 | assertNotIsInstance(a, b) | 判断a不属于b的实例 | |
| 11 | assertGreater(a, b) | 判断a > b | |
| 12 | assertGreaterEqual(a, b) | 判断a >= b | |
| 13 | assertLess(a, b) | 判断a < b | |
| 14 | assertLessEqual(a, b) | 判断a <= b |
第四讲 Testuite套件使用
第五讲 Unittest生成测试报告
第六讲 代码模块化
实例说明
- 文件“Test2”调用“Test1”中的方法
- 文件名1:“Test1”
import unittest # 导入unittest模块
class dome2(unittest.TestCase): # 测试类都必须继承TestCase类
def setUp(self): # 前置函数
pass # 占位语句
def taet_name(self): # 测试用例
print("这是引用方法dome2.dome")# 打印输出
def tearDown(self): # 后置函数
pass
def taet_name2(self):
print("这是引用方法dome2.dome1")
def taet_name3(self):
print("这是引用方name2")
- 文件2:“Test2”
import unittest
import test1 # 引入test1.py文件
class dome1(unittest.TestCase):
?cds;fckpasfj;ljeds ljl
if __name__ == '__main__':
ab=unittest.TestSuite() # Test2文件中写方法在调用Test1中方法的语句格式
ab.addTest(a.taet_name3(self)) # Test2文件中写方法在调用Test1中方法的语句格式
a=test2.dome2.taet_name3(self) ### Test2文件中main函数直接调用文件Test1中的方法语句格式
ab.addTest(test2("test_name")) ### Test2文件中main函数直接调用文件Test1中的方法语句格式
总结及步骤:
- 引用和被应用函数都需要导入Unittest模块
- 引用文件必须引入被引用文件“import test1”,若引用文件与被引入文件不再同一文件目录下,则引入时需要声明文件路径
- 调用另一文件方法时,必须创建另文件类的对象。
- 格式:文件名.类名
- 注意:Python与Java不同,一个py文件可以存在多个主类,而一个Java文件只能存在一个主类。
第四章 app自动化实战
第一步 获取设备及包的信息
from appium import webdriver#导入appium包 #连接手机app初始化的一些信息
desc={}
desc['deviceName']='127.0.0.1:62001'#手机设备名称,adb devices
desc['platformVersion']='4.4.2'#手机版本,在手机中:设置--关于手机
desc['platformName']='Android' #手机类型,ios或android
#输入命令,获取app信息:aapt dump badging C:\Users\83473\Desktop\mobileqq_android.apk
desc['appPackage']='com.tencent.mobileqq'#包名
desc['appActivity']='com.tencent.mobileqq.activity.SplashActivity'#启动入口
desc["unicodeKeyboard"] = "True"#appium提供的一种输入法,可以传中文。测试时直接用这个输入法
desc["resetKeyboard"] = "True"#程序结束时重置原来的输入法
desc["noReset"] = "True"#不初始化手机app信息(类似不清楚缓存)
#启动服务端,再cmd窗口输入appium.如果appium没有安装好,可以打开appium-desktop.也相当于启动了服务
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc)
#访问服务接口,并启动手机app。url参数是当appium启动后,默认访问服务地址和接口
#固定句式不变,端口、主机地址发生变化的时候需要
重要
https://www.cnblogs.com/shuchengxiang/p/7145037.html
[外链图片转存失败(img-TDquWXb8-1567141318923)(0C127E409F274F158365EE02F37E8EC6)]
[外链图片转存失败(img-jjV6M4bv-1567141318923)(776ACD49EC8443A19673C7231F2D4B0A)]
[外链图片转存失败(img-PGkAg7iS-1567141318923)(A26E5EC6E2D64809B2848437CFB36D3F)]
滑块
如何打开定位的
坐标定位
U2方法大全
https://blog.csdn.net/xuxunxiong954/article/details/79436599
http://www.mamicode.com/info-detail-2390132.html
https://blog.csdn.net/jffhy2017/article/details/84936164
滑块函数
https://www.cnblogs.com/dsy-sun/p/6595164.html
Selenium 之 WebDriverWait
https://blog.csdn.net/duzilonglove/article/details/78455051
https://www.jianshu.com/p/209d46ce0904
U2基础知识
https://blog.csdn.net/qq_42293487/article/details/88887194
https://blog.csdn.net/ricky_yangrui/article/details/81415365
https://www.cnblogs.com/mashuqi/p/10406408.html
https://blog.csdn.net/panda62/article/details/80017021
https://blog.csdn.net/lsp84ch80/article/details/82776045
https://blog.csdn.net/sdfsdfdfa/article/details/79120665
https://www.cnblogs.com/desperado0807/p/5684472.html
识别图片中指定区域的文字
https://blog.csdn.net/qq_41616397/article/details/87980510
https://blog.csdn.net/dream_18/article/details/85137580
思路(获取tocat的值)
1.点击后截屏,
2.截屏后识别指定区域的文字,需要指定
Python+Opencv识别两张相似图片
https://blog.csdn.net/mangobar/article/details/85226531
https://segmentfault.com/a/1190000004500523?_ea=630748