zoukankan      html  css  js  c++  java
  • 02_appium基本使用

    appium基本使用

    • 夜神模拟器win7系统下的连接方法: adb connect 127.0.0.1:62001
    • 夜神模拟器win10系统下的连接方法: adb connect 127.0.0.1:62025
    • 查看当前运行的APP的包名和打开的Activity
      adb shell "dumpsys window | grep mCurrentFocus"

    配置Python连接手机app

    desired  = {
      "platformName": "Android",
      "platformVersion": "设备版本",
      "deviceName": "设备名称",
      "appPackage": "包名",
      "appActivity": "activity名称",
      "unicodeKeyboard": "True",
      "restKeyboard": "True"
    }
    

    首先需要现在appium中开启服务

    点击后如下

    在appium中配置json文件

    {
      "platformName": "Android",
      "platformVersion": "设备版本",
      "deviceName": "设备名称",
      "appPackage": "包名",
      "appActivity": "activity名称",
      "unicodeKeyboard": "True",
      "restKeyboard": "True"
    }
    

    然后点击

    填写json内容

    填写完成后,点击保存

    当然你也可以保存该配置至电脑中

    定位元素

    start_session就可以开始定位元素了

    基本使用

    判断属性是否唯一


    基本定位

    from appium import webdriver
    from time import sleep
    
    # 配置需要操作的手机以及app
    desired = {
      "platformName": "Android",
      "platformVersion": "5.1.1",
      "deviceName": "127.0.0.1:62001",
      "appPackage": "com.mymoney",
      "appActivity": "com.mymoney.biz.splash.newguide.NewGuideActivity",
      "unicodeKeyboard": "True",
      "restKeyboard": "True"
    }
    
    # 连接appium,打开app
    d = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired)
    sleep(5)
    
    # 点击下一步,使用id定位
    d.find_element_by_id('com.mymoney:id/next_btn').click()
    sleep(3)
    
    # 再次点击下一步,使用class定位
    d.find_element_by_class_name('android.widget.Button').click()
    sleep(3)
    # 点击开始随手记
    d.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.LinearLayout[2]/android.widget.LinearLayout[2]/android.widget.Button[1]').click()
    sleep(10)
    
    # 关闭app
    d.close_app()
    
    

    UIAutomator定位

    使用方法 find_element_by_android_uiautomator() 可以运用UiAutomator元素定位。
    UiAutomator提供一下三种方式来定位:
    •id定位d.find_element_by_android_uiautomator('new UiSelector().resourceId("id的值")')
    •text定位d.find_element_by_android_uiautomator('new UiSelector().text("text的内容")')
    •class name定位d.find_element_by_android_uiautomator('new UiSelector().className("className的值")')

    定位一组元素

    Swipe 两点之间的滑动操作

    我们在使用App的过程中,经常会在屏幕上进行滑动的操作,如,刷新新闻,刷朋友圈等,会做上下滑动的动作;如果是看图片,就会左右移动。在Appium里面,我们是用swipe()这个方法来实现这个操作。

    语法:
    swipe(起始横坐标,起始纵坐标,目标横坐标,目标纵坐标)

    获取屏幕尺寸d.get_window_size()获取屏幕大小,以词典的方式返回

    想右滑动,y轴不变,x轴由小到大即可

    # 获取屏幕大小,以词典的方式返回
    size = d.get_window_size()
    width = size['width']
    height = size['height']
    x1 = 0.2 * width
    x2 = 0.9 * width
    y = 0.5*height
    d.swipe(x1,y,x2,y)
    

    连续滑动

    swipe滑动操作,一般是两点之间的滑动,而实际使用过程中用户可能要进行一些多点连续滑动操作。如手势密码操作,切西瓜等场景。那么在Appium中该如何模拟这类操作呢?
    TouchAction
    TouchAction包含一些列操作,比如按压、长按、点击、移动、暂停。由这些不同操作可以组成一套动作。使用TochAction需要先导入对应的模块:
    from appium.webdriver.common.touch_action import TouchAction

    连续滑动需要导入from appium.webdriver.common.touch_action import TouchAction

    • 按压

    方法:press() 按压一个元素或坐标点(x,y)。

    press(element)
    press(x,y)
    
    • 长按

    方法:相比press()方法,long_press()多了一个入参,就是长按的时间。duration以毫秒为单位。1000表示按一秒钟。其用法与press()方法相同。

    long_press(element,duration=1000)
    long_press(x,y,duration=1000)
    
    • 点击

    方法:tap() 对一个元素或控件执行点击操作。用法参考press()。

    tap(element)
    tap(x,y)
    
    • 移动

    方法:move_to() 将指针从上一个点移动到指定的元素或点。

    move_to(element)
    move_to(x,y)
    
    • 暂停

    方法:wait()暂停脚本的执行,单位为毫秒。

    wait(ms)
    
    • 释放

    方法release() ,我们滑动总要停止吧?怎么停止?就是用这个方法停止。

    release()
    
    • 执行

    方法:perform() 把要执行的操作发送到Appium服务器,即让要执行的操作生效。

    perform()
    

    示例代码

    from appium import webdriver
    from time import sleep
    from appium.webdriver.common.touch_action import TouchAction
    
    # 配置需要操作的手机以及app
    desired = {
      "platformName": "Android",
      "platformVersion": "5.1.1",
      "deviceName": "127.0.0.1:62001",
      "appPackage": "com.mymoney",
      "appActivity": "com.mymoney.biz.splash.newguide.NewGuideActivity",
      "unicodeKeyboard": True,
      "restKeyboard": True
    }
    
    # 连接appium,打开app
    d = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired)
    
    sleep(5)
    
    # UIAutomator定位之id定位
    d.find_element_by_android_uiautomator('new UiSelector().resourceId("com.mymoney:id/next_btn")').click()
    sleep(2)
    
    # 再次点击下一步,使用class定位
    d.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")').click()
    sleep(2)
    # 通过text定位,进入首页
    d.find_element_by_android_uiautomator('new UiSelector().text("开始随手记")').click()
    sleep(10)
    
    # 点击更多
    d.find_element_by_id('com.mymoney:id/nav_setting_btn').click()
    sleep(2)
    
    
    # 往上滑动
    
    # # 获取屏幕大小,以词典的方式返回
    size = d.get_window_size()
    width = size['width']
    height = size['height']
    x = 0.5 * width
    y1 = 0.2 * height
    y2 = 0.9 * height
    d.swipe(x,y2,x,y1)
    sleep(2)
    
    
    # 点击高级
    d.find_element_by_android_uiautomator('new UiSelector().text("高级")').click()
    sleep(2)
    d.find_element_by_android_uiautomator('new UiSelector().text("密码与手势密码")').click()
    sleep(2)
    d.find_element_by_android_uiautomator('new UiSelector().text("手势密码保护")').click()
    sleep(2)
    
    print('连续滑动')
    TouchAction(d).press(x=169,y=190).wait(1000).move_to(x=274,y=190).move_to(x=270,y=293).move_to(x=170,y=382).release().perform()
    sleep(3)
    
    d.close_app()
    

    H5元素的定位

    在混合开发的App中,经常会有内嵌的H5页面。针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原生控件进行元素定位,而Web网页是单独的B/S架构,两者的运行环境不同因此需要进行上下文(context)切换,然后对H5页面元素进行定位操作。
    什么是context呢?在程序中context我们可以理解为当前对象在程序中所处的一个环境。 比如前面提到的App一个界面是属于Activity类型,也就是Android界面环境,但是当访问内嵌的网页是属于另外一个环境(网页环境),两者处于不同的一个环境。

    • 获取所有的上下文contexts,以列表的形式返回
    all_context = d.contexts
    print(all_context)
    
    • 切换上下文switch_to.context()
    all_context = d.contexts
    d.switch_to.context(all_context[1])
    
    • H5操作的环境搭建
    1. 手机与电脑连接,通过adb devices可查看到此设备。
    2. 电脑端必须安装chrome浏览器(selenium环境搭建好即可)。
    3. App Webview开启debug模式(注:此步骤,一般需要App开发人员开启。)
    4. 在电脑端Chrome浏览器地址栏输入chrome://inspect/#devices,进入调试模式
    5. 打开app对应的h5页面,在 chrome://inspect/#devices 地址中,检查是否显示对应的webview,如没有,则当前未开启调试模式。

    上图App已经开启了开启调试模式。

    1. 下载与手机系统浏览器的版本相对应的驱动
      比如我的版本是74.0.3729.136,我就需要下载相对应版本的谷歌浏览器驱动
      下载下来之后创建一个文件夹存放该驱动,并且解压
      比如,我在D盘创建了一个app_chromederiver目录,将驱动移动进去并解压

    另外在脚本中的desired中增加一项chromedriverExecutable指定驱动位置即可
    比如我的:

    # 配置需要操作的手机以及app
    desired = {
      "platformName": "Android",
      "platformVersion": "5.1.1",
      "deviceName": "127.0.0.1:62001",
      "appPackage": "com.wondershare.drfone",
      "appActivity": "com.wondershare.drfone.ui.activity.Main2Activity",
      "unicodeKeyboard": True,
      "restKeyboard": True
    }
    
    # 由于appium自带了一个chromedriver,所以我们需要指定appium使用我们下载下来的对应版本的驱动
    # 在desired中,增加一个key>>> chromedriverExecutable,它的值就是指定的驱动位置
    desired['chromedriverExecutable'] = R"D:app_chromederiverchromedriver.exe"
    

    完整H5页面代码演示

    from appium import webdriver
    from base import desired
    from time import sleep
    
    desired['appPackage'] = 'com.wondershare.drfone'
    desired['appActivity'] = 'com.wondershare.drfone.ui.activity.WebViewActivity'
    
    # 指定appium使用chromedriver.exe
    desired['chromedriverExecutable'] = R'D:chromedriver.exe'
    
    d = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired)
    print('开始等待20s')
    sleep(20)
    
    
    # contexts 获取所有的上下文
    all_contexts = d.contexts
    print(all_contexts)
    sleep(1)
    # 切换上下文
    d.switch_to.context(all_contexts[1])
    print('切换上下文')
    sleep(2)
    d.find_element_by_id('email').send_keys('sam@imsam.cn')
    sleep(2)
    d.find_element_by_class_name('btn_send').click()
    sleep(2)
    
  • 相关阅读:
    随机验证码实验报告
    输出验证
    原码,反码,补码!
    枚举验证结论
    Java第一次考试有感
    暑假第七周学习进度报告
    暑假第六周学习进度报告
    MySQL学习笔记(22)——常用的日期时间函数
    execute()返回值——true or false
    ORM
  • 原文地址:https://www.cnblogs.com/jianxiaochong/p/13529492.html
Copyright © 2011-2022 走看看