https://www.cnblogs.com/chaoyangya/p/9774614.html
解决办法:
解决办法:
https://www.cnblogs.com/linyfeng/p/7123423.html
check=driver.find_element_by_id("****")
def Check_element(self,check)
try:
check
except:
print('获取元素失败')
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",# 运行完成的时候回复默认之前输入法
}
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实现了真正的跨平台自动化测试。
“移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。
“移动web应用”是指使用移动浏览器访问的应用(appium支持iOS上的Safari和Android上的 Chrome)。
“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 Phonegap,可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。
在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。
在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上完成具体的动作。
Android语言基于Java语言,Android开发人员在安装的时候必须也要安装JDK环境才能编写Android前段代码。
自动化脚本使用Python语言编写,故需要代建代码编写环境
Python:Python语言的开发集成环境
作用:方便代码的编写、调试、插件的安装
注意:pycharm中安装的插件不与电脑环境系统公用,是单独的一套。
作用:方便在线安装appium(appium_sever)
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便捷。
win+R——cmd——adb devices
具备条件 | 命令 | 操作方法 | 实际结果 |
---|---|---|---|
有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)] |
[外链图片转存失败(img-uBtfWWj2-1567141318920)(B61415B52084417A899993233E970B14)]
[外链图片转存失败(img-jxpW9oZ1-1567141318921)(DD6CBE0F58E247CC867A309768D4AA6E)]
[外链图片转存失败(img-NmQy1Czk-1567141318921)(1C10D5682BC046098D7268FED68FE2B0)]
打开软件Appium,不需要启动连接
设置链接
[外链图片转存失败(img-INHlUsL9-1567141318921)(CEA572B325504797B5B3478D3ED0692B)]
确保手机链接到电脑,手机上保证没有安装这个软件。
启动appium的连接,左上角三角形的按钮,等待即可,会将APP自动装至app,并会运行app
待APP启动后,点击appium GUI界面上搜索图形按钮
APP进入一个页面,点击“refresh”(刷新),会将所有按钮的元素都显示出来。按个去找即可。
https://www.cnblogs.com/tuxiaomeng/p/10442514.html
appium共11中定位方式,在selenium的基础上加了三种。在pycharm中输入driver.find_element_by后会自动匹配出来
附加的三种:
[外链图片转存失败(img-tm0wco5r-1567141318921)(58BB99D9504F4BB1A1B60BD8FF9CBB23)]
[外链图片转存失败(img-KwdVPiBn-1567141318921)(EF6B44C993FE4A3587F78DD624D3C778)]
使用appium亲测可用(绝对路径)
https://blog.csdn.net/xxlovesht/article/details/82791370
[外链图片转存失败(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值”)]’)
[外链图片转存失败(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的值”]’)
[外链图片转存失败(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值’)
注意:如果定位不到,往上多写几层父节点就可以
[外链图片转存失败(img-hGdMyhyg-1567141318922)(C0B560938D3E4162AF4B32B9FB038D3B)]
[外链图片转存失败(img-M2cHFbSz-1567141318922)(2826BC8554B9478F863E0BE4192B356F)]
appium1.5之前版本(不包括1.5版本),name定位。
appium1.5及之后的版本废弃了name属性,如需要用name定位,则需要使用uiautomator的定位方式,使用text的内容)
[外链图片转存失败(img-uby9L34G-1567141318922)(A2F9710932554DD79A04064219FE3DD8)]
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"
找到元素后可以对元素进行的操作,例如上面讲的进一步定位元素
操作 | 对应方法 | 实例 |
---|---|---|
点击操作 | .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
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”)
检查设备是否有输入法服务活动。返回真/假。 安卓 用法
print(driver.is_ime_active())
1.什么是单元测试?
指对软件中的最小可测试单元进行检查和验证。
2.Unittest是什么?
Unittest是Python语言中实现单元测试的框架,同Java语言的junit相同。
主要使用的函数:
案例一
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)]
序号 | 方法 | 解释 | 例子 |
---|---|---|---|
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 |
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")
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中的方法语句格式
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