Appium 测试APK

发表于:2018-10-31 10:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:珍真小心    来源:51testing采编

  介绍
  Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持iOS、Android及FirefoxOS平台测试。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。
  特点:
  跨架构
  跨设备
  跨语言
  跨app
  不依赖源代码
  不限制测试框架和平台
  Appium的加载流程
  调用android adb完成基本的系统操作
  向android上部署bootstrap.jar包并启动
  Forward android的端口到pc机器上
  Pc上监听端口接受请求,使用webdriver协议
  分析命令并转通过forward的端口发给 bootstrap.jar
  Bootstrap.jar接受请求并把命令发给 uiautomator或者插桩体系
  如:执行send_keys命令,发送到remote webdriver /wd/hub/session/xxx/keys,然后pc处理请求并转发给android和iphone,接着Bootstrap.jar调用uiautomator,Uiautomator调用settext方法
  实际应用(以Android平台为例)
  1、安装jdk
  我装的jdk1.8.0_20
   
  2、安装Android studio,使用其中的sdk
   
   
  3、sdk环境配置
  1)在环境变量的系统变量中新建变量ANDROID_HOME,变量值就是adk对应的路径
   
  2)点击编辑系统变量path,添加sdk的tools和platform-tools
   
  3)点击确定,在cmd下运行adb devices
   
  出现下面的就是正确了
  如果只显示了list of devices attached 则需先在命令行输入adb connect 127.0.0.1:62001(为了连接到夜神模拟器),再输入adb devices即可
  4、安装模拟器(模仿Android的环境)
  可以使用Android自带的模拟器,这里我使用的是夜神模拟器(相对较为流畅)
   
  5、启动模拟器,出现桌面
   
  6、安装Python
  7、安装appium
  8、安装Appium-client
  注意:ip命令需要到python的scripts目录下用(因为pip.exe在那)
  cmd下跳转到Python的script目录下,输入pip install appium-client,则自动安装
  9、双击打开ANDROID_HOME/tools下的uiautomatorviewer.bat
  出现以下界面
   
  点击左上角第二个按钮,就可以显示模拟器中的界面
   
  如果报错,一般是因为abd的问题,则再重复3、3)步骤则可以解决
  这个应用是可以对apk中的元素进行定位,方便写Python脚本
  Uiautomator具体的使用方法:
  先找index,再找text,若再找不到则尝试找resource-id,再不行则尝试找父类,再不行就只能通过坐标
  通过xpyth定位:
  findElementByXPath("//android.widget.TextView[10]") xpath下标从1开始,使用完整的classname
  通过id定位:findElementById("com.xwtec.zhy.xwlottery:id/grid_item_tv_red");
  find_element_by_name(name对应uiautomator扫描后text的内容)
  find_element_by_id(id对应resource-id)
  find_element_by_class_name(class_name对应class)
  find_element_by_accessibility_id(accessibility_id对应content-desc)
  定位到某个文本框,并输入内容:
  text = driver.find_element_by_id("com.changhong.smartalbum:id/passwd_edit") text.send_keys("123456")
  滑动屏幕:
  获取屏幕尺寸 width=self.driver.get_window_size()['width'] height=self.driver.get_window_size()['height']
  滑动屏幕 driver.swipe(width*9/10, height*1/2, width*1/10, height*1/2, 1000)
  推荐一个网址里面有一些具体的Appium Python的用法:http://blog.csdn.net/alvin_lam/article/details/50717338
  10、编写Python测试脚本
  pyunit介绍:pyunit被称作python版本的junit,一般python安装好即带有unittest,检验unittest是否存在的方法:import unittest
  下面是一些Python脚本中操作app的用法:
  检查app安装情况(返回true/false), driver.is_app_installed(package_name)
  安装app driver.install_app("x:/xxx.apk")
  卸载app driver.remove_app(package_name)
  打开通知栏 driver.open_notifications()
  关闭app driver.close_app()
  启动app driver.launch_app()
  锁定屏幕x秒(不是很好用,锁定后屏幕无法解锁,导致无法后续,本人未找到解锁的方法) driver.lock(X)
  模拟摇晃设备 driver.shake
  重置应用 driver.resetApp()
  检查是否存在某个activity(未找到则返回异常) driver.find_element_by_id(activity)
  获取当前的activity: activity = self.driver.current_activity print(u"当前的activity是:", activity)
  等待activity启动直到x秒超时,每隔y秒扫描一次 driver.wait_activity(activity, x, y)
  将app置于后台运行x s(注意:测试发现置于后台数秒后变为前台时,将是重新启动app,进入首页,而不是切入后台时的界面) driver.background_app(x)
  打印可用的输入法 IME_LISE = driver.available_ime_engines print(IME_LISE)
  检查设备是否有输入法服务活动,返回True/False driver.is_ime_active()
  激活安卓设备中的指定输入法(设备可用输入法可以从“available_ime_engines”获取)") driver.activate_ime_engine(IME_LISE[-1])
  退出键盘 driver.hide_keyboard()
  11、运行Python脚本,若adb没有启动,重启adb http://jingyan.baidu.com/article/d169e186b38f37436611d8fb.html
  如:使用以下模板:(以爱壁纸的登录页面为例)
  #coding:utf-8
  #Import the common package
  import os
  import unittest
  from appium import webdriver
  from time import sleep
  #设置路径信息
  PATH = lambda p: os.path.abspath(
  os.path.join(os.path.dirname(__file__), p)
  )
  class LoginAndroidTests(unittest.TestCase):
  def setUp(self):
  #初始化测试平台
  desired_caps = {}
  desired_caps['platformName'] = 'Android'
  desired_caps['platformVersion'] = '4.4.2'
  desired_caps['deviceName'] = '127.0.0.1:62001'
  #desired_caps['app'] = 'D:\apk\爱壁纸.apk'
  desired_caps['appPackage'] = 'com.lovebizhi.wallpaper'
  desired_caps['appActivity'] = 'com.lovebizhi.wallpaper.WelcomeActivity'
  self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
  def tearDown(self):
  self.driver.quit()
  def test_1(self):
  #测试导航页
  print("start test1...")
  #判断是否安装爱壁纸APP
  wallpaper = self.driver.is_app_installed("com.lovebizhi.wallpaper")
  if wallpaper:
  #self.driver.remove_app("com.lovebizhi.wallpaper")
  sleep(8)
  # 点击某一壁纸图片
  self.driver.find_elements_by_id("com.lovebizhi.wallpaper:id/image1")[4].click()
  sleep(4)
  # 点击设置壁纸
  self.driver.find_element_by_id("com.lovebizhi.wallpaper:id/btSetup").click()
  sleep(5)
  else:
  self.driver.install_app("D:\apk\爱壁纸.apk")
  sleep(30)
  def test_2(self):
  #测试导航页
  print("start test2")
  #判断是否安装爱壁纸APP
  wallpaper = self.driver.is_app_installed("com.lovebizhi.wallpaper")
  #是
  if wallpaper:
  sleep(8)
  # 点击某一壁纸图片
  self.driver.find_elements_by_id("com.lovebizhi.wallpaper:id/image1")[5].click()
  sleep(4)
  # 点击设置壁纸
  self.driver.find_element_by_id("com.lovebizhi.wallpaper:id/btSetup").click()
  sleep(5)
  #否,安装
  else:
  self.driver.install_app("D:\apk\爱壁纸.apk")
  sleep(30)
  if __name__ == '__main__':
  suite =unittest.TestLoader().loadTestsFromTestCase(LoginAndroidTests)
  unittest.TextTestRunner(verbosity=2).run(suite)
  开启Appium
   
  运行Python脚本即可看到APP自动操作实现设置壁纸的整个流程

   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • 908774567
    2018-12-10 16:56:38

    你好,请问我这边用“adb connect 127.0.0.1:62001”提示“failed to connect to 127.0.0.1:62001”是为什么呢?怎么办呢

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号