zoukankan      html  css  js  c++  java
  • 移动端测试——APP元素定位操作 (3)

    一、appium基础API讲解

    1.1 APP元素定位操作

    建议:

    • 使用显示等待
    • 能用id、class定位就不用xpath定位
    • 只要看的见的,用xpath的text就是万能的
    • 手工测试主要通过可见按钮操作,而自动化是通过元素进行交互操作
    • 元素的基本定位基于当前屏幕范围内展示的可见元素
    • 前置代码
    # 导入driver对象
    from appium import webdriver
    
    import time
    
    # server 启动参数
    desired_caps = {}
    # 设备信息(系统、版本、设备号)
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '9'
    desired_caps['deviceName'] = '192.168.72.103:5555'
    # app信息(包名、启动名)
    desired_caps['appPackage'] = 'com.android.settings'
    desired_caps['appActivity'] = '.Settings'
    
    # 声明driver对象
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    
    time.sleep(5)
    
    # 关闭驱动对象
    driver.quit()
    

    1.1.1 Appium常用元素定位方式

    名称
    id id属性值
    class class属性值
    xpath xpath表达式
    • 定位一组元素,注意element -> elements

    应用场景为元素值重复,无法通过元素属性直接定位到某个元素,只能通过elements方式来选择,返回一个定位对象的列表

    1-1. 通过id定位

    方法:id_value:为元素的id属性值
    find_element_by_id(id_value)

    eg(业务场景):

    进入设置页面后,通过id定位方式点击搜索按钮

    driver.find_element_by_id("com.android.settings:id/search").click()
    driver.quit()
    

    1-2. 通过id定位一组元素

    方法:id_value:为元素的id属性值
    find_elements_by_id(id_value)

    eg:

    查看返回值类型

    title = driver.find_elements_by_id("android:id/title")
    print(type(title))
    print(title)
    

    查看一组元素的text

    title = driver.find_elements_by_id("android:id/title")
    for i in title:
        print(i.text)
    

    点击"电池"

    title = driver.find_elements_by_id("android:id/title")
        for i in title:
            if i.text == "电池":
                i.click()
    

    点击"电池"(改进)

    title = driver.find_elements_by_id("android:id/title")
        for i in title:
            if i.text == "电池":
                i.click()
                time.sleep(2)
                break
    

    eg(业务场景):

    进入设置页面后,点击WLAN菜单栏(id定位对象列表中第1个)

     # 定位到一组元素
    title = driver.find_elements_by_id("com.android.settings:id/title")
    # 打印title类型,预期为list
    print(type(title))
    # 取title返回列表中的第一个定位对象,执行点击操作
    title[0].click()
    

    2-1. 通过class定位

    方法:class_value:为元素的class属性值
    find_element_by_class_name(class_value)

    eg(业务场景):

    进入设置页面后,点击搜索按钮,通过class定位方式点击输入框的返回按钮

     # id 点击搜索按钮
    driver.find_element_by_id("com.android.settings:id/search").click()
    # class 点击输入框返回按钮
    driver.find_element_by_class_name('android.widget.ImageButton').click()
    driver.quit()
    

    2-2. 通过class定位一组元素

    方法:class_value:为元素的class属性值
    find_elements_by_class_name(class_value)

    点击"电池"

    title = driver.find_elements_by_class_name("android.widget.TextView")
        for i in title:
            print(i.text)
            if i.text == "电池":
                i.click()
                time.sleep(2)
                break
    

    点击"电池"(改进)

    title = driver.find_elements_by_class_name("android.widget.TextView")
        for i in title:
            print(i.text)
            if "电池" in i.text:
                i.click()
                time.sleep(2)
                break
    

    eg(业务场景):

    进入设置页面后,点击WLAN菜单栏(class定位对象列表中第3个)

     # 定位到一组元素
    title = driver.find_elements_by_class_name("android.widget.TextView")
    # 打印title类型,预期为list
    print(type(title))
    # 取title返回列表中的第一个定位对象,执行点击操作
    title[3].click()
    

    3-1. 通过xpath定位

    方法:xpath_value:为可以定位到元素的xpath语句
    find_element_by_xpath(xpath_value)

    • android端xptah常用属性定位
    属性定位 说明
    id //*[contains(@resource-id,'com.android.settings:id/search')]
    class //*[contains(@class,'android.widget.ImageButton')]
    text //*[contains(@text,'WLA')]

    模糊定位:
    contains(@key,value):(value可以是部分值)

    定位父节点:
    /..

    父节点应用说明:

    • 可以通过用元素的父节点的坐标信息进行比较,判断元素的相对位置

    eg:

    eg:
    //*[contains(@resource-id,'com.android.settings:id/search')]/..

    eg(业务场景):

    进入设置页面后,点击WLAN菜单栏

    # xpath 点击WLAN按钮
    driver.find_element_by_xpath("//*[contains(@text,'WLA')]").click()
    

    3-2. 通过xpath定位一组元素

    方法:xpath_value:为可以定位到元素的xpath语句
    find_elements_by_xpath(xpath_value)

    点击"电池"

    xpath_value = "//*[contains(@class,'android.widget.TextView')]"
        title = driver.find_elements_by_xpath(xpath_value)
        for i in title:
            print(i.text)
            if "电池" in i.text:
                i.click()
                time.sleep(2)
                break
    

    eg(业务场景):

    进入设置页面后,点击WLAN菜单栏(xpath中class属性定位对象列表中第3个)

     # 定位到一组元素
    title = driver.find_elements_by_xpath("//*[contains(@class,'widget.TextView')]")
    # 打印title类型,预期为list
    print(type(title))
    # 取title返回列表中的第一个定位对象,执行点击操作
    title[3].click()
    

    4. WebDriverWait 显示等待操作

    在一个超时时间范围内,每隔一段时间去搜索一次元素是否存在,如果存在返回定位对象,如果不存在直到超时时间到达,报超时异常错误

    方法:WebDriverWait(driver, timeout, poll_frequency).until(method)

    参数 说明
    driver 手机驱动对象
    timeout 搜索超时时间
    poll_frequency 每次搜索间隔时间,默认时间为0.5s
    method 定位方法(匿名函数)
    • 匿名函数:
      lambda x: x

    等价于python函数:

    def test(x):
    return x
    

    eg:

    WebDriverWait(driver, timeout, poll_frequency).until(lambda x: x.find_elements_by_id(id_value))

    解释:
    ➢ x传入值为:driver,所以才可以使用定位方法

    函数运行过程:
    ➢ 实例化WebDriverWait类,传入driver对象,之后driver对象被赋值给WebDriverWait的一个类变量:self._driver
    ➢ until为WebDriverWait类的方法,until传入method方法(即匿名函数),之后method方法会被传入self._driver
    ➢ 搜索到元素后until返回定位对象,没有搜索到函数until返回超时异常错误

    eg(业务场景):

    进入设置页面后,通过ID定位方式点击搜索按钮

    from selenium.webdriver.support.wait import WebDriverWait # 导入WebDriverWait类
    # 超时时间为30s,每隔1秒搜索一次元素是否存在,如果元素存在返回定位对象并退出
    search_button = WebDriverWait(driver, 3, 0.5).until(lambda x: x.find_elements_by_id(com.android.settings:id/search))
    search_button.click()
    driver.quit()
    

    其他:

    • 打印时间
      print(time.strftime("%H:%M:%S", time.localtime()))

    1.1.2 综合应用

    • 关闭移动数据

    更新中......


  • 相关阅读:
    C#版排序之交换排序
    AndroidSQLite(一)
    oracle日期处理完整版
    B+树查询上下级(sql实现)
    PHP写的几个基础算法 (转载)
    FLEX程序设计正则表达式
    SQL*PLUS命令的使用大全
    oracle常用sql语句语法
    PHP.ini配置文件(转载)
    string扩展实现强悍的.Net不可逆加密方法 (转载)
  • 原文地址:https://www.cnblogs.com/ricsy/p/11581662.html
Copyright © 2011-2022 走看看