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

摘要:
#coding:utf-8fromappiumimportwebdriverfromtimeimportsleep#初始化desired_caps={}#使用哪种移动平台desired_caps['platformName']='Android'#Android版本desired_caps['platformVersion']='5.1.1'#使用adbdevices-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.Remotedriver.implicitly_wait#driver.find_element_by_id.click()search_button=driver.find_element_by_xpathsearch_button.click()#退出driverdriver.quit()然后我们先将注释的代码取消注释,再运行程序。等待元素加载指定的时长,超出时长抛出TimeoutException异常。wait.until:参数为lambda查找元素表达式。
1. 元素等待

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

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

什么叫元素等待呢?

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

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

1.1 隐式等待

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

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

实例:

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

#coding:utf-8
from appium importwebdriver
from time importsleep

#初始化
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()

Appium(八):Appium API(二) 元素等待、元素操作第1张

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

Appium(八):Appium API(二) 元素等待、元素操作第2张

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

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 importwebdriver
from time importsleep
from selenium.webdriver.support.wait importWebDriverWait

#初始化
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 importwebdriver
from time importsleep

#初始化
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()

Appium(八):Appium API(二) 元素等待、元素操作第3张

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 importwebdriver
from time importsleep

#初始化
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 intitles:
    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()

Appium(八):Appium API(二) 元素等待、元素操作第4张

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

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

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

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

免责声明:文章转载自《Appium(八):Appium API(二) 元素等待、元素操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇财务人员如何学习SAPOracle11g温习-第一章 2、ORACLE 物理结构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Selenium 3 + BrowserMobProxy 2.1.4 模拟浏览器访问 (含趟坑)

背景 Selenium 是一个Web自动化测试的组件,可基于WebDriver去控制弹出浏览器去做一系列Web点击或行为测试(当然也可以去做一些邪恶的事。。),减少重复人工网页测试的开销。BrowserMobProxy相当于一层代理,它配合Selenium使用可以在Selenium控制浏览器访问之前在代理层拦截做出一些记录(har)、修改等。 一般来说,直...

Selenium操作示例——鼠标悬停显示二级菜单,再点击二级菜单或下拉列表

这两天在玩python中selenium,遇到一个问题,就是鼠标移动到页面中某按钮或菜单,自动弹出二级菜单或下拉菜单,再自动点击其中的二级菜单或下拉列表。 首先,手工操作:打开母校的主页 http://www.uestc.edu.cn/,将鼠标移动到“学校概括”,自动弹出二级菜单,手工点击其中的“学校简介”,弹出学校的简介。 如何在python中使用se...

Javascript原生之用cssText批量修改样式

一般情况下我们用js设置元素对象的样式会使用这样的形式: var element= document.getElementById(“id”);element.style.width=”20px”;element.style.height=”20px”;element.style.border=”solid 1px red”; 样式一多,代码就很多;而且通...

ggplot2 theme相关设置—矩形设置(rect)

在主题设置中,rect设置主要用于设置图例和面板 element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL, color = NULL) 参数也相对简单,基本上是常用的参数,从设置来看,灵活性还是很高的。 下面看些例子: library(ggplot2) p<-ggpl...

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作

1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了。 1.1 swipe滑动事件 从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。 方法: driver.swipe(start_x, start_y, end_x, end_y, duratio...

你知道element中el-table的列名中不能含有" . "吗?

[本文出自天外归云的博客园] Vue+element比较流行,但是element有个坑,就是element的表格列名中不能含有点儿" . ",否则数据都显示不出来。 在element里表格是这样写的: <template> <el-table :data="rows"> <el-table-column v-f...