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

1. 元素等待

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

这个时候咱们就能够设置元素等待了。web

什么叫元素等待呢?服务器

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

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

1.1 隐式等待

隐式等待是将全部定位元素的超时时间设置为同一个值。函数

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

实例:spa

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

# 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()

 

而后咱们先将注释的代码取消注释,再运行程序。code

咱们能够看到,若是元素找不到,就会在五秒以后报错。

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 才能支持 

相关文章
相关标签/搜索