appium 移动端自动化测试

一、介绍

        Appium是一个开源工具,用于自动化iOS收集、Android手机和Windows桌面平台的原生、混合和移动Web应用程序测试。appium是基于 webdriver 协议添加对移动设备自动化api扩展而成,因此大部分的api与selenium一样 ;同时体系架构也与 selenium 一样;基于tcp/ip协议。appium支持多平台(Android、iOS等)、多语言(python、java等);Appium是跨平台的,可以用在OSX,Windows以及Linux桌面系统上运行。

二、安装及环境配置

        提前准备好:jdk环境、Android环境;
        安装appium,下载地址:https://github.com/appium/appium-desktop/releases
        windows 版本,傻瓜式安装。

三、连接设备

        adb devices   查询连接的设备;如果未连接,可以重启adb服务:
        adb kill -server 关闭服务; 
        adb start -server 启动服务;

        appium 连接设备: 点击搜索图标 ;三个图标分别是: start inspector session 开始检查回话、Get Raw Logs 获得原生日志、 Stop Server 停止服务

 根据连接的设备,配置连接appium的参数

        deviceName:设备名称; 值为:127.0.0.1:62001
        platformName:系统名称 ;Android or IOS
        platformVersion: 系统版本 ,指移动设备的操作系统版本,在设置里查看;   夜神模拟器查看Android版本:可在命令行窗口:adb shell getprop ro.build.version.release

        APPPackage : 应用包名,adb命令查询: pm list packages   列出所有的应用报名,pm list packages -3 指第三方; dumpsys window windows|grep -i current  ;列出当前打开的应用包名及activity  ; 查看启动的应用启动项名称:adb shell dumpsys activity top | find "ACTIVITY"
        

 前面的是包名; / 后面的是activity ,配置好,点击start session 即可链接成功。


 

 四、通过python脚本操作移动端应用

        类似于selenium 操作浏览器;导入模块 Appium-Python-Client

        初始化参数

import time
from appium import webdriver

# 初始化参数
desired_caps = {
    'platformName': 'Android',  # 安卓系统
    'platformVersion': '7.1.2',  # 手机安卓版本
    'deviceName': '127.0.0.1:62001',  # 设备名,
    'appPackage': 'com.taobao.taobao',  #包名 com.taobao.taobao
    'appActivity': 'com.taobao.browser.BrowserActivity',  # 启动的Activity名称
    'uuid':'127.0.0.1:62001'    #指定设备编号 ,adb devices输出结果
}
{
  "platformName": "Android",
  "platformVersion": "7.1.2",
  "deviceName": "127.0.0.1:62001",
  "appPackage": "com.taobao.taobao",
  "appActivity": "com.taobao.browser.BrowserActivity"
}

        然后进行 appium 连接,会自动打开淘宝APP;

        操作命令:       
        我们打开Android UI分析器。获取到了目前手机页面的信息。根据我们的目的,找到需要的组件,根据组件ID就可以在上手机上定位它,从而完成我们相要的操作。

import time
from appium import webdriver

# 初始化参数
desired_caps = {
    'platformName': 'Android',  # 安卓系统
    'platformVersion': '7.1.2',  # 手机安卓版本
    'deviceName': '127.0.0.1:62001',  # 设备名,
    'appPackage': 'com.taobao.taobao',  #包名 com.taobao.taobao
    'appActivity': 'com.taobao.browser.BrowserActivity',  # 启动的Activity名称
    'uuid':'127.0.0.1:62001'    #指定设备编号 ,adb devices输出结果
}


#连接Appium Server,初始化环境,启动app ,127.0.0.1 或 localhost 地址和端口,
#就是启动appium时界面显示的ip和端口;wd:可以理解是WebDriver的缩写;hub:是指主节点、中心节点
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

# 每个操作等待5秒
driver.implicitly_wait(5)

driver.find_element_by_id('XX').click()

driver.find_element_by_id('XX').send_keys('芒果饼干')

driver.find_element_by_id('XX').click()

print("---------------")
time.sleep(600)

driver.quit()

        至此,一个简单的python脚本就完成了;查看手机,会发现手机正在自动做打开淘宝,搜索芒果饼干的操作;若加上断言,就是一条完整的用例。

五、元素定位 与 操作

        两种方式:一是根据操作步骤,可以使用appium的Inspector获取登陆相关操作元素的属性;二是使用Android SDK里自带的工具uiautomatorviewer获取;
        
        元素定位常用接口
        格式:find_element_by_定位方式(value)    ,与selenium 定位一致;
        id定位:通过工具获取到按钮的 resource-id;
                driver.find_element_by_id('resource-id')

        class定位:通过工具获取到按钮的class
                driver.find_element_by_class_name('class')

        text定位:根据文本内容text定位;需要确认这个中文是当前页面唯一值,否则定位不到。 
                driver.find_element_by_android_uiautomator("text('百度一下')")

        xpath定位:根据路径定位;
                driver.find_element_by_xpath("xpath路径")

        css_selector定位(webview):只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致
                driver.find_element_by_css_selector()

        link_text定位(webview):只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致
                driver.find_element_by_link_text()

        name定位:只适用于webview容器中的html页面,继承自webdriver,与pc版本UI测试一致。
                driver.find_element_by_name()

        定位元素的另一种写法:find_element(by,value) ;find_element_by_方式(value)实际调用的都是find_element(by,value);要导入这个包:from selenium.webdriver.common.by import By

        如:定位id为 password 的元素
        方式一:driver.find_element_by_id("password”)
        方式二:driver.find_element(By.ID,"password")
        这种方式好处是可以直接把操作的by和value放到一个元组里,调用通用方法来传参获得元素结果。

        By的操作可以是:By.ID 相当于by_id、By.CLASS_NAME 相当于by_class_name、By.XPATH 相当于by_xpath、By.NAME 相当于by_name、By.TAG_NAME 相当于by_tag_name、By.CSS_SELECTOR 相当于by_css_selector、By.LINK_TEXT 相当于by_link_text
 

          元素操作方法:

                找到元素后可以对元素进行的操作,如点击、输入文本等;
        click() :点击操作
        driver.find_element_by_id("su").click()

        clear():清空输入框内容
        driver.find_element_by_id("kw").clear()

        send(xx):输入框内输入内容        
        driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").send_keys("test content")

        text :获得元素的text内容
        print(driver.find_element_by_xpath(" //xxxxx").text)

        


api参考文档:

猜你喜欢

转载自blog.csdn.net/guanrongl/article/details/125009945