元素操作
Posted xiaoxiangstudy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了元素操作相关的知识,希望对你有一定的参考价值。
元素定位操作
应用场景
计算机不像人一样“聪明”,我们需要通过元素定位来获取元素,才能让计算机帮我们“操作“这个元素。
步骤
1.打开uiautomatorviewer工具或者命令行输入uiautomatorviewer
2.打开模拟器或真机
3.通过uiautomatorviewer工具获取想要进行操作的元素的Node Detail 信息
4.通过元素定位API进行定位
5.对元素进行相关操作
注意点
元素的定位基于当前屏幕范围内展示的可见元素。
定位一个元素
应用场景
想要对按钮进行点击,想要对输入框进行输入,想要获取文本框的内容,定位元素是自动化操作必须要使用的方法。只有获取元素之后,才能对这个元素进行操作。
注意点
#find_element_by_*方法被弃用
#导入模块
from selenium.webdriver.common.by import By
方法名
#通过id定位一个元素
#参数:
#id_value:元素的resource-id属性值
#返回值
#定位到的单个元素
driver.find_element(By.ID,id_value)
#通过class_name定位一个元素
#参数
# class_value:元素的class属性值
#返回值:
#定位到的单个元素
driver.find_element(By.CLASS_NAME,class_value)
#通过xpath定位一个元素
#参数:
#xpath_value:定位元素的xpath表达式
#返回值:
#定位到的单个元素
driver.find_element(By.XPATH,xpath_value)
Demo
#点击搜索
driver.find_element(By.ID,"com.android.settings:id/search").click()
#输入hello
driver.find_element(By.CLASS_NAME,"android.widget.EditText").send_keys("hello")
#点击返回
driver.find_element(By.XPATH,"//*[@content-desc=\'收起\']").click()
定位一组元素
#获取resource-id为"android:id/title"的元素,并打印出文字内容
titles = driver.find_elements(By.ID, "android:id/title")
for title in titles:
print(title.text)
#获取class为"android.widget.TextView"的元素,并打印出文字内容
text_views = driver.find_elements(By.CLASS_NAME,"android.widget.TextView")
for text_view in text_views:
print(text_view.text)
#通过xpath形式获取包含‘设’的元素,并打印出文字内容
eles = driver.find_elements(By.XPATH,"//*[contains(@text,\'设\')]")
for element in eles:
print(element.text)
注意点
-
如果通过一组的方式进行定位,获取的返回值不再是一个元素。而是一个列表,列表中装着所有符合这个特征的元素。
-
如果find_element方法,传入了一个没有的条件,会报错,NoSuchElementException
-
如果find_elements方法,传入了一个没有的条件,不会报错,返回一个空列表
元素等待
应用场景
可能由于一些原因,我们想找的元素并没有立刻出来,此时如果直接定位可能会报错
原因:
-
由于网络速度原因
-
服务器处理请求原因
-
电脑配置原因
概念
WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程
元素等待一共分为两种类型
-
隐式等持
-
显式等待
隐式等待
应用场景
针对所有定位元素的超时时间设置为同一个值的时候
概念
等待元素加载指定的时长,超出时长抛出NoSuchElementException异常
步骤
- 在获取driver対象后,使用driver调用implicitly_wait方法即可
- 设置超时时间
作用
- 在设置了超时时间之后,后续所有的定位元素的方法都会在这个时间内等待元素的出现
- 如果出现了,直接进行后续操作
- 如果没有出现,报错,NoSuchElementException
Demo
driver.implicitly_wait(10)
print("---start")
driver.find_element(By.XPATH,"//*[@content-desc=\'收起\']").click()
print("---stop")
显式等待
应用场景
针对所有定位元素的超时时间设置为不同的值的时候
概念
等待元素加载指定的时长,超出时长抛出TimeoutException异常
步骤
-
导包from selenium.webdriver.support.wait import WebDriverWait
-
创建WebDriverWait 对象
-
调用WebDriverWait对象的until方法
作用
- 在设置了显示等待之后,可以等待一个超时时间,在这个超时时间之内进行查找,默认每0.5秒找一次
- 0.5秒的频率是可以设置的
- 一但找到这个元素,直接进行后续操作
- 如果没有找到,报错,TimeOutException
示例
在5秒钟内,每1秒在《设置》程序中的“返回”按钮,如果找到则点击。如果找不到则观察对应错误信息。
Demo
WebDriverWait(driver,5,1).until(lambda x:x.find_element(By.XPATH,"//*[@content-desc=\'收起\']")).click()
隐式等待和显式等待的选择
作用域
- 显式等待为单个元素有效
- 隐式为全局元素
方法
- 显式等待方法封装在WebDriverWait类中
- 隐式等待则直接通过driver实例化对象调用
关于sleep的形式
-
sleep是固定死一个时间,不是不行,是不推荐。
-
元素等待可以让元素出来的第一时间进行操作。sleep可能造成不必要的浪费。
元素操作API
点击元素
应用场景
需要点击某个按钮的时候使用
方法名
#对element按钮进行点击操作
element.click()
示例
- 打开《设置》
- 点击放大镜按钮
核心代码
driver.find_element(By.ID,"com.android.settings:id/search").click()
输入和清空输入框内容
应用场景
需要对输入框进行输入或清空的时候使用
方法名
# 对element输入框进行输入操作
#参数
# value:输入的内容
element.send_keys(value)
#对element输入框进行清空操作
element.clear()
示例
1.打开《设置》
2.点击“放大镜”
3.输入"hello"
4.暂停2秒
5.清空所有文本内容
6.暂停5秒
7.输入“你好”
核心代码
try:
# 连接到设备
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities)
# 程序等待
sleep(2)
# 2.点击“放大镜”
driver.find_element(By.ID,"com.android.settings:id/search").click()
# 3.输入"hello"
driver.find_element(By.ID,"android:id/search_src_text").send_keys("hello")
# 4.暂停2秒
sleep(2)
# 5.清空所有文本内容
driver.find_element(By.ID,"android:id/search_src_text").clear()
# 6.暂停5秒
sleep(5)
# 7.输入“你好”
driver.find_element(By.ID,"android:id/search_src_text").send_keys("你好")
except Exception as e:
print("出现异常,错误信息为:".format(e))
注意点
输入中文需要加入两个参数
"unicodeKeyboard": True,
"resetKeyboard": True
获取元素的文本内容
应用场景
需要获取按钮、文本框、输入框等控件的文本内容时使用
属性名
#获取element控件的文本内容
#返回值:
#控件的文本内容
element.text
示例
1.打开《设置》
2.获取所有resource-id为“android:id/title"的元素,井打印其文字内容
核心代码
eles = driver.find_elements(By.ID,\'android:id/title\')
for i in eles:
print(i.text)
获取元素的位置和大小
应用场景
需要获取元素的位置和大小的时候使用
属性名
#获取element的位置
#返回值:
#字典,x为元素的x坐标,y为元素的y坐标
element.location
#获取element的大小
#返回值:
#字典,width为宽度,height为高度
element.size
示例
1.打开《设置》
2.获取“放大镜”的位置和大小
核心代码
search_button = driver.find_element(By.ID,"com.android.settings:id/search")
print(search_button.location)
print(search_button.location["x"])
print(search_button.location["y"])
print(search_button.size)
print(search_button.size["width"])
print(search_button.size["height"])
获取元素的属性值
应用场景
根据特征定位到元素,使元素的属性名获取对应的属性值
方法名
#对element进行点击操作
#参数:
# value:要获取的属性名
#返回值:
#根据属性名得到的属性值
element.get_attribute(value)
#value:元素的属性
示例
1.打开《设置》
2.获取所有resource-id为"android:id/title”的元素
3.使用get_attribute获取这些元素的enabled、text、content-desc、resource-id、class的属性值
核心代码
eles = driver.find_elements(By.ID, \'android:id/title\')
for i in eles:
print(i.get_attribute("enabled"))
print(i.get_attribute("clickable"))
print(i.get_attribute("text"))
#获取resource-id的属性值
print(i.get_attribute("resourceId"))
#获取class的属性值
print(i.get_attribute("className"))
#获取content-desc的属性值
print(i.get_attribute("name"))
注意点
-
value=\'text\'返回text的属性值
-
value=\'name\'返回content-desc / text属性值
-
value=\'className\'返回class属性值,只有APl=>18才能支持
-
value=\'resourceId\'返回resource-id属性值,只有APl=>18才能支持
总结
- 点击事件
- 关键属性:click
- 输入事件
- 关键属性:send_keys
- 获取元素的文本内容
- 关键属性:text
- 清空输入内容
- 关键属性:clear
- 获取元素位置
- 关键属性:location
- 获取元素大小
- 关键属性:size
- 获取元素的属性值
- 关键属性:get_attribute
python selenium 元素操作之键盘操作
上节介绍了模拟鼠标对元素的操作,本节主要介绍键盘对元素的操作,实际过程中鼠标对元素的操作比键盘对元素的操作更经常使用,但是键盘对元素的操作也很重要,本节主要介绍一下键盘对元素的操作。
selenium 提供了比较完整的键盘操作,在使用的模拟键盘操作之前需要我们导入from selenium.webdriver.common.keys import Keys即可,然后就可以来模拟键盘操作。
#导入Keys 模块,然后我们看看Keys 模块定义了那些按键
from selenium.webdriver.common.keys import Keys
导入模块以后,我们可以看看具体的定义按键内容,我已经把经常使用的按键注释标记。
NULL = ‘\\ue000‘ CANCEL = ‘\\ue001‘ # ^break HELP = ‘\\ue002‘ BACKSPACE = ‘\\ue003‘ BACK_SPACE = BACKSPACE #删除键 TAB = ‘\\ue004‘ #TAB键 CLEAR = ‘\\ue005‘ RETURN = ‘\\ue006‘ ENTER = ‘\\ue007‘ #回车键 SHIFT = ‘\\ue008‘ #Shift键 LEFT_SHIFT = SHIFT CONTROL = ‘\\ue009‘ LEFT_CONTROL = CONTROL #Ctrl 键 ALT = ‘\\ue00a‘ #Alt 键 LEFT_ALT = ALT PAUSE = ‘\\ue00b‘ ESCAPE = ‘\\ue00c‘ #ECS键 SPACE = ‘\\ue00d‘ #空格键 PAGE_UP = ‘\\ue00e‘ #PgUp 键 PAGE_DOWN = ‘\\ue00f‘ #PgDwon 键 END = ‘\\ue010‘ #END 键 HOME = ‘\\ue011‘ #HOME 键 LEFT = ‘\\ue012‘ #左键 ARROW_LEFT = LEFT UP = ‘\\ue013‘ #上键 ARROW_UP = UP RIGHT = ‘\\ue014‘ ARROW_RIGHT = RIGHT #右键 DOWN = ‘\\ue015‘ #下键 ARROW_DOWN = DOWN INSERT = ‘\\ue016‘ #insert键 DELETE = ‘\\ue017‘ #del键
SEMICOLON = ‘\\ue018‘ #‘;‘键 EQUALS = ‘\\ue019‘ #‘=‘键 #数字键盘 NUMPAD0 = ‘\\ue01a‘ # number pad keys NUMPAD1 = ‘\\ue01b‘ NUMPAD2 = ‘\\ue01c‘ NUMPAD3 = ‘\\ue01d‘ NUMPAD4 = ‘\\ue01e‘ NUMPAD5 = ‘\\ue01f‘ NUMPAD6 = ‘\\ue020‘ NUMPAD7 = ‘\\ue021‘ NUMPAD8 = ‘\\ue022‘ NUMPAD9 = ‘\\ue023‘ MULTIPLY = ‘\\ue024‘ # ‘*‘ 键 ADD = ‘\\ue025‘ # ‘+‘ 键 SEPARATOR = ‘\\ue026‘ #‘,‘键 SUBTRACT = ‘\\ue027‘ # ‘-‘ 键 DECIMAL = ‘\\ue028‘ # ‘.‘键 DIVIDE = ‘\\ue029‘ #‘/‘键 F1 = ‘\\ue031‘ # function keys F2 = ‘\\ue032‘ F3 = ‘\\ue033‘ F4 = ‘\\ue034‘ F5 = ‘\\ue035‘ F6 = ‘\\ue036‘ F7 = ‘\\ue037‘ F8 = ‘\\ue038‘ F9 = ‘\\ue039‘ F10 = ‘\\ue03a‘ F11 = ‘\\ue03b‘ F12 = ‘\\ue03c‘ META = ‘\\ue03d‘ COMMAND = ‘\\ue03d‘
看到模块中包含了很多的按键但是真正实际使用的按键不多,所以我下面对按键的操作将一些方法介绍一下,就不会对所有的按键详细介绍。
1.首先我们了解下组合键,什么是组合键,比如我们经常使用的Ctrl + A ,Ctrl + C 等都是组合键。我们先看个例子
在使用按键操作的时候我们需要借助一下send_keys()来模拟操作,Keys.CONTROL 也就是我们键盘上的Ctrl键,下面是几个常用的组合键。
send_keys(Keys.CONTROL,‘a‘) #全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c‘) #复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x‘) #剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v‘) #粘贴(Ctrl+V)
我们下面使用Ctrl + A 来编写一个实例,看一下组合键的使用。
#-*- coding:utf-8 -*- from selenium.webdriver.common.keys import Keys from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_id(‘kw‘).send_keys(‘AAAAAAAAAAAA‘) driver.find_element_by_id("kw").send_keys(Keys.CONTROL,‘a‘) #注意这里组合键的输入。 time.sleep(10) driver.quit()
2.下面常用的键,这些常用键主要是非组合键,直接输入即可。
- 回车键 Keys.ENTER
- 删除键 Keys.BACK_SPACE
- 空格键 Keys.SPACE
- 制表键 Keys.TAB
- 回退键 Keys.ESCAPE
- 刷新键 Keys.F5
下面我们选择一个常用的键,来编写一个例子,使用回车键来代替鼠标的click()键
#-*- coding:utf-8 -*- from selenium.webdriver.common.keys import Keys from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driver.get("http://cn.bing.com/") driver.find_element_by_id(‘sb_form_q‘).send_keys(‘selenium‘) driver.find_element_by_id("sb_form_go").send_keys(Keys.ENTER) #通过回车键来代替鼠标的左键 driver.quit()
这里我们可以看到跟鼠标的模拟效果是一样。
上面的两个例子说明了使用组合键和单个按键来操作元素,因为按键的使用起来比较简单,主要是认识每个按键代表的意思,这样我们就可以顺利的使用按键。
以上是关于元素操作的主要内容,如果未能解决你的问题,请参考以下文章