首页 > 其他分享 >元素操作

元素操作

时间:2023-04-30 17:56:18浏览次数:26  
标签:元素 driver id 获取 操作 element find

目录

元素定位操作

应用场景

计算机不像人一样“聪明”,我们需要通过元素定位来获取元素,才能让计算机帮我们“操作“这个元素。

步骤

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

标签:元素,driver,id,获取,操作,element,find
From: https://www.cnblogs.com/xiaoxiangstudy/p/17365547.html

相关文章

  • Linux入门操作基础
    一、配置虚拟机NAT网络连接查看vmware的NAT网络默认配置vmwarestation软件点击上方“编辑”,选择“虚拟网络编辑器”找到vmnet10,是NAT模式,子网地址是172.25.2.0,子网掩码是:255.255.255.0.再点击“NAT设置”,可看到它的网关:172.25.2.2配置当前虚拟机的网络配置vmwarestation......
  • COMP2006操作系统
    OperatingSystemsSemester-12023COMP2006-OperatingSystemsCURTINUNIVERSITYSchoolofElectricalEngineering,ComputingandMathematicalSciencesDisciplineofComputingCustomerQueueDueDate:4.00pmMonday8thMay2023Thegoalofthisassignmentisto......
  • 关于Linux操作系统OS账号最后一次登录时间的审计
    本文以RedHatEnterpriseLinuxrelease8.1(Ootpa)为例,应该也能适用于7.x版本的如果对操作系统中的账号审计,其中有一个项目可能会比较重要(尤其是对于个人账号),那就是最后一次登录的记录如果需要查看每一个OS账号的最后一次登录记录,可以使用lastlog命令[qq-5201351@localho......
  • Django框架——Q查询进阶、ORM查询优化、事务操作、字段类型、字段参数、Ajax、Conten
    Q查询进阶fromdjango.db.modelsimportQq_obj=Q()#1.产生q对象q_obj.connector='or'#默认多个条件的连接是and可以修改为orq_obj.children.append(('pk',1))#2.添加查询条件q_obj.children.append(('price__gt',2000))#支持添加多个res=models.Book.o......
  • Delphi原子操作函数介绍
    一、Delphi的原子操作函数在System.SyncObjs单元中,有一个TInterlocked的密封类,其十多个类函数(classfunction)其实都是调用的System单元的原子操作函数,只是封装得更容易理解。使用方法:如对一个数值加一,则直接b:=TInterlocked.Increment(a);或TInterlocked.Increment(a);,不用创建......
  • 如何优化操作大数据量数据库(几十…
    聚集索引的重要性和如何选择聚集索引在上一节的标题中,笔者写的是:实现小数据量和海量数据的通用分页显示存储过程。这是因为在将本存储过程应用于“办公自动化”系统的实践中时,笔者发现这第三种存储过程在小数据量的情况下,有如下现象:1、分页速度一般维持在1秒和3秒之间。2、在......
  • 如何优化操作大数据量数据库(改善…
    改善SQL语句很多人不知道SQL语句在SQLSERVER中是如何执行的,他们担心自己所写的SQL语句会被SQLSERVER误解。比如:select*fromtable1wherename='zhangsan'andtID>10000和执行:select*fromtable1wheretID>10000andname='zhangsan'一些人不知道以上两条语句的......
  • MySQL DDL数据库操作
    SQL全称StructuredQueryLanguage,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。SQL通用语法1、SQL语句可以单行或多行书写,以分号结尾。2、SQL语句可以使用空格/缩进来增强语句的可读性。3、MySQL数据库的SQL语句不区分大小写,关键字建议使用大......
  • day 59 503.下一个更大元素II | 42. 接雨水
    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1。示例1:输入:[1,2,1]输出:[2,......
  • CSS定位子元素包含特定 class 的父元素
    要定位子元素包含特定class的父元素,可以使用CSS选择器中的:has()选择器,但是这个选择器目前还没有得到广泛的浏览器支持。目前使用:has()选择器的最佳方式是使用jQuery或其他类似的JavaScript库。以下是一个使用jQuery的例子:<divclass="parent"><divclass="child......