• Appium(八):Appium API(二) 元素等待、元素操作


    1. 元素等待

    我们在使用脚本的时候,可能会由于网络、服务器处理、电脑等原因,我们想要找的元素没有加载出来,这个时候如果直接定位就可能会报错。

    这个时候我们就可以设置元素等待了。

    什么叫元素等待呢?

    就是WebDriver定位页面元素时如果没有找到,就会在指定时间内一直等待的过程。

    元素等待一共分为两种类型:显示等待和隐式等待。

    1.1 隐式等待

    隐式等待是将所有定位元素的超时时间设置为同一个值。

    在获取driver对象后,使用driver调用implicitly_wait方法即可。

    实例:

    在5秒钟内,《设置》中的“返回”按钮,如果找到则点击,如果找不到则观察对应的错误信息。

    # coding:utf-8
    from appium import webdriver
    from time import sleep
    
    # 初始化
    desired_caps = {}
    # 使用哪种移动平台
    desired_caps['platformName'] = 'Android'
    # Android版本
    desired_caps['platformVersion'] = '5.1.1'
    #使用adb devices -l 查询,当有多台设备时,需要声明
    desired_caps['deviceName'] = '127.0.0.1:62001'
    #包名
    desired_caps['appPackage'] = 'com.android.settings'
    #界面名
    desired_caps['appActivity'] = '.Settings'
    #不清除数据
    desired_caps['noReset'] = 'True'
    
    # 启动服务
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    driver.implicitly_wait(5)
    
    # driver.find_element_by_id('com.android.settings:id/search').click()
    search_button = driver.find_element_by_xpath("//*[contains(@content-desc,'收起')]")
    search_button.click()
    
    #退出driver
    driver.quit()

    然后我们先将注释的代码取消注释,再运行程序。

    我们可以看到,如果元素找不到,就会在五秒之后报错。

    1.2 显示等待

    显示等待就是为需要等待的元素分别设置不同的值。

    等待元素加载指定的时长,超出时长抛出TimeoutException异常。

    方法:

    WebDriverWait(driver, timeout, poll_frequency=0.5):参数分别是驱动对象、超时时长、检测间隔时间,检测间隔时间默认是0.5秒。

    wait.until(method):参数为lambda查找元素表达式。

    需要导入的文件:

    from selenium.webdriver.support.wait import WebDriverWait

    实例:

    在5秒钟内,每1秒在《设置》中的“返回”按钮,如果找到则点击,如果找不到则观察对应错误信息。

    # coding:utf-8
    from appium import webdriver
    from time import sleep
    from selenium.webdriver.support.wait import WebDriverWait
    
    # 初始化
    desired_caps = {}
    # 使用哪种移动平台
    desired_caps['platformName'] = 'Android'
    # Android版本
    desired_caps['platformVersion'] = '5.1.1'
    #使用adb devices -l 查询,当有多台设备时,需要声明
    desired_caps['deviceName'] = '127.0.0.1:62001'
    #包名
    desired_caps['appPackage'] = 'com.android.settings'
    #界面名
    desired_caps['appActivity'] = '.Settings'
    #不清除数据
    desired_caps['noReset'] = 'True'
    
    # 启动服务
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    driver.implicitly_wait(5)
    
    driver.find_element_by_id('com.android.settings:id/search').click()
    #第一种
    wait = WebDriverWait(driver, 25, 5)
    back_button = wait.until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']"))
    back_button.click()
    #第二种
    # back_button = WebDriverWait(driver, 5, 1).until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']"))
    # back_button.click()
    #第三种
    # WebDriverWait(driver, 5, 1).until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']")).click()
    
    #退出driver
    driver.quit()

    1.3 隐式等待和显示等待的选择

    作用域:

    显式等待为单个元素有效,隐式为全局元素

    方法:

    显式等待方法封装在WebDriverWait类中,而隐式等待则直接通过driver实例化对象调用

    还有就是sleep的问题,sleep是一个固定的时间,可以使用但是不推荐,我们在正式的使用中,会将sleep方法和其他方法封装成函数。

    2. 元素操作

    2.1 点击元素 

    在需要点击某个按钮的时候使用。 

    前面已经使用过很多次了,这里就简单过一下了。

    方法:

    element.click() :对element按钮进行点击操作

    2.2 输入和清空输入框内容

    需要对输入框进行输入或清空的时候使用。

    这个前面也使用过了。

    方法:

    element.send_keys(value):对element输入框进行输入操作

    element.clear(): 对element输入框进行清空操作

    需要注意的是默认输入中文无效,但是不会报错,需要在“启动代码”中增加两个参数。

    desired_caps['unicodeKeyboard'] = True

    desired_caps['resetKeyboard'] = True 

    2.3 获取元素的文本内容

    需要获取按钮、文本框、输入框等控件的文本内容时使用。

    这个方法在前面也有使用。

    方法:

     element.text:获取element控件的文本内容

    2.4 获取元素的位置和大小

    需要获取元素的位置和大小的时候使用。

    方法:

    element.location:获取element的位置

    element.size:获取element的大小

    实例:

    查看《设置》中“放大镜”的位置和大小。

    # coding:utf-8
    from appium import webdriver
    from time import sleep
    
    # 初始化
    desired_caps = {}
    # 使用哪种移动平台
    desired_caps['platformName'] = 'Android'
    # Android版本
    desired_caps['platformVersion'] = '5.1.1'
    #使用adb devices -l 查询,当有多台设备时,需要声明
    desired_caps['deviceName'] = '127.0.0.1:62001'
    #包名
    desired_caps['appPackage'] = 'com.android.settings'
    #界面名
    desired_caps['appActivity'] = '.Settings'
    
    # 启动服务
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    search_button = driver.find_element_by_id("com.android.settings:id/search")
    print(search_button.location)
    print(search_button.size)
    
    #退出driver
    driver.quit()

    2.5 获取元素的属性值

    根据特征定位到元素后,使元素的属性名获取对应的属性值。

    方法:

    element.get_attribute(value):获取元素的属性,传入值为想要获取的属性名。 

    实例:

    获得《设置》中所有resource-id为“com.android.settings:id/title”的元素的enabled、text、contenet-desc、resource-id、class的属性值。

    # coding:utf-8
    from appium import webdriver
    from time import sleep
    
    # 初始化
    desired_caps = {}
    # 使用哪种移动平台
    desired_caps['platformName'] = 'Android'
    # Android版本
    desired_caps['platformVersion'] = '5.1.1'
    #使用adb devices -l 查询,当有多台设备时,需要声明
    desired_caps['deviceName'] = '127.0.0.1:62001'
    #包名
    desired_caps['appPackage'] = 'com.android.settings'
    #界面名
    desired_caps['appActivity'] = '.Settings'
    
    # 启动服务
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    titles = driver.find_elements_by_id("com.android.settings:id/title")
    for title in titles:
        print(title.get_attribute("enabled"))
        print(title.get_attribute("text"))
        print(title.get_attribute("name"))
        print(title.get_attribute("resourceId"))
        print(title.get_attribute("ClassName"))
    
    #退出driver
    driver.quit()

    value='text' 返回text的属性值

    value='name' 返回content-desc / text属性值 

    value='className' 返回 class属性值,只有 API=>18 才能支持

    value='resourceId' 返回 resource-id属性值,只有 API=>18 才能支持 

  • 相关阅读:
    Android:实现手势滑动的事件处理方法
    Android开发——跟随手指的小球实现
    android 关于setWidth()和setHeight()没反应的问题
    Android 设置 横屏 竖屏
    Android给TextView设置透明背景、圆角边框
    android 为TextView添加边框
    C++实现RTMP协议发送H.264编码及AAC编码的音视频
    视频编码器
    HTTP Live Streaming直播(iOS直播)技术分析与实现
    nginx上搭建HLS流媒体服务器
  • 原文地址:https://www.cnblogs.com/liuhui0308/p/12030509.html
Copyright © 2020-2023  润新知