当前位置:   article > 正文

appium使用 自动化测试_appium自动化测试

appium自动化测试

1. 环境搭建:

1.  安装node.js    v12.13.0.
cnpm淘宝镜像配置 :npm install -g cnpm --registry=https://registry.npm.taobao.org
appium,基于node.js实现,用于测试android、ios、混合应用、移动网页应用
 cnpm install -g appium@1.7.2 : 安装appium
 
 where appium:  appium  安装路径 
 appium :  查看版本号     Appium v1.17.0

 
 2. appium客户端
 Appium-windows-1.15.1.exe:  widnows客户端 [ 封装了node.js 和 appium, 不用装node.js appium ] 

 python 环境 安装
 
 D:\software\ruanjinag\Python37\Scripts:  如果安装了配置环境变量即可,pip路径
 pip install Appium-Python-Client:  使用pip安装python-appium模块

 安装路径:D:\software\ruanjinag\Python37\Lib\site-packages\appium
 是否安装成功:
 1. >>> from appium import webdriver
 2.   pip list:  Appium-Python-Client 0.52 查看是否有  

 注意:如果有2套python环境, 使用Python3,那么命令, python3、pip3
 
 
 3.jdk 安装:
 JAVA_HOME  C:\Program Files\Java\jdk1.8.0_111
 CLASSPATH   .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)
 Path       %JAVA_HOME%\bin
 
 
 4.ANDROID_HOME:D:\softpackage\Java\android-sdk-windows6
 path:   %ANDROID_HOME%\platform-tools;
         %ANDROID_HOME%\tools;


看环境是否安装好:
 cnpm install appium-doctor -g
 appium-doctor


原理:
  Appium-Python-Client  ->   Appium-windows-1.15.1.exe启动 appium Server -> 移动设备(Android|IOS) 


===================================Mac环境下配置====================================
 Mac下环境配置:
sdk:  /Users/denganzhi/Library/Android/sdk


cd  ~
touch .bash_profile
open .bash_profile

export ANDROID_HOME=/Users/denganzhi/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

source .bash_profile

echo $PATH

=========================================================================

2. adb 命令使用

0.adb  原理 : 
   widnows    adb 客户端  --->  adb 服务器 
                                  ↓
   手机:                       adb daemon【守护进程】
     
 
 1. 获取当前应用程序 包名|启动Activity 
Mac/Linux:    
adb shell dumpsys window windows | grep mFocusedApp

Windows:
adb shell dumpsys window windows | findstr mFocusedApp


# 获取当前正在运行APP的 包名/运行Activity名  

mFocusedApp=AppWindowToken{feb4edd token=Token{967a2b4 ActivityRecord{ca1387 u0 com.android.dialer/.BBKTwelveKeyDialer t55}}}


2.  上传文件到手机   
adb push python.txt  /sdcard:  push widnows python.txt到 手机sd卡下 
 
3. 获取App 启动时间
  启动原理App: 
     系统分配内存、 启动Application、 启动Activity 
     
 adb shell am start -W com.android.dialer/.BBKTwelveKeyDialer
ThisTime: 169:   BBKTwelveKeyDialer Activity运行时间 
TotalTime: 169   Application运行时间+  Activity运行时间 
WaitTime: 185    系统分配内存时间+ Application运行时间 + Activity运行时间
 
4.  adb logcat 

 adb logcat *:e  :显示error级别日志 
 adb logcat *:e > cat.log

https://www.cnblogs.com/bydzhangxiaowei/p/8168598.html : adb 日志 过滤 


 adb install xx.apk
 adb uninstall 包名
 adb devices:   但是adb 连接设备列表
 adb kill-server: 停止adb 
 adb start-server:  启动adb 服务端
 adb --help: 查看帮助

3.  appium使用

 1. 启动app 
 2. 启动其他app
 3. 关闭app
 4. 安装   卸载app
 5. 应用进入到后台 5s, 在回到前台

启动Android  设置界面: 

  1. import time
  2. from appium import webdriver # 导入Appium-Python-Client 框架库
  3. #### 1. 启动应用 -- appium 的 helloworld
  4. desired_caps = dict()
  5. desired_caps['platformName']='Android' # 系统
  6. desired_caps['platformVersion']='6.0.0' # 手机号
  7. desired_caps['deviceName']='127.0.0.1:5555'
  8. desired_caps['appPackage']='com.android.settings' # 启动应用包名
  9. desired_caps['appActivity']='.Settings' # 指定activity
  10. driver= webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
  11. #客户端连接appium服务器
  12. time.sleep(5) # 等待 3S
  13. # 2. 从一个应用 跳转到 另外一个应用
  14. #driver.start_activity("com.soaic.basecomponent",".activity.ServiceDemoActivity")
  15. # 3. 关闭app, 获取当前应用包名|activity名
  16. #driver.close_app()
  17. # 输出当前应用的包名和界面名
  18. print(driver.current_package)
  19. print(driver.current_activity)
  20. # 4. 安装 卸载app
  21. # if driver.is_app_installed("com.kaidishi.lock"):
  22. # driver.remove_app("com.kaidishi.lock")
  23. # else:
  24. # driver.install_app("E:/app.apk")
  25. # 5. 应用进入到后台 5s, 在回到前台
  26. driver.background_app(5)
  27. driver.quit() # driver 直接退出,运行终止,driver就是一个管家,手指

 6. 元素定位
 UIAutomatorViewer:   一款可视化手机界面工具
 android-sdk-windows6\tools\bin\uiautomatorviewer.bat

 元素定位:  通过id、 class 、 xpath

 6.1.  根据上面三个特征,定位到一个元素
 6.2.  定位到一组元素

 7.   元素等待
网络没有返回html标签,控件还没有被渲染,那么使用元素等待
不在这个页面
分类: 
 隐士等待:
 显示等待:
 8. 元素操作api 
 8.1. 点击元素  element.click()
 8.2. EditText文本框, 输入和清空内容
 8.3.  获取文本内容 .text、位置、大小
 8.4.  根据属性名获取属性值

9. 滑动和拖拽事件
9.1. 使用swiper 滑动屏幕
9.2 scroll滑动事件, 参数,元素,从一个元素滑动到另外一个元素 有惯性
9.3 drag_drop, 拖拽替换,第二个元素替换第一个元素,没有惯性

10. 高级手势TouchAction
10.1 手指轻敲( 就是按下、抬起组合),和点击差不多
10.2  按下和抬起
10.3 等待:  按下 等待 抬起,  模拟长按下,长按是不用抬起触发
10.4  长按2s ,等价于 TouchAction(driver).press(save_btn).wait(2000).release().perform()
10.5 移动操作, 案例解锁手机图案

11. 手机操作API
11.1 获取手机的宽度、高度

12.1 获取手机截图,  参数 写路径

13.1 获取设置手机网络

14. 发送键到设备

15. 操作手机通知栏

  1. import time
  2. from appium import webdriver
  3. #### 启动应用
  4. from appium.webdriver.common.touch_action import TouchAction
  5. from selenium.webdriver.support.wait import WebDriverWait
  6. desired_caps = dict()
  7. desired_caps['platformName']='Android'
  8. desired_caps['platformVersion']='6.0.0'
  9. desired_caps['deviceName']='127.0.0.1:5555'
  10. desired_caps['appPackage']='com.android.settings'
  11. desired_caps['appActivity']='.Settings'
  12. driver= webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps)
  13. # 6. 元素定位
  14. # 原理: 通过 UIAutomatorViewer 可以把所有的元素都遍历一遍
  15. # 如何定位一个元素,模拟按钮点击search按钮
  16. # 通过元素id, 通过 UIAutomatorViewer 找到 Resource Id
  17. # 如果id 不唯一,有多个多个控件,返回的是第一个控件,那么通过xpath表达式不同点来定位
  18. search_btn=driver.find_element_by_id("com.android.settings:id/search")
  19. # 点击搜索
  20. search_btn.click()
  21. # 定位输入框,通过全类名,并且输入hello
  22. # 如果有2个,找到的是第一个
  23. driver.find_element_by_class_name("android.widget.EditText").send_keys("hello")
  24. # 使用xpath定位返回按钮,通过context-des属性,xpath可以通过任意属性,点击返回按钮
  25. driver.find_element_by_xpath("//*[@content-desc='搜索设置']").click()
  26. # 如何定位一组元素,返回的是一个数组
  27. # id可以重复,通过 UIAutomatorViewer使用
  28. titles=driver.find_elements_by_id("com.android.settings:id/title")
  29. print(len(titles))
  30. for title in titles:
  31. print(title.text)
  32. # 通过全类名获取所有元素
  33. textviews= driver.find_elements_by_class_name("android.widget.TextView")
  34. print(len(textviews))
  35. for textview in textviews:
  36. print(textview.text)
  37. # 包含内容 text '设'
  38. xpaths= driver.find_elements_by_xpath("//*[contains(@text,'设')]")
  39. for xpath in xpaths:
  40. print(xpath.text)
  41. #注意:
  42. # find_element_by_id 如果id 不存在,报错 NoSuchElementException
  43. # find_elements_by_id 如果I不存在,那么返回[]
  44. # 7.1 隐式等待,针对所有元素 定位
  45. # app 测试案例,现在在A 页面, 元素在B 页面,
  46. # 设置隐式等待10s,那么 在10 s 跳入B 页面,找到了了元素,显示
  47. # 如果超过10S, 还没有找到 元素,报错 NoSuchElementException
  48. driver.implicitly_wait(10)
  49. xpath1= driver.find_element_by_xpath("//*[contains(@text,'设')]")
  50. # 有效果
  51. xpath2= driver.find_element_by_xpath("//*[contains(@text,'设')]")
  52. # 7.2. 显示等待 ,不会阻塞代码
  53. # 针对单个元素,在 25s , 每隔5s 调用一次 x.find_element_by_xpath,如果不写5,默认是0.5s
  54. # 找到了,返回元素,没有找到继续找
  55. wait = WebDriverWait(driver,25,5)
  56. back_button=wait.until(lambda x: x.find_element_by_xpath("//*[contains(@text,'设')]"))
  57. print(back_button.text)
  58. # 报错,上面只是针对当个元素
  59. xpath3 = driver.find_element_by_xpath("//*[contains(@text,'设')]")
  60. # 8. 元素 操作Api
  61. # 8.1. 点击元素 element.click()
  62. # 8.2. EditText文本框, 输入和清空内容
  63. # send_keys("hello") 输入内容
  64. # clear 清空内容
  65. # 默认输入中文无效,设置如下
  66. desired_caps['unicodeKeyboard']=True
  67. desired_caps['resetKeyboard']=True
  68. # 8.3. 获取文本内容 .text
  69. # 获取元素 位置和 大小
  70. # element.location, {x,y} 坐标
  71. # element.size {height,width} 宽度、高度
  72. # 8.4 根据属性名获取属性值
  73. # 获取文本内容
  74. search_btn.text();
  75. # 获取属性值
  76. search_btn.get_attribute("enabled") # 控件是否可用
  77. search_btn.get_attribute("text")
  78. # 特殊
  79. search_btn.get_attribute("resourceId") #必须把resource_Id中间_去掉
  80. search_btn.get_attribute("ClassName") # 必须把class 改成 ClassName
  81. search_btn.get_attribute("name") #获取content-desct通过name
  82. # 9. 滑动和拖拽事件
  83. # 9.1. 使用swiper 滑动屏幕
  84. # driver.swiper(起始x坐标,起始y坐标,结束的x坐标,结束y坐标,持续时间ms)
  85. # 从下往上滑动
  86. driver.swipe(100,600,100,100)
  87. # 持续时间是 5s
  88. driver.swipe(100,600,100,100,5000)
  89. # 滑动特点:
  90. # 特点:参数坐标点,
  91. # 持续时间短, 惯性大
  92. # 持续时间长 惯性小
  93. # 滑动为什么有误差
  94. # 计时器会计算时间在5S内,每隔开1S,都会去判断当前坐标,可能在这是cpu跑去干别的,造成误差
  95. # 9.2 scroll滑动事件, 参数,元素,从一个元素滑动到另外一个元素 有惯性
  96. # 开始位置 在下方向
  97. # 应用在 更多的 下方
  98. btn1=driver.find_element_by_xpath("//*[@text='应用']")
  99. btn2= driver.find_element_by_xpath("//*[@text='更多']")
  100. driver.scroll(btn1,btn2)
  101. # 9.3 drag_drop, 拖拽替换,应用在下方,用应用替换更多
  102. driver.drag_and_drop(btn1,btn2)
  103. # 9.1 9.2 9.3实际工作中不需要惯性,用的是9.3
  104. # 10. 高级手势TouchAction
  105. # 轻敲、按下抬起、等待、长按、移动
  106. # 10.1 手指轻敲( 就是按下、抬起组合),和点击差不多
  107. # 使用步骤 1,2,3
  108. # 创建TouchActio对象 调用想要执行动作 通过perform执行
  109. # ** 参数可以传递对象, 点击 5次
  110. TouchAction(driver).tap(save_btn,5).perform()
  111. # ** 参数可以传递坐标
  112. TouchAction(driver).tap(x=650,y=650).perform()
  113. # 10.2 按下和抬起
  114. # 点击事件: 按下、抬起, 如果只有按下,不能模拟点击时间
  115. TouchAction(driver).press(save_btn).perform()
  116. time.sleep(2)
  117. TouchAction(driver).press(save_btn).release().perform()
  118. # 10.3 等待: 按下 等待 抬起, 模拟长按下,长按是不用抬起触发
  119. # TouchAction(driver).tap(save_btn).perform()
  120. # time.sleep(3)
  121. # TouchAction(driver).press(save_btn).wait(2000).release().perform()
  122. # 10.4 长按2s ,等价于 TouchAction(driver).press(save_btn).wait(2000).release().perform()
  123. # TouchAction(driver).long_press(save_btn,2000).perform()
  124. # 10.5 移动操作, 案例解锁手机图案
  125. # 进入设置中解锁页面
  126. desired_caps['appPackage']='com.android.settings'
  127. desired_caps['appActivity']='.ChooseLockPattern'
  128. # move_to 方法,如何确定坐标,把鼠标放到手势的点上,会有提示
  129. TouchAction(driver).press(x=79,y=290).move_to(x=239,y=452).move_to(x=239,y=290).move_to(x=400,y=290).release().perform()
  130. # 11. 手机操作API
  131. # 11.1 获取手机的宽度、高度
  132. # driver.get_window_size()
  133. # 12.1 获取手机截图, 参数 写路径
  134. #driver.get_screenshot_as_file("screen.png")
  135. # 13.1 获取设置手机网络
  136. # Possible values:
  137. # Value (Alias) | Data | Wifi | Airplane Mode
  138. # -------------------------------------------------
  139. # 0 (None) | 0 | 0 | 0
  140. # 1 (Airplane Mode) | 0 | 0 | 1
  141. # 2 (Wifi only) | 0 | 1 | 0
  142. # 4 (Data only) | 1 | 0 | 0
  143. # 6 (All network on) | 1 | 1 | 0 数据和wifi都打开
  144. #print(driver.network_connection)
  145. # 设置手机网络
  146. #driver.set_network_connection(0) # 关闭数据、wifi
  147. # 14. 发送键到设备
  148. # android 按键列表:https://www.cnblogs.com/bluestorm/p/4886662.html
  149. # 发送键都设备
  150. # 三次 音量+ ,返回 + 2次音量 减
  151. # driver.press_keycode(24)
  152. # driver.press_keycode(24) # 音量+
  153. # driver.press_keycode(4) # 返回键
  154. # driver.press_keycode(25) # 音量-
  155. # 15. 操作手机通知栏
  156. # 拉下通知栏
  157. # driver.open_notifications()
  158. # 关闭通知栏,点击返回键
  159. # driver.press_keycode(4)
  160. time.sleep(50)
  161. driver.quit()

获取手势坐标点,把鼠标放在手势点上,右上角显示坐标:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/619899
推荐阅读
相关标签
  

闽ICP备14008679号