元素操作

xiaoxiangstudy / 2023-05-03 / 原文

目录
  • 元素定位操作
    • 定位一个元素
    • 定位一组元素
  • 元素等待
    • 隐式等待
    • 显式等待
    • 隐式等待和显式等待的选择
  • 元素操作API
    • 点击元素
    • 输入和清空输入框内容
    • 获取元素的文本内容
  • 获取元素的位置和大小
  • 获取元素的属性值
  • 总结

元素定位操作

应用场景

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

步骤

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