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 才能支持
Appium(八):Appium API(二) 元素等待、元素操作的更多相关文章
- Python+Selenium笔记(十):元素等待机制
(一) 前言 突然的资源受限或网络延迟,可能导致找不到目标元素,这时测试报告会显示测试失败.这时需要一种延时机制,来使脚本的运行速度与程序的响应速度相匹配,WebDriver为这种情况提供了隐式等待 ...
- Appium+python自动化(二十四)- 白素贞千年等一回许仙 - 元素等待(超详解)
简介 许仙小时候最喜欢吃又甜又软的汤圆了,一次一颗汤圆落入西湖,被一条小白蛇衔走了.十几年后,一位身着白衣.有青衣丫鬟相伴的美丽女子与许仙相识了,她叫白娘子.白娘子聪明又善良,两个人很快走到了一起.靠 ...
- Python+Appium自动化测试(6)-元素等待方法与重新封装元素定位方法
在appium自动化测试脚本运行的过程中,因为网络不稳定.测试机或模拟器卡顿等原因,有时候会出现页面元素加载超时元素定位失败的情况,但实际这又不是bug,只是元素加载较慢,这个时候我们就会使用元素等待 ...
- Appium脚本(5) 元素等待方法示例
思考 在自动化过程中,元素出现受网络环境,设备性能等多种因素影响.因此元素加载的时间可能不一致,从而会导致元素无法定位超时报错,但是实际上元素是正常加载了的,只是出现时间晚一点而已.那么如何解决这个问 ...
- appium等待元素
1.sleep()方法 Thread.sleep(60000)强制等待60s 2.隐式等待implicitlyWait() driver.manage().timeouts().implicitlyW ...
- appium 元素定位与操作:
一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tools目录下 monitor:Android SDK自带的一个工具,在tools目录下 Appium I ...
- Appium+Python之元素定位和操作
一.常用识别元素的工具 uiautomatorviewer:Android SDK自带的一个工具,在tools目录下 二.元素定位 1.格式:find_element_by_定位方式(va ...
- 『与善仁』Appium基础 — 22、获取元素信息的操作(一)
目录 1.获取元素文本内容 (1)text()方法 (2)get_attribute()方法 (3)综合练习 2.获取元素在屏幕上的坐标 1.获取元素文本内容 (1)text()方法 业务场景: 进入 ...
- appium通过同级别(兄弟关系)元素找到元素
在做appium测试用例的时候,要获取金额值,用uiautomatorviewer查看该元素,该元素没有特别明显的个性特点,唯一有特点的定位是有content-desc值,但是该值是变动的,所以无法通 ...
随机推荐
- 在Spring Boot中添加全局异常捕捉提示
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...
- AutoCad 二次开发 jig操作之标注跟随线移动
AutoCad 二次开发 jig操作之标注跟随线移动 在autocad当中,我认为的jig操作的意思就是即时绘图的意思,它能够实时的显示出当前的操作,以便我们直观的感受到当前的绘图操作是什么样子会有什 ...
- Android 寻找Drawable资源的流程
寻找设备对应Drawable资源时,会先在设备对象dpi的drawable文件夹下寻找,如果没找到,会上溯到更高一级dpi文件夹下寻找,上溯最高两级.如果还是没有找到,会寻找noDensity文件夹下 ...
- nginx代理跨域,根据路径参数改变目标服务器地址
我们都知道nginx是可以做跨域代理的: location ^~ /visited-path/ { proxy_pass http://another-domain/; } 举个例子:假如我们的代理服 ...
- Linux下设置mysql不区分大小写
一.通过命令查看mysql是否是区分大小写的 show variables like '%case_table%'; lower_case_table_names=1(说明是不区分大小写的) lowe ...
- 了解 MongoDB 看这一篇就够了【华为云分享】
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
- 转:Java transient关键字使用小记
哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...
- ios-AutoLayout(自动布局代码控制)简单总结
转自:http://blog.sina.com.cn/s/blog_7c336a830102vaht.html 原理:IOS6.0 之后,苹果优化了UI界面的布局方式,提出了自动布局的概念,和之前的a ...
- ASE19团队项目beta阶段Backend组 scrum6 记录
本次会议于12月12日,19:30在微软北京西二号楼sky garden召开,持续10分钟. 与会人员:Zhikai Chen, Lihao Ran, Xin Kang 请假人员:Hao Wang 每 ...
- [TimLinux] docker CentOS7 入门——容器(1)
1. 编写Dockerfile # 将官方 Python 运行时用作父镜像 FROM python: # 将工作目录设置为 /app WORKDIR /app # 将当前目录内容复制到位于 /app ...