元素操作

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()

这里我们可以看到跟鼠标的模拟效果是一样。

技术分享

上面的两个例子说明了使用组合键和单个按键来操作元素,因为按键的使用起来比较简单,主要是认识每个按键代表的意思,这样我们就可以顺利的使用按键。


以上是关于元素操作的主要内容,如果未能解决你的问题,请参考以下文章

DOM操作元素

python selenium 元素操作之键盘操作

JS——操作内容操作相关元素

jQuery操作元素属性操作样式操作样式类操作HTML代码以及其他操作 [学完你还不会吗]

jQuery属性的操作

JavaScript中DOM操作元素及节点操作