持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
1.启动第一个appium 程序
1.1启动安卓模拟器itools,打开appium程序
1.2.确定电脑已经连接模拟器
1.在cmd中输入
adb devices adb devices
获得安卓设备的标示
上图位置即是启动的安卓模拟器的标示
1.3.获取app连接标示
我们已经连接控制了模拟器,那么怎么控制模拟器里面的app呢? 这时候我们需要获得app的标示appPackage和appActivity
包名(Package name):在Android系统中是判断一个App的唯一标识,不同的App 可以有同样的名字(xxx.apk),但在一个手机中它的包名不可以相同(包名隐藏在软件内 部,不能直接看到,而app的名字可以)。 activity:简单的来说Activity指的就是App中我们看到的页面,一个页面就是一个 Activity,通常第一页启动起来的页面我们就称之为 “启动页Activity”。所以这个可以 理解为"页面名"或"窗口名"。
下面我以itools 游戏这个app为例
- 在cmd中输入
adb logcat -c
清除旧的log(以前的一些软件产生的日志)
2. 在cmd中输入
adb logcat >c:\1.txt
开始收集log,并将收集的log写入C盘的1.txt文件中(如果没有该文件会自动创建)
3.开始收集后,打开模拟器中的itool 游戏,关于这个软件的信息就会记录在1.txt文件中
4.在cmd窗口中按ctrl+c停止收集(或者直接关闭dos窗口),打开1.txt文件,查找cmp(若有 多个cmp注意分辨)
5.分析log
从1.txt中截取到的CMP为: cmp=cn.itools.avdmarket/.ui.activity.HostActivity bnds=[120,102][356,212] (has extras)} from pid 2575 cn.itools.avdmarket即为appPackage(从等号开始,到一个斜杠结束) .ui.activity.HostActivity即为appActivity(从第一个斜杠开始,到第一个空格结束)
1.4.脚本编写
现在我们来编写一个自动化脚本,打开itool 游戏,然后关闭itool 游戏 打开python编辑器,输入:
#coding=utf-8
2. from appium import webdriver
3. import time
4.
5. desired_caps = {}
6. desired_caps['platformName'] = 'Android'
7. desired_caps['platformVersion'] = '4.4.2'
8. desired_caps['deviceName'] = 'Android Emulator'
9. desired_caps['appPackage'] = '要替换'
10. desired_caps['appActivity'] = '要替换'
11.
12. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
13.
14. time.sleep(3)
15. driver.quit()
将你定位到的appPackage值和appPackage值,替换到后面的位置,得到下面的脚本:
#coding=utf-8
2. from appium import webdriver
3. import time
4.
5. desired_caps = {}
6. desired_caps['platformName'] = 'Android'
7. desired_caps['platformVersion'] = '4.4.2'
8. desired_caps['deviceName'] = 'Android Emulator'
9. desired_caps['appPackage'] = 'cn.itools.avdmarket'
10. desired_caps['appActivity'] = '.ui.activity.HostActivity'
11.
12. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps )
13.
14. time.sleep(3)
15. driver.quit()
保持“itool 游戏”app为关闭状态,运行该段代码,会发现模拟器中,app打开了3秒钟,然 后关闭。 到了这里,经过这么多努力,大家终于写出第一个appium程序!
2.基本代码讲解
from appium import webdirver :
从这段引用上就可以看出,appium继承了selenium很多的类,这里甚至连webdriver的名字 都没有变化。
desired_caps = {} 这里是定义了一个名为 desired_caps 的空字典
desired_caps['platformName'] = 'Android'
2. desired_caps['platformVersion'] = '4.4.2'
3. desired_caps['deviceName'] = 'Android Emulator'
4. desired_caps['appPackage'] = 'cn.itools.avdmarket'
5. desired_caps['appActivity'] = '.ui.activity.HostActivity'
6. 这里是给字典添加了5个键,如第一组键:platformName是键名,Android是键值
desired_caps : desired_capability 字面意思是“所需的能力”,其实就是,需求,前提条件的意思。既然它代表的是字典变量的名字,当然你把它改成其他的名字对代码也没有影 响,不过大家都用它,我们也没必要标新立异。
desired_caps['platformName'] = 'Android' :平台名称
desired_caps['platformVersion'] = '4.4.2' :平台版本(一般不严格要求绝对准确) desired_caps['deviceName'] = 'Android Emulator' 设备名称,不严格要求,照抄就行 下两个是我们上面进行过定位的app连接标示,只有通过这两个,电脑才知道我们要需要对哪 个app进行自动化。
desired_caps['appPackage'] = 'cn.itools.avdmarket' app包名 desired_caps['appActivity'] = '.ui.activity.HostActivity' app最基本的页面名 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)打开
app的实例 webdriver.Remote实际上就是原生webdriver的子类,另外Remote()函数的第一个参数中需 要显示指定appium server监听的端口。当启动一个设备时,基本都是用这个端口,一般不会 变化。第二个参数就是上面包含APP信息的字典。
3.属性定位工具uiautomatorviewer.bat
这里引入一个插件,在android的sdk包中,有一个插件uiautomatorviewer.bat(ui自动化视 图工具) 路径:...\adt-bundle-windows-x86_64-20140702\sdk\tools\uiautomatorviewer.bat
1.在模拟器中(下载了一个android计算器app),我这里是在百度手机助手里面,搜索计算器 下载的。
2.打开计算器
3.打开uiautomatorviewer.bat,点击图示位置按钮
4.出现下面的图
该软件截取了模拟器中正打开的屏幕,点击选择控件,在右下角的属性区,就能知道该控件的 属性了(和我们在firefox中使用firebug查看元素属性类似)。
5.定位控件"1"
现在选中“1”这个控件,发现它的text属性为“1”。在appium中,text属性对应我们在浏 览器中的元素属性名是name。所以这里可以使用find_element_by_name("1")来定位这个控 件。
6.获取计算器的'appPackage'和'appActivity',并替换进脚本 现在我们运行下面的代码:
1. #coding=utf-8
2. from appium import webdriver
3. import time
4.
5. desired_caps = {}
6. desired_caps['platformName'] = 'Android'
7. desired_caps['platformVersion'] = '4.4.2'
8. desired_caps['deviceName'] = 'Android Emulator'
9. desired_caps['appPackage'] = 'com.ibox.calculators'
10. desired_caps['appActivity'] = '.CalculatorActivity'
11.
12. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps )
13. driver.find_element_by_name("1").click()
14. time.sleep(3)
15. driver.quit()
运行结果:
1.打开计算器
2.输入1
3.关闭计算器 经过这里,大家发现,appium对元素的定位和操作的方法,和在selenium中基本一模一样。 所有在selenium中用过的方法,都能直接移植到appium中使用 下面我来说一下各个方法和uiautomatorviewer.bat属性区的对应关系:
1. by_id---->resource-id
2. by_class_name----->class
3. by_name----->text