appium原理及api

pip install Appium-Python-Client(客户端安装命令,就是在pycharm里的Terminal里通过命令安装)
python -m pip install --upgrade pip(升级pip的命令,就是在pycharm里的Terminal里通过命令安装)

windows通过在cmd下输入adb logcat|findstr START,杀掉所有进程,回车,点击想要测试的app,就可以找到包名入口,斜杠之前为appPackage,斜杠之后为appActivity,即com.android.browser是包名,.BrowserActivity是入口 

mac通过adb logcat|grep START查找包名和入口

app冷启动:后台刚打开一个进程
app热启动:
后台已经打开一个进程,如QQ,再次打开QQ,就是热启动

appium 测试移动端UI自动化
appium 哲学 移动端自动化测试而单独开发一套api接口
appium是基于selenium做的二次开发
android uiautomator
IOS uiautomation/XCUitest

android appium初始化参数:
1、appPackage 包名
2、appActivity 入口
3、deviceName 手机名(通过adb devices获取)
4、platformName 操作系统
5、platformVersion 版本
6、unicodeKeyboard 输入法(True or False)
7、resetKeyboard 重置输入法(True or False)
8、noReset 解决登录问题,相当于手机恢复出厂设置,默认是False

from appium import webdriver
des = {
'appPackage': 'com.tencent.mobileqq', # 包名,通过aapt dump badging xxx.apk命令获取,找到package
'appActivity': 'com.tencent.mobileqq.activity.SplashActivity', # 入口,通过aapt dump badging xxx.apk命令获取,找到launchable-activity
'deviceName': '127.0.0.1:62001', # 手机名(通过adb devices获取,如果是真机就用真机的devicename)
'platformName': 'Android', # 操作系统
'platformVersion': '4.4.2', # 版本号(真机设置里的版本号)
'unicodeKeyboard': True, # 输入法(True or False)
'resetKeyboard': True, # 重置输入法(True or False)
'noReset': True # True是不将app初始化,解决登录问题,False或这行注释就是弹出qq时以百分比形式出现,然后跳到登录
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des) # http://127.0.0.1:4723/wd/hub,连接到server端,就是cmd里面的appium

appium服务端和客户端的端口都是4723,同时启动就要修改客户端的端口,首先启动appium服务端,在夜游神或真机里安装qq,可以直接拖qq的apk到夜游神,也可以adb install QQ.apk,运行完上面的代码会在夜游神或真机里生成Appium Settings,再生成Unlock机器人图标,最后调qq应用,在夜游神或真机里如下图:

关闭appium服务端,启动appium客户端,点击Start Server V1.6.5按钮启动服务,启动后会跳转到如下页面:

可以看到服务已经起来了,点击右上角红框里的按钮,在跳转的页面里默认显示Automatic ServerDesired Capabilities(参数设置),Desired Capabilities是key-value类型的,其实就是把上面代码字典里的key和value拷贝过来,点击Save As...,起一个名字,保存一下,然后在Saved Capability Sets里看到Capability SetCreatedactions,点击一下就可看到详细的配置信息,点击Start Session按钮,就会调qq应用,在夜游神或手机里看到qq调用成功了,同时也会看到如下页面:

请求的时候这一刻只有这个页面,把这个页面元素返给Appium客户端,Appium客户端就是这么展示的,要想和夜游神或真机保持一致,要点击上图的刷新按钮,该按钮的作用是Refresh Source & Screenshot,点击一下就看到两个页面保持一致了,点击Tap按钮,进入登录页面,弹出下图的页面:

刷新按钮右边的按钮是录制按钮,点击录制按钮,显示两条竖杠,就是录制中,选中QQ号文本框,点击Send Keys,输入一个qq号,再点击send keys,就把操作录制下来,然后在真机或者模拟器中显示输入的qq号,接着在appium客户端的qq文本框里也显示刚才输入的qq号,并在中部出现下图的Recorder,在下拉框里选择Python,可以看到代码,如下图:


 支持分享功能,点击Python下拉框右边第一个按钮(Show/Hide Boilerplate code),再点击第二个按钮,复制出来可运行的代码,第三个按钮是清除已经录制的代码,也可以点击Clear会清除左侧的qq号,如下图:

第一排第一个按钮相当于浏览器上的那个定位按钮,第二个按钮是滑动,打开设置,让真机或模拟器跟appium客户端保持同步,然后选择一个点,向下或向上划,就会动,录制按钮右边的是Search for element,点击一下可以通过定位方式定位元素

抓取元素可以使用appium客户端,也可以用uiautomatorviewer.bat,在D:\android-sdk-windows\tools下有个uiautomatorviewer.bat,它通过截屏的方式获取页面元素,双击uiautomatorviewer.bat,弹出下面的页面,点击红框中的按钮

会截取到夜游神或真机中当前的页面,截图的过程中如果报下面的报错

 

因为一个手机已经被占用了,不能使用uiautomatorviewer.bat再去调用这个手机,要把appium的服务端关闭就可以了,在UI Automator Viewer的右侧Node Detail中,如果有text就用text定位;如果有resource-id,resource-id类似于我们html里的id,这个可能重复;如果有class,类似于我们html里的class,也可能重复,且不准确;content-desc残障人士用的,对应的accessibility_id,用xpath定位,懒人用这个

 

第一种定位方式是通过:accessibility_id,选择Accessibility ID点击放大镜按钮,弹出Search for element对话框,如下图:

 

选择定位策略Accessibility ID,Selector里输入请输入QQ号码或手机或邮箱,点击Search按钮,会定位到元素,如下图:

 

 

选中定位到的元素后,可以Clear也可以Send Keys

ele1 = driver.find_element_by_accessibility_id('请输入QQ号码或手机或邮箱')
ele1.send_keys(999999)

 

第二种定位方式是通过:class,选择Class Name,定位到两个元素,有重复的,点击

会定位密码行,会出现两个input框,第一个元素就是qq号,选中第一个元素,输入qq号,点击Send Keys按钮,就会在qq号框里出现输入的qq号,如下图操作:

选中定位到的元素后,可以Clear也可以Send Keys,有重复的按照下标取值
ele2 = driver.find_elements_by_class_name('android.widget.EditText')[0]
ele2.send_keys(11111)

 

第三种定位方式是通过:xpath,选择XPath,xpath取到唯一值

ele3 = driver.find_element_by_xpath('//android.widget.EditText[@content-desc="请输入QQ号码或手机或邮箱"]')
ele3.send_keys(12345678)

 

第四种定位方式是通过:id,选择Id,id可以用resource-id,如果Find By里有id,Selector和resource-id一样就可以

ele4 = driver.find_element_by_id('resource-id')
ele4.send_keys(12345)

 

第五种定位方式是通过:android_uiautomator,选择UIAutomator Selector (Android),Selector输入new UiSelector().text("QQ号/手机号/邮箱"),如下图:

# text
# 匹配全部text文字
driver.find_element_by_android_uiautomator('new UiSelector().text("手机号")')
# 包含text文字
driver.find_element_by_android_uiautomator('new UiSelector().textContains("机")')
# 以text什么开始
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("手")')
# 正则匹配text
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^手.*")')

记住第一个就行,类似于java,new一个对象,选中定位到的元素后,可以Clear也可以Send Keys

 

使用appium服务端对qq的用户名和密码进行定位,下面是通过accessibility_id和class两种方式定位,并输入值,操作过程中关闭appium客户端,同时观察appium服务端的日志和夜游神模拟器的动作

 

再通过另外两种方式定位登录按钮和密码框,android_uiautomator和xpath

 

driver.start_activity('com.tencent.mobileqq', '.activity.RegisterPhoneNumActivity'),也可以通过进入新用户页面,跳过好多元素定位

 

启动appium客户端,File->New Session Window,弹出以下页面:

Custom Server中是调用远程服务的,输入远程服务端的Host和Port,点击Start Session就是连接另一个人的手机,Automatic Server是调用本地的,通过启动的

 

操作app的代码:

 

 

还是打印:

当前的窗口 NATIVE_APP
返回所有的窗口 ['NATIVE_APP']

 

第二种通过虚拟机的形式,首先找到虚拟机的路径,E:\android-sdk-windows下的AVD Manager,打开进入Android Virtual Device Manage页面

 

点击Create创建虚拟机的配置详细如下(我配置两个虚拟机):

 

选中一个设备,点击Start按钮,再点击Launch按钮,弹出下面的页面

然后会生成一个虚拟的手机,通过adb devices找到deviceName,在虚拟机里找到版本号,其他的不用换,运行一下会生成

当前的窗口 NATIVE_APP
返回所有的窗口 ['NATIVE_APP','WEBVIEW_com.android.browser\r']

 

from appium import webdriver
des = {
'appPackage': 'com.android.browser', # 浏览器包名
'appActivity': '.BrowserActivity', # 浏览器入口
'deviceName': '127.0.0.1:62001',# 手机名(通过adb devices获取)
'platformName': 'Android',# 操作系统
'platformVersion': '4.4.2',# 版本
'unicodeKeyboard': True, # 输入法(True or False)
'resetKeyboard': True, # 重置输入法(True or False)
'noReset': True # 不将app初始化,解决登录问题,相当于手机恢复出厂设置,默认是False
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des) # http://127.0.0.1:4723/wd/hub,连接到server端
import time
size = driver.get_window_size()
x = size.get('width')
y = size.get('height')
ele = driver.find_element_by_id('url')
ele.send_keys('https://m.taobao.com/?sprefer=sypc00#index')
time.sleep(2)
driver.press_keycode(66)
time.sleep(4)
def up(time): # 手机屏幕向上滑动,包括起始的横坐标、纵坐标、结束的横坐标、纵坐标和持续时间,单位毫秒
start_x = x * 0.5
start_y = y * 0.8
end_x = x * 0.5
end_y = y * 0.2
driver.swipe(start_x,start_y,end_x,end_y,time)
up(3000)
posted @ 2018-07-22 18:14  laosun0204  阅读(441)  评论(0编辑  收藏  举报