zoukankan      html  css  js  c++  java
  • 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 ools下有个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 ']

    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)
  • 相关阅读:
    CCLayerColor 用法
    数据存储的常见方式
    rand() 和arc4random()到底应该如何取舍呢
    Cocos2d 中对图片的各种操作
    objectivec 解压缩zip
    设置IE浏览器默认的下载路径
    设置浏览器主页
    得到所有本机上安装的软件名
    取消快捷方式中的箭头图标
    查看本机服务
  • 原文地址:https://www.cnblogs.com/laosun0204/p/9350966.html
Copyright © 2011-2022 走看看