自动化测试(三)webdriver的常用api(1)

news2024/12/24 8:11:25

目录

等待

sleep休眠

隐式等待

显式等待

打印信息

打印title

打印url  

浏览器的操作 

浏览器最大化

设置浏览器宽、高

操作浏览器的前进、后退

控制浏览器滚动条

键盘事件

键盘按键用法

键盘组合键用法

鼠标事件

定位一组元素


前面两章我们讲了selenium环境的配置和一些元素定位方法,今天这节我们来讲webdriver的一些常用的api,包括等待、打印信息、浏览器的操作、键盘事件、鼠标事件、以及定位一组元素的操作。🤷‍♀️

selenium+python环境没有配置好的可以先看我上两篇配置环境噢。
selenium环境配置: 自动化测试(一)配置selenium环境(带图文,防止踩坑)-CSDN博客
python环境配置: 自动化测试(前奏)Python环境配置教程(带图文)-CSDN博客

等待

sleep休眠

添加休眠非常简单,我们需要引入 time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠
import time
time.sleep(3) #休眠三秒

隐式等待

通过添加 implicitly_wait() 方法就可以方便的实现智能等待; implicitly_wait(30) 的用法比 time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
#coding=utf-8
from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)  # 设置隐式等待时间为10秒
driver.find_element(By.ID,'kw').send_keys('软件测试') # 在10秒内寻找元素,如果超时则抛出异常
time.sleep(3)
driver.quit()

其中driver.implicitly_wait(10)  是设置隐式等待时间为10秒,WebDriver 会在这个时间内自动为你等待,直到找到元素或超时。

显式等待

使用 expected_conditions 配合 WebDriverWait 来等待某个条件成立。例如,等待某个元素出现。

#coding=utf-8
from selenium import webdriver
import time
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.Chrome()
driver.get("http://www.baidu.com")
wait = WebDriverWait(driver, 10)
time.sleep(3)
element = wait.until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('软件测试')
time.sleep(3)
driver.quit()

这两行代码是使用 Selenium WebDriver 进行网页自动化测试时的常见代码。它们结合了显式等待(explicit wait)的方式来等待某个条件成立,以获取页面上的某个元素。

wait = WebDriverWait(driver, 10)
  • 这行代码创建了一个 WebDriverWait 对象,并指定了一个等待时间,即10秒。driver 是已经创建好的 WebDriver 实例(通常是浏览器驱动程序,如 Chrome、Firefox 等的实例)。
  • WebDriverWait 会在这个指定的时间内等待,直到满足某个条件。
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))
  • 这行代码使用 until 方法来等待一个条件成立。在这个例子中,等待的条件是元素的存在(presence of an element)。
  • EC.presence_of_element_located 是一个预期条件(expected condition),它会等待一个元素出现。
  • (By.ID, "element_id") 是一个定位器(locator),用于指定要查找的元素的 ID。这里,它正在等待 ID 为 "element_id" 的元素出现。
  • 一旦这个元素出现,until 方法会返回该元素,并将其赋值给变量 element。如果超时或条件不满足,until 方法会抛出一个异常。

显示等待与隐式等待具体可以看我之前这一篇文章:

Selenium 3和JUnit 5中的显示等待与隐式等待-CSDN博客

 欢迎大家支持支持,言归正传🤦‍♀️🤦‍♂️😃


打印信息

打印title

示例
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.title) # 把页面title 打印出来

运行结果:

打印url  

示例
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.current_url) #打印url

运行结果:

浏览器的操作 

浏览器最大化

我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们 观看 脚本 的执行。
driver.maximize_window()
示例:
#coding = utf-8
import time

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
time.sleep(3)
print(driver.current_url) #打印url

设置浏览器宽、高

如果最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。
browser.set_window_size(width, high)

示例:

#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(2)
#参数数字为像素点
print("设置浏览器宽480、高800显示")
browser.set_window_size(480, 800)
time.sleep(3)
browser.quit()

操作浏览器的前进、后退

浏览器上有一个后退、前进按钮,对于做 web 自动化测试的同学来说也比较容易实现。
#浏览器的前进
browser.forward()
#浏览器的后退
browser.back()

示例:

#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
#访问百度首页
first_url= 'http://www.baidu.com'
print("now access %s" %(first_url))
browser.get(first_url)
time.sleep(2)
#访问新闻页面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
browser.get(second_url)
time.sleep(2)
#返回(后退)到百度首页
print("back to %s "%(first_url))
browser.back()
time.sleep(1)
#前进到新闻页
print("forward to %s"%(second_url))
browser.forward()
time.sleep(2)
browser.quit()

控制浏览器滚动条

浏览器滚动条的控制需要依靠 js 脚本
#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
#将浏览器滚动条滑到最底端, 示例
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
其中,execute_script(script, *args),在当前窗口/框架同步执行javaScript
示例:
#coding=utf-8
from selenium import webdriver
import time

from selenium.webdriver.common.by import By

#访问百度
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#搜索
driver.find_element(By.ID,"kw").send_keys("selenium")
driver.find_element(By.ID,"su").click()
time.sleep(3)
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep(3)
driver.quit()

键盘事件

键盘按键用法

要使用键盘按键,必须引入 keys 包:
from selenium.webdriver.common.keys import Keys
通过 send_keys() 调用按键:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
send_keys(Keys.SPACE) # 空格键
send_keys(Keys.ESCAPE) # 回退键( Esc
等等。。。
示例:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys #需要引入keys 包
import os,time
driver = webdriver.Chrome()
driver.get("http://demo.zentao.net/user-login-Lw==.html")
time.sleep(3)
driver.maximize_window() # 浏览器全屏显示
driver.find_element(By.ID,"account").clear()
time.sleep(3)
driver.find_element(By.ID,"account").send_keys("demo")
time.sleep(3)
#tab 的定位相当于清除了密码框的默认提示信息,等同上面的clear()
driver.find_element(By.ID,"account").send_keys(Keys.TAB)
time.sleep(3)
#通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element(By.NAME,"password").send_keys(Keys.ENTER)
'''
#也可定位登陆按钮,通过enter(回车)代替click()
driver.find_element_by_id("login").send_keys(Keys.ENTER)
'''
time.sleep(3)
driver.quit()

键盘组合键用法

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
示例:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element(By.ID,"kw").send_keys("selenium")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element(By.ID,"kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element(By.ID,"kw").send_keys("webdriver")
driver.find_element(By.ID,"su").click()
time.sleep(3)
driver.quit()

鼠标事件

要使用鼠标事件需要导入工具包:
from selenium.webdriver.common.action_chains import ActionChains
语法示例如下:

#鼠标拖动事件
ActionChains(driver).move_to_element(element).perform()
ActionChains(driver)
生成用户的行为。所有的行动都存储在 actionchains 对象。通过 perform() 存储的行为。
move_to_element(element)
移动鼠标到一个元素中, menu 上面已经定义了他所指向的哪一个元素
perform()
执行所有存储的行为
ActionChains 类 方法:

context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 移动
示例:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element(By.XPATH,".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element(By.ID,"s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element(By.NAME,"btn");
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()

定位一组元素

webdriver 可以很方便的使用 findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。
定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的 checkbox 都勾上
先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的
checkbox ,然后选择最后一个
用以下 HTML 示例说明:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r2" />
</div>
</div>
</form>
</div>
</body>
</html>
用浏览器打开这个页面我们看到三个复选框和两个单选框。下面我们就来定位这三个复选框。
#coding=utf-8
from selenium import webdriver
import time
import os

from selenium.webdriver.common.by import By

dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = dr.find_elements(By.TAG_NAME,'input')
for input in inputs:
    if input.get_attribute('type') == 'checkbox':
        input.click()
        time.sleep(2)
dr.quit()
get_attribute :获得属性值。
本节就到这里啦,你们的支持就是我前进的动力,希望大家多多支持噢🤦‍♀️🤦‍♂️🤷‍♀️🤷‍♂️🎈

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

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

相关文章

初识JVM底层知识,一文读懂JVM知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

基于ssm医用物理学实验考核系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本医用物理学实验考核系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

什么是前端国际化(internationalization)和本地化(localization)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

北斗卫星在城市管网系统中的应用

北斗卫星在城市管网系统中的应用 北斗卫星是我国自主研发的卫星导航系统&#xff0c;已经应用于各个领域。而在城市管网系统中&#xff0c;北斗卫星也有着重要的应用。本文将详细介绍北斗卫星如何应用于城市管网系统&#xff0c;以及其所带来的优势和作用。 在城市管网系统中&a…

RK3568/RV1126/RV1109/RV1106 ISP调试方案

最近一直在做瑞芯微rv1126的开发&#xff0c;由于项目性质&#xff0c;与camera打的交道比较多&#xff0c;包括图像的采集&#xff0c;ISP处理&#xff0c;图像处理&#xff0c;H.264/H.265编解码等各个方面吧。学到了不少&#xff0c;在学习的过程中&#xff0c;也得到了不少…

UE5 Landscaping MapBox 学习笔记

1. Landscaping MapBox 操作录屏 https://www.bilibili.com/video/BV113411U7T9/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 安装Landscaping与LandscapingMapbox两个插件 打开Landscaping窗口&#xff0c;这里应该要在Proj…

源于自然感受好眠,GMN双子座深睡科技新品发布会愉悦亮相

2023年12月12日&#xff0c;中国成都——“睡眠愉悦领域专家”GMN双子座&#xff0c;以“睡不着贴双子座”为主题召开品牌正式成立后的首次线下发布会。品牌敏锐洞察现代人的睡眠困境&#xff0c;并始终致力于以自然与科技为基础&#xff0c;为大众带来自然愉悦的睡眠体验&…

彻底告别pip安装Python第三方库网速慢的问题

方式一、 如果使只下载没几个库 直接: pip install 库名 -i http://mirrors.aliyun.com/pypi/simple/ 方式二、 如果要一直下载库&#xff0c;就可以通过配置pip.ini文件来解决&#xff0c;具体步骤如下所示&#xff1a; 1、打开文件资源管理器 2、搜索%APPDATE% 3、创建一…

Excel实现字母+数字拖拉自动递增,步长可更改

目录 1、带有字母的数字序列自增加&#xff08;步长可变&#xff09; 2、仅字母自增加 3、字母数字同时自增 1、带有字母的数字序列自增加&#xff08;步长可变&#xff09; 使用Excel通常可以直接通过拖拉的方式&#xff0c;实现自增数字&#xf…

消息队列kafka详解:Kafka架构介绍

一. 工作流程 Kafka中消息是以topic进行分类的&#xff0c;Producer生产消息&#xff0c;Consumer消费消息&#xff0c;都是面向topic的。 Topic是逻辑上的改变&#xff0c;Partition是物理上的概念&#xff0c;每个Partition对应着一个log文件&#xff0c;该log文件中存储的就…

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但&#xff0c;单为这一个功能&#xff0c;更改整个模块的启动顺序&#xff0c;也不太划算 更好的办法是&#xff0c;启动顺序保持正常&#xff08;如"LoadingPhase": "Default" &#xff09;&#xff0c;然后…

verilog语法基础-移位寄存器

概述&#xff1a; 移位寄存器在数字电路设计中广泛被使用&#xff0c;列如SPI通讯中的串行输入并行输出&#xff0c;并行输出串行输出&#xff0c;FIR滤波器中作为数据的延迟链&#xff0c;边沿检测中的数据延迟链等等。本节针对移位寄存器的基本应用场景给出基本的模版&#…

SpringMVC上传下载文件解读

知识点 文件上传&#xff08;File Upload&#xff09;&#xff1a; 创建一个控制器方法&#xff0c;使用 MultipartFile 参数来接收上传的文件。在 Spring 配置文件中配置一个 MultipartResolver&#xff0c;常用的实现类是 CommonsMultipartResolver。在 MultipartResolver …

数据结构--稀疏矩阵及Java实现

一、稀疏 sparsearray 数组 1、先看一个实际的需求 编写的五子棋程序中&#xff0c;有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。 2、稀疏数组基本介绍 当一个数组中大部分元素为&#xff10;…

数据库——审计及触发器

智能2112杨阳 一、目的与要求&#xff1a; 1.了解MySQL审计功能及实现方式 2.掌握触发器的工作原理、定义及操作方法 二、内容&#xff1a; 注&#xff1a; 在同一个触发器内编写多行代码&#xff0c;需要用结构begin ……end 函数current_user()获得当前登录用户名 1.…

记删除CK不彻底问题 及 新增表TTL机制

问题背景&#xff1a;对CK表进行删除时&#xff0c;发现无法彻底删除&#xff0c;并报错如下&#xff1a; 同时也会有下面的报错信息&#xff1a; 解决过程&#xff1a; 确认CK 节点是否健康存活&#xff0c;select * from system.clusters 可以查看&#xff1b;确认CK元数据是…

抖店怎么运营?从开店到店铺维护,具体如下!

我是电商珠珠 抖店的热度很高&#xff0c;不少人都想要入驻&#xff0c;其中对于抖店的运营方面&#xff0c;新手不是很懂。 今天&#xff0c;我就来给大家详细的讲一下。 一、入驻 入驻的话需要新手准备一张个体工营业执照&#xff0c;身份证、银行卡、抖音号、手机和电脑…

UE4 图片环形轮播 蓝图

【需求】 图片环形轮播 任意图片之间相互切换 切换图片所需时间均为1s 两个图片之间切换使用就近原则 播放丝滑无闪跳 【Actor的组成】 每个图片的轴心都在原点 【蓝图节点】

Mybatis-plus介绍与入门

前言 MyBatis-Plus是在MyBatis基础上的一个增强工具库&#xff0c;旨在简化开发者的工作&#xff0c;提高开发效率&#xff0c;同时保留MyBatis的灵活性。使用 MyBatis-Plus 可以减少重复性的代码&#xff0c;简化常见的数据库操作 官方学习文档&#xff1a;MyBatis-Plus (bao…

Linux的重定向

Linux中的重定向是将程序的输入流或输出流从默认的位置改变到指定的位置。可以使用特殊的符号来实现重定向操作。&#xff08;文中command代表命令&#xff09; &#xff08;1&#xff09;重定向命令列表 命令 说明 command > file …