1、获取 Android app的Activity

打开终端cmd,先cd进入到刚才下载的“新浪.apk”目录下,然后使用aapt dump badging xxx.apk命令获取包内信息。注意,启动类名称一个字母都不能错。

 aapt dump badging 新浪.apk cat>d:/log.txt     这样可以将信息指定到某一文件下然后 查看 

  罪过了,后面发现正常是没有appt.exe 这个应用程序的。可以下载一个放到tools文件下,因为已经配置了环境变量,所以 可以直接使用。

可以从下面拷贝一个到tools下即可。

2、启动微博

  1. #-*-coding:utf-8-*-
  2. #Time:2017/7/20 18:06
  3. #Author:YangYangJun
  4. import time
  5. from appium import webdriver
  6. desired_caps = {}
  7. desired_caps['platformName'] = 'Android'
  8. desired_caps['platformVersion'] = '6.0'
  9. desired_caps['deviceName'] = 'N79SIV5PVCSODAQC'
  10. desired_caps['appPackage'] = 'com.sina.weibo'
  11. desired_caps['appActivity'] = 'com.sina.weibo.SplashActivity'
  12. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
  13. driver.implicitly_wait(5)
  14. time.sleep(3)
  15. driver.quit()

3、元素定位

 3.1、appium的webdriver提供了11种元素定位的方法,在selenium的基础上扩展了三个,可以在pycharm里面输入driver.find_element_by然后会自动匹配出来 
 
 

 多的三个:
      driver.find_element_by_accessibility_id()
      driver.find_element_by_android_uiautomator()
      driver.find_element_by_ios_uiautomation()
      (第三个是ios的专用的)

3.2、下面一一举例进行 介绍

3.2.1、元素定位本篇主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作.

uiautomatorviewer是android-sdk自带的一个元素定位工具,非常简单好用,使用uiautomatorviewer,你可以检查一个应用的UI来查看应用的布局和组件以及相关的属性。

启动uiautomatorviewer.bat

打开目录D:\SProgram\Sdk\tools

双击启动,启动之后出现如下界面

 

如果不喜欢双击启动的话,也可以在cmd里面通过指令启动

先cd到tools目录下,然后输入uiautomatorviewer.bat回车后启动服务

3.2.1、find_element_by_accessibility_id

driver.find_element_by_accessibility_id(u"我的").click()

 

 3.2.2、通过id定位元素
resrouce-id属性是id:
driver.find_element_by_id('username') 

3.2.3、通过name定位元素
text属性是name

driver.find_element_by_name('password')

 

 4、结合公司刚开发出来的app,进行项目实训
  1. #-*-coding:utf-8-*-
  2. #Time:2017/7/21 16:32
  3. #Author:YangYangJun
  4.  
  5. import time
  6. import unittest
  7.  
  8. from appium import webdriver
  9.  
  10. import sys
  11. reload(sys)
  12. sys.setdefaultencoding('utf8')
  13.  
  14. class Login(unittest.TestCase):
  15.  
  16. def setUp(self):
  17. self.desired_caps = {}
  18.  
  19. self.desired_caps['platformName'] = 'Android'
  20. self.desired_caps['platformVersion'] = '6.0'
  21. self.desired_caps['deviceName'] = 'N79SIV5PVCSODAQC'
  22. self.desired_caps['appPackage'] = 'com.xxxx.mrg'
  23. self.desired_caps['appActivity'] = 'com.uzmap.pkg.EntranceActivity'
  24. #隐藏键盘
  25. self.desired_caps['unicodeKeyboard'] = True
  26. self.desired_caps['resetKeyboard'] = True
  27.  
  28. self.driver = webdriver.Remote('http://localhost:4723/wd/hub', self.desired_caps)
  29. #self.driver.implicitly_wait(15)
  30.  
  31. #测试异常登录-用户不存在
  32.  
  33. def test_aNoUserLogin(self):
  34.  
  35. driver = self.driver
  36. time.sleep(5)
  37. driver.find_element_by_accessibility_id(u"我的").click()
  38.  
  39. time.sleep(5)
  40.  
  41. driver.find_element_by_accessibility_id(u"登录/注册").click()
  42. time.sleep(2)
  43.  
  44. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("username")').clear()
  45.  
  46. time.sleep(2)
  47. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("username")').send_keys('xzbuyer1')
  48. time.sleep(2)
  49.  
  50. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("password")').clear()
  51.  
  52. time.sleep(2)
  53. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("password")').send_keys('')
  54.  
  55. time.sleep(2)
  56.  
  57. driver.find_element_by_accessibility_id(u"登录").click()
  58. time.sleep(18)
  59.  
  60. get_alertMessage = driver.find_elements_by_android_uiautomator('new Uiselector().resourceId("android:id/message")').get_attribute('name')
  61. time.sleep(2)
  62. if get_alertMessage == u'用户不存在':
  63. print u"用户不存在,用例执行成功!"
  64. else:
  65. print u"用例执行失败!"
  66.  
  67. def test_bNoPassLogin(self):
  68.  
  69. driver = self.driver
  70. time.sleep(5)
  71. driver.find_element_by_accessibility_id(u"我的").click()
  72.  
  73. time.sleep(5)
  74.  
  75. driver.find_element_by_accessibility_id(u"登录/注册").click()
  76. time.sleep(2)
  77.  
  78. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("username")').clear()
  79.  
  80. time.sleep(2)
  81. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("username")').send_keys('xzbuyer')
  82. time.sleep(2)
  83.  
  84. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("password")').clear()
  85.  
  86. time.sleep(2)
  87. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("password")').send_keys('')
  88.  
  89. time.sleep(2)
  90.  
  91. driver.find_element_by_accessibility_id(u"登录").click()
  92. time.sleep(18)
  93.  
  94. get_alertMessage = driver.find_elements_by_android_uiautomator('new Uiselector().resourceId("android:id/message")').get_attribute('name')
  95. time.sleep(2)
  96. print get_alertMessage[0:5]
  97.  
  98. # if get_alertMessage == u'用户不存在':
  99. # print u"用户不存在,用例执行成功!"
  100. # else:
  101. # print u"用例执行失败!"
  102. #
  103.  
  104. # 测试正常登录
  105.  
  106. def test_cLogin(self):
  107.  
  108. driver = self.driver
  109. time.sleep(5)
  110. driver.find_element_by_accessibility_id(u"我的").click()
  111.  
  112. time.sleep(5)
  113.  
  114. driver.find_element_by_accessibility_id(u"登录/注册").click()
  115. time.sleep(2)
  116.  
  117. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("username")').clear()
  118.  
  119. time.sleep(2)
  120. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("username")').send_keys('xzbuyer')
  121. time.sleep(2)
  122.  
  123. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("password")').clear()
  124.  
  125. time.sleep(2)
  126. driver.find_element_by_android_uiautomator('new UiSelector().resourceId("password")').send_keys('')
  127.  
  128. time.sleep(2)
  129.  
  130. driver.find_element_by_accessibility_id(u"登录").click()
  131. time.sleep(2)
  132.  
  133. # 判断是否登录成功
  134.  
  135. print driver.find_element_by_accessibility_id(u"西藏医药销售有限公司").get_attribute('name')
  136.  
  137. nickName = driver.find_element_by_accessibility_id(u"西藏医药销售有限公司").get_attribute('name')
  138. temp = nickName[0:2]
  139. print temp
  140. if nickName == u'西藏医药销售有限公司':
  141. print '登录成功!'
  142.  
  143. else:
  144. print '登录失败!'
  145.  
  146. def tearDown(self):
  147. self.driver.close_app()
  148. self.driver.quit()
  149.  
  150. if __name__ == "__main__":
  151. unittest.main()

Python Appium 开启Android测试之路的更多相关文章

  1. Python +appium 封装desired_caps模块

    使用python+appium做android的自动化测试时,首先需要启动appium服务,然后连接上手机,配置如下: desired_caps = {"platformName" ...

  2. Android ROM开发(三)——精简官方ROM并且内置ROOT权限,开启Romer之路

    Android ROM开发(三)--精简官方ROM并且内置ROOT权限,开启Romer之路 相信ROM的相关信息大家通过前几篇的学习都是有所了解了,这里就不在一一提示了,这里我们下载一个官方包,我们还 ...

  3. Python+Appium自动化测试(15)-使用Android模拟器(详细)

    做APP的UI自动化测试时,我们往往会使用真机跑自动化测试脚本,因为这样才是最真实的使用场景.但前期调试脚本的话,可以先使用模拟器,这样相对更加方便. 不推荐使用Android SDK里自带模拟器,太 ...

  4. Windows下部署Appium教程(Android App自动化测试框架搭建)

    摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...

  5. 如何搭建基于C#和 Appium 的 Android自动测试环境

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使 ...

  6. Python appium搭建app自动化测试环境

    appium做app自动化测试,环境搭建是比较麻烦的. 也是很多初学者在学习app自动化之时,花很多时间都难跨越的坎. 但没有成功的环境,就没有办法继续后续的使用. 在app自动化测试当中,我们主要是 ...

  7. python appium笔记(二):元素定位

    #这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境 #环境配置和一些参数的意思不清楚可以看我上一篇python appium笔记(一) ...

  8. Python+Appium环境搭建

    1.python环境搭建,这里就不做过多介绍 2.安装 node.js 2.1.官网下载node.js:https://nodejs.org/en/download/ 2.2.获取到安装文件后,直接双 ...

  9. Appium 在 Android UI 测试中的应用

    原文地址:https://blog.coding.net/blog/Appium-Android-UI Android 测试工具与 Appium 简介 Appium 是一个 C/S 架构的,支持 An ...

随机推荐

  1. windows下常用的几个批处理脚本

    1.windows下对比两个文件内容,有差异则执行一个任务: 适用场景:比如你的数据库备份结果的日志每天会形成一个文件,如下图,你可以通过此脚本检测到文件的变化,并执行发送告警邮件通知你数据库备份异常 ...

  2. Eclipse自动生成方法注释 快捷键

    自动生成方法的注释格式,例如 /*** @param str* @return* @throws ParseException*/ 快捷键是 ALT + SHIFT + J,将光标放在方法名上,按快捷 ...

  3. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  4. Google Protocol Buffer在vs2010下配置

    1.从这里下载protobuf-2.6.1.tar.gz到桌面,并解压,解压后的文件夹为protobuf-2.6.1.(我的桌面为C:\Users\mcl\Desktop) 2 .进入文件夹proto ...

  5. ODAC(V9.5.15) 学习笔记(七)TOraUpdateSQL

    名称 类型 说明 DataSet 指向需要执行更新操作的数据集 DeleteObject 当执行删除操作时,通过该属性执行另外一个数据集,由后者来执行更多的删除动作 DeleteSQL TString ...

  6. 再谈 iptables 防火墙的 指令配置

    手机上使用localhost为什么不能访问? 电脑上使用localhost 访问主页的原理是 电脑上有网站资源和服务器相关程序apache等的支持, 同时在 电脑的hosts文件中 有 127.0.0 ...

  7. 如何查看sonarqube的版本

    Server Logs & System Info The System Info page is found at Administration > System. It gives ...

  8. oracle 之 创,增,删,改操作

    --创建表 (包含其中的数据) create table TableName as select * from TableName --插入数据 insert into TableName(列,列.. ...

  9. LuoguP2257 YY的GCD

    题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于 ...

  10. 题解——P1133 教主的花园DP

    直接设二维状态具有后效性,会爆零 然后需要加一维 然后70 看了题解之后发现没有考虑1和n的关系 考虑之后,四十 然后懵逼 突然发现自己的ans更新写错了,导致每次ans都是第一个取30的情况的解 然 ...