【Selenium学习】Selenium 中特殊元素操作

news2024/11/17 15:17:07

1.鼠标定位操作

鼠标悬停,即当光标与其名称表示的元素重叠时触发的事件,在 Selenium 中将键盘鼠标操

作封装在 Action Chains 类中。Action Chains 类的主要应用场景为单击鼠标、双击鼠标、鼠标拖

曳等。部分常用的方法使用分类如下:

• click(on_element=None),模拟鼠标单击操作。

• click_and_hold(on_element=None),模拟鼠标单击并且按住不放。

• double_click(on_element=None),模拟鼠标双击。

• context_click(on_element=None),模拟鼠标右击操作。

• drag_and_drop(source,target),模拟鼠标拖曳。

• drag_and_drop(source,xoffset,yoffset),模拟将目标拖曳到目标位置。

• key_down(value,element=None),模拟按住某个键,实现快捷键操作。

• key_up(value,element=None),模拟松开某个键,一般和 key_down 操作一起使用。

• move_to_element(to_element),模拟将鼠标移到指定的某个页面元素。

• move_to_element_with_offset(to_element,xoffset,yoffset),移动鼠标至指定的坐标。

• perform(),将之前一系列的 ActionChains 执行。

• release(on_element=None),释放按下的鼠标。

接下来,列举鼠标右击操作和鼠标双击操作两个实例。

(1)鼠标右击操作,实现右击/双击百度首页“新闻”超链接。代码如下:

# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/16
form:《Selenium 3+Python 3自动化测试项目实战》
"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 定位超链接‘新闻’
element = driver.find_element(By.LINK_TEXT, '新闻')
# 实现在新闻超链接上右击
ActionChains(driver).context_click(element).perform()
# 实现用鼠标实现双击‘新闻’
ActionChains(driver).double_click(element).perform()

(2)以百度首页设置为例,使用“move_to_element”的方法,鼠标即可悬停于元素设置:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 通过id定位超链接‘设置’
setting = driver.find_element(By.ID, 's-usersetting-top')
# 使用方法 move_to_element 模拟将鼠标悬停在超链接“设置”处
ActionChains(driver).move_to_element(setting).perform()
# 定位超链接‘高级设置’,并实现单击操作
driver.find_element(By.CLASS_NAME, 'set').click()

实现效果如下:

2.Select 操作

Web 页面中经常会遇到下拉框选项,Select 模块提供了对标准 Select 下拉框的多种操作方

法。打开百度,单击“设置→高级设置”,会出现一个 Select 下拉框,如下图所示:

Select 元素的 HTML 代码如下图所示。

接下来介绍 3 种选择 Select 元素的值的方法。

Select 类:用于定位<select>标签。

select_by_value():通过 value 值定位下拉选项。

select_by_visible_text():通过 text 值定位下拉选项。

select_by_index():根据下拉选项的索引进行选择。第一个选项为 0,第二个选项为 1。

通过 WebDriver 代码操作下拉框,代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.select import Select

driver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 定位超链接‘设置’
setting = driver.find_element(By.ID, 's-usersetting-top')
# 使用方法 move_to_element 模拟将鼠标悬停在超链接“设置”处
ActionChains(driver).move_to_element(setting).perform()
# 通过xpath定位超链接‘高级’,并实现单击操作
driver.find_element(By.XPATH, "//div/a[@target='_blank']/span").click()
# 通过class定位选择‘全部时间’
search_time = driver.find_element(By.CLASS_NAME, 'c-select-selection')
# 通过 value 值定位下拉选项
Select(search_time).select_by_value('stf=1676475129.442,1676561529.442|stftype=1')
# 通过 text 值定位下拉选项
Select(search_time).select_by_visible_text('最近一周')

3.键盘操作

前面介绍过,send_keys()方法可以用来模拟键盘输入,我们还可以用它来输入键盘上

的按键,甚至是组合键,如 Ctrl+a、Ctrl+c 等。

经过总结,以下为自动化测试中常用的键盘事件。

• Keys.BACK_SPACE:删除键。

• Keys.SPACE:空格键。

• Keys.TAB:Tab 键。

• Keys.ESCAPE:回退键。

• Keys.ENTER:回车键。

• Keys.CONTROL,”a”:组合键 Ctrl + A。

• Keys.CONTROL,”x”:组合键 Ctrl + X。

• Keys.CONTROL,”v”:组合键 Ctrl + V。

• Keys.CONTROL,”c”:组合键 Ctrl + C。

• Keys.F1:F1 键。

• Keys.F12:F12 键。

用法举例,如下方代码展示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep

driver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 在输入框输入内容
driver.find_element(By.ID, "kw").send_keys("selenium")
# 删除多输入的一个 m
driver.find_element(By.ID, "kw").send_keys(Keys.BACK_SPACE)
sleep(1)
# 输入空格键+“教程”
driver.find_element(By.ID, "kw").send_keys(Keys.SPACE)
driver.find_element(By.ID, "kw").send_keys("教程")
sleep(1)
# 输入组合键 Ctrl+a,全选输入框内容
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, 'a')
sleep(1)
# 输入组合键 Ctrl+x,剪切输入框内容
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, 'x')
sleep(1)
# 输入组合键 Ctrl+v,粘贴内容到输入框
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, 'v')
sleep(1)
# 用回车键代替单击操作
driver.find_element(By.ID, "su").send_keys(Keys.ENTER)

4.利用 JavaScript 操作页面元素

WebDiver 对部分浏览器上控件并不是直接支持的,如浏览器右侧滚动条、副文本等,而是

通常借助 JavaScript 间接操作。WebDriver 提供了 execute_script()和 execute_async_scrip()两种方

法来执行 JavaScript 代码,其区别如下:

(1)execute_script 为同步执行且执行时间较短。WebDriver 会等待同步执行的结果,

然后执行后续代码。

(2)execute_async_script 为异步执行且执行时间较长。WebDriver 不会等待异步执行

代码的结果,而是直接执行后续的代码。

用于调整浏览器滚动条位置的 JavaScript 代码如下。

<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);

window.scrollTo()方法用于设置浏览器窗口滚动条的水平位置和垂直位置。第一个参数

表示水平的左边距,第二个参数表示垂直的上边距,代码如下。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 设置浏览器窗口大小
driver.set_window_size(800, 700)
driver.find_element(By.ID, "kw").send_keys("selenium")
driver.find_element(By.ID, "su").click()
sleep(3)
# 通过 JavaScript 设置浏览器窗口的滚动条位置
js = "window.scrollTo(100,300)"
driver.execute_script(js)

执行结果如下图所示:

5.获得验证信息

在进行 Web 自动化测试中,用得最多的几种验证信息是 title、current_url 和 text。

  • title:用于获取当前页面的标题。

  • current_url:用于获取当前页面的 URL。

  • text:用于获取当前页面的文本信息。

下面仍以百度搜索为例,对比搜索前后的信息。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')

print('Before search================')
# 打印当前页面 title
title = driver.title
print("title:" + title)

# 打印当前页面 URL
now_url = driver.current_url
print("URL:" + now_url)

driver.find_element(By.ID, "kw").send_keys("selenium")
driver.find_element(By.ID, "su").click()
sleep(3)

print('After search================')
# 再次打印当前页面 title
title = driver.title
print("title:" + title)
# 再次打印当前页面 URL
now_url = driver.current_url
print("URL:" + now_url)

# 获取搜索结果条数
num = driver.find_element(By.XPATH, "//span[@class='hint_PIwZX c_font_2AD7M']").text
print("result:"+num)

运行结果如下:

通过上面的打印信息可以看出搜索前后的差异,这些差异信息可以拿来作为自动化测试的断言点。

6.设置元素等待

WebDriver 提供了两种类型的元素等待:显式等待和隐式等待。

(1)显示等待

显式等待是 WebDriver 等待某个条件成立则继续执行,否则在达到最大时长时抛出超

时异常(TimeoutException)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")

element = WebDriverWait(driver, 5, 0.5).until(
 EC.visibility_of_element_located((By.ID, "kw"))
 )
element.send_keys('selenium')

WebDriverWait 类是 WebDriver 提供的等待方法。在设置时间内,默认每隔一段时间检

测一次当前页面元素是否存在,如果超过设置时间仍检测不到,则抛出异常。

具体格式如下。

  • driver:浏览器驱动。

  • timeout:最长超时时间,默认以秒为单位。

  • poll_frequency:检测的间隔(步长)时间,默认为 0.5s。

  • ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException异常。

WebDriverWait()一般与 until()或 until_not()方法配合使用,下面是 until()和 until_not()

方法的说明:

until(method, message=″)

调用该方法提供的驱动程序作为一个参数,直到返回值为 True。

until_not(method, message=″)

调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

在本例中,通过 as 关键字将 expected_conditions 重命名为 EC,并调用 presence_of_element_located()方法判断元素是否存在。

expected_conditions 类提供的预期条件判断方法如下图所示。

除 expected_conditions 类提供的丰富的预期条件判断方法外,还可以利用is_displayed()方法自己实现元素显示等待。

from time import sleep, ctime
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
print(ctime())

for i in range(10):
    try:
        el = driver.find_element(By.ID, "kw22")
        if el.is_displayed():
            break
    except:
        pass
    sleep(1)
else:
    print("time out")
print(ctime())

相对来说,这种方式更容易理解。首先 for 循环 10 次,然后通过 is_displayed()方法循环判断元素是否可见。如果为 True,则说明元素可见,执行 break 跳出循环;

否则执行 sleep()休眠 1s 后继续循环判断。10 次循环结束后,如果没有执行 break,则执行 for 循环对应的else 语句,打印“time out”信息。

这里故意将 id 定位设置为“kw22”,定位失败,执行结果如下:

(2)隐式等待

WebDriver 提供的 implicitly_wait()方法可用来实现隐式等待,用法相对来说要简单得

多。

from time import ctime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Firefox()
# 设置隐式等待为 10s
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
try:
    print(ctime())
    driver.find_element(By.ID, "kw22").send_keys('selenium')
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())

implicitly_wait()的参数是时间,单位为秒,本例中设置的等待时间为 10s。

首先,这10s 并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它会等待页面上的所有

元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,

则它将以轮询的方式不断地判断元素是否存在。假设在第 6s 定位到了元素,则继续执行,

若直到超出设置时间(10s)还没有定位到元素,则抛出异常。

这里同样故意将 id 定位设置为“kw22”,定位失败,执行结果如下:

7.警告框处理

在 WebDriver 中处理 JavaScript 生成的 alert、confirm 和 prompt 十分简单,具体做法是,

首先使用 switch_to.alert()方法定位,然后使用 text、accept、dismiss、send_keys 等进行操

作。

  • text:返回 alert、confirm、prompt 中的文字信息。

  • accept():接受现有警告框。

  • dismiss():解散现有警告框。

  • send_keys():在警告框中输入文本(如果可以输入的话)。

这里以百度搜索设置为例,打开百度搜索设置,设置完成后单击“保存设置”按钮,可以使用 switch_to.alert()方法为百度搜索设置弹窗,如下图所示:

代码如下:

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
# 定位超链接‘设置’
setting = driver.find_element(By.ID, 's-usersetting-top')
# 使用方法 move_to_element 模拟将鼠标悬停在超链接“设置”处
ActionChains(driver).move_to_element(setting).perform()
# 通过class定位超链接‘搜索设置’,并实现单击操作
driver.find_element(By.CLASS_NAME, "set").click()
# 通过xpath获取保存设置
driver.find_element(By.XPATH, "//a[@class='prefpanelgo setting-btn c-btn c-btn-primary']").click()
sleep(3)

# 获取警告框
alert = driver.switch_to.alert
# 获取警告框提示信息
alert_text = alert.text
print(alert_text)
# 接取警告框
alert.accept()

8.获取Cookie

有时我们需要验证浏览器中的 Cookie 是否正确,因为基于真实的 Cookie 是无法通过

白盒测试和集成测试的。WebDriver 提供了操作 Cookie 的相关方法,可以读取、添加和删

除 Cookie。

WebDriver 操作 Cookie 的方法如下:

  • get_cookies():获得所有 Cookie。

  • get_cookie(name):返回字典中 key 为“name”的 Cookie。

  • add_cookie(cookie_dict):添加 Cookie。

  • delete_cookie(name,optionsString):删除名为 OpenString 的 Cookie。

  • delete_all_cookies():删除所有 Cookie。

下面通过 get_cookies()获取当前浏览器的所有 Cookie。代码如下:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
# 获得所有 Cookie 信息并打印
cookie = driver.get_cookies()
print(cookie)

执行结果如下:

从执行结果可以看出,Cookie 中的数据是以字典形式存放的。知道了 Cookie 中数据的

存放形式后,即可按照这种形式向浏览器中添加 Cookie。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')

# 添加 Cookie 信息
driver.add_cookie({'name': 'foo', 'value': 'bar'})
# 遍历指定的 Cookies
for cookie in driver.get_cookies():
    print("%s -> %s" % (cookie['name'], cookie['value']))

执行结果如下:

从执行结果可以看出,最后一条 Cookie 是在脚本执行过程中通过 add_cookie()方法添

加的。通过遍历得到所有的 Cookie,从而找到字典中 key 为“name”和“value”的 Cookie

值。

delete_cookie() 和 delete_all_cookies() 方法的使用也很简单,前者通过 name 删除一个

指定的 Cookie,后者直接删除浏览器中的所有 Cookies。

9.窗口截图

自动化测试用例是由程序执行的,因此有时候打印的错误信息不够直观。如果在脚本

执行出错时能够对当前窗口进行截图并保存,那么通过截图就可以非常直观地看到脚本出

错的原因。WebDriver 提供了截图函数 save_screenshot (),可用来截取当前窗口。

from time import sleep
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
sleep(3)

# 截取当前窗口,指定截图图片的保存位置
driver.save_screenshot("D:/baidu_img.png")

WebDriver 建议使用 png 作为图片的后缀名。脚本运行完成后,会在D盘根目录下生成 baidu_img.png 图片

这样我们就学习完大部分Selenium 的特殊元素操作方法了,读者可以掌握 Selenium 的常用方法,包括熟悉每种方法使用的场景或者前提条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

过滤器与拦截器

文章目录一、前言1、概述2、过滤器与拦截器异同2.1 简介2.2 异同2.3 总结3、Filters vs HandlerInterceptors二、过滤器1、概述2、生命周期2.1 生命周期概述2.2 基于函数回调实现原理3、自定义过滤器两种实现方式3.1 WebFilter注解注册3.2 过滤器&#xff08;配置类注册过滤器&…

vue2vue3常用语法(持续更新)

一、基础1. 指令指令描述v-if判断v-else-if判断后剩下的v-else判断后剩下的v-html渲染html文本格式v-text渲染文本v-for循环v-showdisplay&#xff1a;none/block切换v-model双向绑定v-bind(缩写&#xff1a;:)动态绑定v-on(缩写&#xff1a;)绑定dom事件(如点击事件)v-cloak解…

WMS AMS【Android Framework进阶】

1.简介 可以毫不夸张的说&#xff0c;android的framework层主要是由WMS、AMS还有View所构成&#xff0c;这三个模块穿插交互在整个framework中&#xff0c;掌握了它们之间的关系和每一个逻辑步骤&#xff0c;你对framework的了解至少有百分之五十 AMS是Android中最核心的服务…

设计模式:行为型设计模式

参考文章&#xff1a; 《设计模式》 《设计模式知识体系详解》 《DesignPatterns》 写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。 前言 行为型模式是将不同的行为代码解耦&#xff0c;从而解决…

疯狂弹出请插入多卷集的最后一张磁盘窗口

整个人嘛了&#xff0c;今天插上U盘&#xff0c;跟tmd中了病毒一样&#xff0c; 屏幕疯狂弹出窗口&#xff0c; 提示请插入多卷集的最后一张磁盘&#xff01; 点确定之后他继续弹出&#xff0c;点取消它也继续弹出&#xff0c; 关掉一个又弹出来一个&#xff0c;妈的&#x…

系统编程中的进程的概念No.3【进程状态】

引言&#xff1a; 北京时间&#xff1a;2023/2/17/8:17&#xff0c;目前听着超能陆战队主题曲《Immortals》&#xff0c;感觉又要螺旋式升天&#xff0c;并且为我今天上午没课感到happy&#xff0c;所以继我们很久以前的关于进程的博客&#xff0c;今天我们就再来学习一下有关…

buuctf Web 下

9.[ACTF2020 新生赛]Exec 访问url&#xff1a; http://cc3c6c27-e2df-4665-baba-1d9a32dc963e.node3.buuoj.cn/ 首页如下&#xff1a; 直接ping ip可以得到结果 常见管道符 1、|&#xff08;就是按位或&#xff09;&#xff0c;直接执行|后面的语句 127.0.0.1 | cat /flag…

html 的相对路径和绝对路径

整篇文章是以 src 标签进行演示。 文章目录 一、相对路径 1、同级目录查找 2、上一级目录查找 3、下一级目录查找 二、绝对路径 一、相对路径 &#x1f475;相对路径&#xff1a;从当前目录开始查找。 1、同级目录查找 写法&#xff1a; 1.1.直接写文件名字&#xff1b;…

Linux之进程控制

一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程…

Echarts实现多柱状图重叠重叠效果

有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低&#xff0c;而且不会…

GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像

我们使用GEE在线编辑可以直接通过在线的网页可以加载展示我们计算的结果&#xff0c;而python版的GEE要展示我们的计算结果可能就比较麻烦。如果有同学看过GEE的python版API中可以找到一个类ee.mapclient&#xff0c;这个类的介绍是它是GEE官方通过Tk写的一个加载展示地图的类。…

【蓝桥日记⑤】2014第五届省赛(软件类)JavaA组❆答案解析

【蓝桥日记⑤】2014第五届省赛&#xff08;软件类&#xff09;JavaA组☃答案解析 文章目录【蓝桥日记⑤】2014第五届省赛&#xff08;软件类&#xff09;JavaA组☃答案解析1、猜年龄2、李白打酒3、神奇算式4、写日志5、锦标赛6、六角填数7、绳圈8、兰顿蚂蚁9、斐波那契10、波动…

Linux 操作系统原理 — NUMA 体系结构

目录 文章目录 目录NUMA 体系结构NUMA 的基本概念查看 Host 的 NUMA TopologyBash 脚本DPDK 脚步NUMA 体系结构 NUMA(Non-Uniform Memory Access,非一致性存储器访问)的设计理念是将 CPU 和 Main Memory 进行分区自治(Local NUMA node),又可以跨区合作(Remote NUMA nod…

操作系统 三(存储管理)

一、 存储系统的“金字塔”层次结构设计原理&#xff1a;cpu自身运算速度很快。内存、外存的访问速度受到限制各层次存储器的特点&#xff1a;1&#xff09;主存储器&#xff08;主存/内存/可执行存储器&#xff09;保存进程运行时的程序和数据&#xff0c;内存的访问速度远低于…

【信管12.2】知识管理与知识产权

知识管理与知识产权想必你对知识的概念多少都会有一些自己的理解&#xff0c;毕竟我们经过了那么多年的教育&#xff0c;学来学去可不都学习的是“知识”嘛。在今天的学习中&#xff0c;内容还是会比较多&#xff0c;因为除了知识管理相关的内容之外&#xff0c;还有知识产权相…

Matlab 最小二乘法拟合平面(SVD)

文章目录 一、简介1.1最小二乘法拟合平面1.2 SVD角度二、实现代码三、实现效果参考资料一、简介 1.1最小二乘法拟合平面 之前我们使用过最为经典的方式对平面进行了最小二乘拟合(点云最小二乘法拟合平面),其推导过程如下所示: 仔细观察一下可以发现

IP协议

网络层的一个重要作用就是把世界上的地址能够以一定的规范定义出来。地址管理路由选择网络层的代表:IP协议4位版本指的是&#xff1a;此处的取值只有两个ipv4,ipv64位首部长度&#xff1a;描述了ip报头有多长&#xff08;ip报头是变长的&#xff09;报头中有一个选项部分&#…

JUnit5文档整理

1、Overview 1.1、Junit5是什么 与以前的JUnit版本不同&#xff0c;JUnit 5是由三个不同子项目的几个不同的模块组成。 JUnit 5 JUnit Platform&#xff08;基础平台&#xff09; JUnit Jupiter&#xff08;核心程序&#xff09; JUnit Vintage&#xff08;老版本的支持&a…

JVM那些事——垃圾回收和内存分配

内存分配 默认情况下新生代和老年区的内存比例是1:2&#xff0c;新生代中Eden区和Survivor区的比例是8:1。 对象优先分配在Eden区。大对象直接进入老年区。通过-XX:PertenureizeThreshold参数设置临界值。长期存活的对象进入老年区。对象每熬过一次Minor GC&#xff0c;年龄1&…