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

目录

等待

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 :获得属性值。
本节就到这里啦,你们的支持就是我前进的动力,希望大家多多支持噢🤦‍♀️🤦‍♂️🤷‍♀️🤷‍♂️🎈

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Eolink Apikit 如何进行 Websocket 接口测试?

什么是 websocket &#xff1f; WebSocket 是 HTML5 下一种新的协议&#xff08;websocket协议本质上是一个基于 tcp 的协议&#xff09;。 它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 Websocket 是一个持久化的协议。…

『K8S 入门』二:深入 Pod

『K8S 入门』二&#xff1a;深入 Pod 一、基础命令 获取所有 Pod kubectl get pods2. 获取 deploy kubectl get deploy3. 删除 deploy&#xff0c;这时候相应的 pod 就没了 kubectl delete deploy nginx4. 虽然删掉了 Pod&#xff0c;但是这是时候还有 service&#xff0c…

图片的批量建码怎么做?一图一码的制作方法

在使用图片展示内容时&#xff0c;经常会有同一类型的图片信息是有区别的&#xff0c;如果需要将每张图片批量生成二维码图片&#xff0c;那么出了一张一张去制作之外&#xff0c;有没有能够一键批量建码的功能可以解决这个问题呢&#xff1f;下面来给大家分享一下图片批量建码…

2024 年值得收藏的 10 款 iPhone 数据恢复软件评论

iPhone 让您将数字生活装在口袋里。从您所爱之人的照片和视频&#xff0c;到与学校和工作相关的文档&#xff0c;再到重要的备忘录和日历约会&#xff0c;iPhone 内的微型存储芯片可以容纳的数据量是惊人的。 唯一的问题是&#xff0c;很快就会丢失这些数据。一次错误的点击或…

FLStudio2024版本新增功能及21.3版本安装下载教程

FLStudio21.0.2.3中文版完整下载是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。最新FL有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助您使完美的配乐在一个美妙的方式。此程序可用于Mi…

关于自动化用例设计的思考!

为什么要设计用例&#xff1f; 作为质量保证(QA)人员&#xff0c;设计测试用例的重要性不亚于开发人员编写技术实现方案。如果实现方案设计不周&#xff0c;编码阶段将可能遇到许多问题&#xff1b;同理&#xff0c;如果我们未能设计测试用例&#xff0c;产品质量就难以得到充…

数据库系统 --- 绪论

目录 一、数据库系统概述 1.4个基本概念 2.数据管理技术的产生和发展 二、数据模型 1.数据建模 2.概念模型 3.数据模型的三要素 4.层次模型 5.关系模型 三、数据库系统的三级模式结构 1.基本概念 2.数据库的三级模式结构 3.数据库的两级映像与数据独立性 4.小结 一、数据库系…

TensorFlow神经网络中间层的可视化

TensorFlow神经网络中间层的可视化 TensorFlow神经网络中间层的可视化1. 训练网络并保存为.h5文件2. 通过.h5文件导入网络3. 可视化网络中间层结果&#xff08;1&#xff09;索引取层可视化&#xff08;2&#xff09;通过名字取层可视化 TensorFlow神经网络中间层的可视化 1. …

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性&#xff0c;并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望&#xff0c;我们提供了对这些话题更深层次…

装修干货,新房装修防水细节要注意!福州中宅装饰,福州装修

水管破裂&#xff0c;墙面起泡&#xff0c;地面渗水……这些水涨船高的问题&#xff0c;你遇到过吗&#xff1f;如果经常遇到&#xff0c;那么你需要了解一些关于防水的干货知识。今天&#xff0c;我就来分享一些装修防水的小技巧和经验&#xff0c;帮助你摆脱装修“水淋淋”的…

Bootstrap 响应式实用工具-来自Twitter,目前最受欢迎的前端框架

Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发。这些可以通过媒体查询结合大型、小型和中型设备,实现内容对设备的显示和隐藏。 需要谨慎使用这些工具,避免在同一个站点创建完全不同的版本。响应式实用工具目前只适用于块和表切换。 超小屏幕 手机 (<…

黑马点评05分布式锁 1互斥锁和过期时间

实战篇-09.分布式锁-基本原理和不同实现方式对比_哔哩哔哩_bilibili 1.分布式锁 因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器&#xff0c;所以需要一个jvm外部的锁来共享。 2.redis setnx互斥锁 加锁解锁即可 2.1不释放锁可能死锁 redis 的setnx不会自动释放锁…

四十二、Redis

目录 一、简介 二、Redis基础 三、Redis的持久化 四、Redis主从、哨兵、分片集群安装 五、Redis主从 六、Redis哨兵 七、Redis分片集群 一、简介 Redis是一个内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。它的数据结构包括字符串、列表、集合…

zabbix批量添加端口监控

背景 以前做监控的时候&#xff0c;一台机器上就几个重要端口&#xff0c;手动添加一下监控就可以了。这次公司一个新业务上了很多服务器&#xff0c;每台服务器上的业务端口很多&#xff0c;而且还不一样。着手动添加会累死人的。所以想zabbix怎么批量添加端口监控。通过查了…

Flink的处理函数

之前的流处理API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c;其实都是基于DataStream进行转换的&#xff0c;所以可以统称为DataStream API。 在Flink更底层&#xff0c;我们可以不定义任何具体的算子&#xff08;比如map&#xff0c;f…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑碳交易机制的含风电电力系统日前优化调度》

解读标题 "考虑碳交易机制的含风电电力系统日前优化调度" 意味着在该研究或应用中&#xff0c;对含有风电的电力系统进行日前优化调度&#xff0c;并考虑了碳交易机制。 具体解读如下&#xff1a; "含风电电力系统"&#xff1a;指涉及到风能作为电力系统的…

前端设计模式之旅:命令模式

引言 使用命令模式&#xff0c;我们可以将执行特定任务的对象与调用该方法的对象解耦。 核心思想 命令模式的核心思想是将请求封装成一个对象&#xff0c;从而使请求的发起者和请求的执行者解耦。 请求的发起者只需要知道如何创建命令对象并将其传递给请求者&#xff0c;而不需…

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…

python+appium自动化常见操作

1、点击、输入操作 #点击 driver.find_element(id,com.lemon.lemonban:id/navigation_my).click() #输入 driver.find_element(id,com.lemon.lemonban:id/et_password).send_keys(abc)2、隐形等待 driver.implicitly_wait(10)3、显性等待 #显性等待 locator (xpath,xpath) wai…

数学公式推导中 “:=“和“:=“的区别

A:B 将A定义为&#xff08;记为&#xff0c;令为&#xff09;B A:B 将B定义为&#xff08;记为&#xff0c;令为&#xff09;A