Selenium自动化测试框架快速搭建

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 

一、介绍

Selenium目前主流的web自动化测试框架;支持多种编程语言Java、pythan、go、js等;selenium 提供一系列的api 供我们使用,因此在web测试时我们要点页面中的某一个按钮,那么我们只需要获取页面,然后根据id或者name找到对应的按钮,然后执行click操作就可以完成点击这一个动作。测试点点点虽然容易复现,但做回归测试的时候会出现大量重复的工作,因此可以通过自动化,每次做回归测试我们只需要运行相关的脚本即可。Selenium2:使用Selenium自动化测试框架,主要用到Selenium Webdriver模块,能模拟提供浏览器、页面元素定位、元素操作、鼠标键盘等相关的操作和方法;

ui自动化测试主要应用在回归测试、兼容性测试、冒烟测试等测试场景;适合的是需求稳定、项目周期长、测试脚本可以复用的项目。

二、selenium安装及配置

浏览器:谷歌chrome(推荐)、火狐、IE等

驱动:chromedriver.exe(谷歌) 地址:ChromeDriver - WebDriver for Chrome - Downloads

安装selenium包:pip install selenium -U   ,-U 表示已安装则更新

下载对应浏览器版本 的chromedriver.exe,否则有可能会报找不到驱动的错;把驱动包放到python的根目录下

WebDriver原理图:WebDriver是一个基于HTTP的协议,它提供了一系列的接口用于发现和控制 Web 文档中的 DOM 元素,几乎可以操作浏览器做任何事情。总的来说就是python编写代码,通过webdriver控制浏览器。

三、脚本实例 

from selenium import webdriver
import time
 
#打开浏览器
driver = webdriver.Chrome()
#浏览器最大化
driver.maximize_window()
# 打开baidu
driver.get("http://www.baidu.com")
#打印浏览器地址
print(driver.current_url)
#打印网页标题
print(driver.title)
#暂停一会,3 秒
time.sleep(3)
#关闭当前窗口
driver.close()
#关闭整个浏览器,并且关闭驱动chromedriver
driver.quit()

Unittest:Python的单元测试框架模块,在此框架下编写具体的业务测试用例脚本,另外此框架能组织测试用例集的执行和测试场景恢复

标准库 time 模块主要提供对时间的相关操作, os.path 模块主要提供对文件路径相关的操作,logging模块主要提供对日志相关的设置 ,smtplib 模块主要负责发送邮件等

第三方模块库:HTMLTestRunner 模块主要用于生成HTML格式的可视化测试报告,xlrd模块是读取excel文件数据的模块,xlwt模块是向excel文件中写入数据的模块

四、元素定位

在测试时,浏览器 点击F12打开控制台, 即可以看到页面的所有按钮、输入框等id属性;激活元素选择器;点击对应的按钮、输入框,就可以在控制台看到对应信息;根据id属性定位元素;调用driver提供给的方法定位。

id定位:driver.find_element_by_id('id')

#打开百度,输入软件测试,点击百度一下
driver.find_element_by_id('kw').send_keys('软件测试')
driver.find_element_by_id('su').click()

name定位:el = driver.find_element_by_name('name')

#输入selenium 自动化,点击百度一下
driver.find_element_by_name('wd').send_keys('selenium自动化')
#百度一下按钮没提供名字
driver.find_element_by_id('su').click()
  • class定位:el = driver.find_element_by_class_name('bt_class')
  • tagName定位:el = driver.find_element_by_tag_name(tagName)
  • xpath定位(绝对路径定位):el = driver.find_element_by_xpath(xpath)
  • css定位:el = driver.find_element_by_css_selector(css)
  • link_text 定位(根据它的超链接定位):el = driver.find_element_by_link_text(linkText)
  • partial_link_text定位():el = driver.find_element_by_partial_link_text(linkPartText)
  • 获取当前 页面的url:driver.current_url
  • 获取元素的文本值:driver.find_element_by_id("iptUsername").text
  • 浏览器窗口最大化:driver.maximize_window()
  • 查看浏览器名字:driver.name
  • 打开网页:driver.get("www.baidu.com")
  • 打开浏览器:driver = webdriver.Chrome()
  • 关闭窗口:driver.close()

五、元素操作

元素赋值: el = driver.find_element_by_id("iptUsername").send_keys('admin')

清空元素值  el.clear()

获取元素文本: el.text

获取元素指定属性的值: get_attribute(obj)

上传文件:找到 type=file 的按钮,点击按钮,然后把按钮的文字改为图片名;

driver.find_element_by_css_selector('[type="file"]').click();

driver.find_element_by_css_selector('[type="file"]').send_keys('helloword.jpg');

六、执行JavaScript操作

当webdriver 遇到无法完成的操作时,可以使用javascript来完成,webdriver提供了execute_script()接口来调用js代码。 方法:execute_script(script, *args);执行 JavaScript代码是一个非常强大的功能,可以实现WebElement 接口所有功能,甚至更多的功能。比如在web性能测试中可以调用Web API接口window.performance来测试Web性能。

#打开百度页面,把百度一下 改成 test 
driver.get("http://www.baidu.com")
driver.execute_script('document.getElementById("su").value = "test"')

七、窗口切换

浏览器窗口切换:

例如浏览器打开多个窗口,需要从一个窗口跳转到另一个窗口做自动化测试。要转到另一个页面才能找到元素。原理是:每个打开的窗口都有唯一的标识,叫做句柄;可以通过不同的句柄实现窗口切换。

# 当前窗口url地址:
print(driver.current_url)
 
#暂停一会,10 秒
time.sleep(10)
 
# 打印所有窗口句柄
windows = driver.window_handles
print(windows,'\n')
 
 
#切换到最后的窗口
driver.switch_to.window(windows[-1])
#打印url,核对下是不是最后的窗口;或者根据网页名等校验
print(driver.current_url)
 
print('\n\n')
time.sleep(3)
 
#切换到第二个窗口
#先获取现在的窗口
current_window = driver.current_window_handle
 
# 获取第二个窗口的索引(由当前窗口索引+1)
next_window_index = windows.index(current_window) + 1
 
# 切换到第二个窗口
driver.switch_to.window(windows[next_window_index])
print(driver.current_url)

iframe切换:

如果元素包含在iframe中,也会导致无法找到元素!例如代码:也会找不到id为kw的input输入框;使用 driver.find_element_by_id('kw') 跑出无法找到的异常。

<iframe src="frame.html" id="myframe" name="myframe">
        <input id="kw" / >
    </iframe>

selenium提供了switch_to.frame()方法用于实现frame的切换,此方法接收id、name、index以及selenium的WebElement对象用来实现切换,比如上述的代码中,要切换到iframe中,则可以使用以下代码实现:

from selenium import webdriver
 
driver = webdriver.Chrome()
# 通过id切换iframe
driver.switch_to.frame('myframe')  
# 通过name切换iframe
# driver.switch_to.frame('myframe')  
# 通过index切换iframe,0代表第一个
# driver.switch_to.frame(0)   
# 通过WebElement对象切换iframe
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  

当操作完frame中的元素后,经常需要重新切换到主界面进行其他操作,切换回主页面使用方法如下:

driver.switch_to.default_content()

若是frame里嵌套frame,这需要一层层切换下去。有多层frame,需要回到上一级的;用父frame:

driver.switch_to.parent_frame()

alert弹窗切换:

alert窗口是js提示框,不属于web界面,

#切换到alert窗口 ;获取alert 窗口
alert= driver.switch_to_alert
#获取alert的文本内容
print(alert.text)
#点击确定,关闭弹框
alert.accept()
#点击取消,关闭弹簧
alert.dismiss()

八、鼠标经过操作

selenium鼠标事件(单击/双击/右击/拖动)详细解说,selenium鼠标事件用的是ActionChains。需要import相关模块。

from selenium.webdriver.common.action_chains import ActionChains

如找到百度一下按钮,移到该位置;

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
 
chr_driver = webdriver.Chrome()
chr_driver.maximize_window()
chr_driver.get("https://www.baidu.com/")
 
ele = chr_driver.find_element_by_id('su')
# 实例化,悬浮、点击,可以连续调用多个方法,是因为返回的都是self对象
ActionChains(chr_driver).move_to_element(ele).pause(0.5).click(ele).perform()

ActionChains的常用方法:

#单击鼠标左键
click(on_element=None) 
#点击鼠标左键,不松开
click_and_hold(on_element=None)
#点击鼠标右键 
context_click(on_element=None) 
#双击鼠标左键
double_click(on_element=None) 
#拖拽到某个元素然后松开
drag_and_drop(source, target) 
#拖拽到某个坐标然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) 
#按下某个键盘上的键
key_down(value, element=None) 
#松开某个键
key_up(value, element=None) 
#鼠标移动到某个元素,悬浮
move_to_element(to_element) 
#执行链中的所有动作
perform() 

九、拖拽

如:打开百度地图拖拽、验证码验证的拖拽动作

from selenium.webdriver.common.action_chains import ActionChains
 
#打开浏览器
driver = webdriver.Chrome()
#浏览器最大化
driver.maximize_window()
#打开百度地图
driver.get('https://map.baidu.com/@12697919.69,2560977.31,12z')
 
#定位地图
mask = driver.find_element_by_id('mask')
 
#动作
ac = ActionChains(driver)
ac.move_to_element(mask).click_and_hold().move_by_offset(50,50).release().perform()

十、页面等待

强制等待 :time.sleep()

隐式等待:driver.implicitly_wait(t)   ,隐式等待在指定的时间 t 内等待页面加载完成,如果加载完成的时间小于 t ,剩余的时间就不再等;如果时间 t 内未加载完成则报错。作用范围:全局

显式等待:WebDriverWait(driver , timeout , poll_frequency).until(element)

导入:from selenium.webdriver.support.ui import WebDriverWait

显式等待可以看做是特殊的隐式等待,在指定的时间 t 内等待指定元素加载完成,如果加载完成时间小于 t ,剩余的时间就不再等待,如果没能在 t 时间内加载完成则报错。

方法:WebDriverWait(driver , timeout , poll_frequency)

driver:表示浏览器对象,timeout:表示超时时间,poll_frequency:扫描间隔时间一般0.5秒,扫描一次页面。

element: 指定加载的元素

十一、截图

driver.save_screeshot(file) :file ,图片在本地保存的路径及名字;

如: driver.save_screeshot('./首页.jpg')

driver.get_screenshot_as_file(file)  

使用场景:通常是断言失败,有错误的时候保存截图,方便还原现场。

十二、调用js代码

excute_script(js)

如:为只读元素设定值;设定日期;       

js = 'document.getElementById("date").value = 2022-05-27'
driver.execute_script(js)

十三、警告框处理

警告框的三种类型:

alert:只有确定按钮; 

confirm:有确定和取消按钮

prompt:可以输入内容;

方法:

swtch_to.alert.text:获取警告框中的文本信息
swtch_to.alert.accept():在警告框中点击确定
swtch_to.alert.dismiss():在警告框中点击取消
swtch_to.alert.send_keys(value):在警告框中输入内容
 

#打印警告框中的文本信息
print(swtch_to.alert.text)
#在警告框中点击确定
driver.swtch_to.alert.accept()
#在警告框中点击取消
driver.swtch_to.alert.dismiss()
#在警告框中输入内容 100块
driver.swtch_to.alert.send_keys('100块')

十四、下拉框

导入模块:from selenium.webdriver.support.select import select

假设下拉框为 s ;选择下拉框中的选项 Select(s).方法()

方法:

options :返回下拉框中的所有选项

select_by_index():通过索引选择

select_by_value():通过选项的value属性值选择

select_by_visible_text():通过选项的文本值选择

#定位下拉框,内容是省份
s = driver.find_element_by_id('province')
#获取下拉框里的所有选项内容
opt = Select(s).options
#通过索引选择;若是通过value选择,则html代码要写有value属性
Select(s).select_by_index(-1)

十五、ActionChains 动作链

ActionChains 可以帮助模拟鼠标操作;如单击、双击、点击鼠标右键、拖拽等等。使用actionchains对象方法,行为事件是存储在actionchains对象队列。当你使用perform(),事件按顺序执行。

调用方法有两种:

#链式写法
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).perform()
 
#分步写法
ActionChains(driver).click(click_btn)
ActionChains.double_click(doubleclick_btn)
ActionChains.perform()

ActionChains常用方法:

click(on_element=None) ——单击鼠标左键
 
click_and_hold(on_element=None) ——点击鼠标左键,不松开
 
context_click(on_element=None) ——点击鼠标右键
 
double_click(on_element=None) ——双击鼠标左键
 
drag_and_drop(source, target) ——拖拽到某个元素然后松开
 
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
 
key_down(value, element=None) ——按下某个键盘上的键
 
key_up(value, element=None) ——松开某个键
 
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
 
move_to_element(to_element) ——鼠标移动到某个元素
 
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
 
perform() ——执行链中的所有动作
 
release(on_element=None) ——在某个元素位置松开鼠标左键
 
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
 
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

十六、table表格处理

table表格代码如下:

<table border="1">
    <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
    </tr>
    <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
    </tr>
</table>

获取表格里的内容,通过 table->tr->td 层层获取

#获取table
table = driver.find_elements_by_id('table')
 
#获取 tr
tr = table.find_elements_by_tag_name('tr')
 
#获取td
td = tr[1].find_elements_by_tag_name('td')
 
#输出内容
print(td[1].text)

十七、生产报告

连接数据库,把所有的测试用例运行结果输入数据库,然后读取数据库,生成测试报告;如:项目的总测试用例数、成功用例数、失败用例数、跳过数;每个模块的测试用例数、成功用例数、失败用例数、跳过数;

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

【文献阅读】A Survey on Hardware Accelerators for Large Language Models

大语言模型硬件加速器综述 大语言模型&#xff08;LLMs&#xff09;已成为自然语言处理任务的强大工具&#xff0c;凭借其理解和生成类似人类文本的能力&#xff0c;彻底改变了该领域。随着对更复杂大语言模型的需求持续增长&#xff0c;迫切需要应对与其规模和复杂性相关的计…

机器幻觉产生的原因

机器幻觉是指模型生成的不符合现实的内容&#xff0c;比如图像生成中的错误或者不合理的输出。 线性函数在神经网络中的作用通常是传递梯度&#xff0c;但如果每一层都是线性的&#xff0c;整个网络就相当于一个单层的线性模型&#xff0c;无法学习复杂的模式。所以如果只有线性…

python-leetcode-颜色分类

75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

如何使用LLDB 在VSCode调试C++代码

LLDB VSCode调试 第一步.拷贝lldb-server到android系统 adb push ${NDK_PATH}/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm/lldb-server /data/local/tmp/lldb-server第二步.进入到安卓设备&#xff0c;打开lldb-server adb shell cd /data/lc…

2025中建二测笔试考什么?北森题库考点复习|附精华备考面试攻略

大家好&#xff0c;我是职小豚&#xff0c;将为大家详细解析2025年中建二测的笔试内容&#xff0c;并提供备考面试的全方位攻略。 希望这份指南能帮助大家在求职路上更加顺利&#xff01; 一、中国建筑集团公司介绍 中国建筑集团有限公司&#xff08;简称“中建集团”&#…

GD32F450 使用

GB32F450使用 1. 相关知识2. 烧写程序3. SPI3.1 spi基础3.2 spi代码 4. 串口4.1 串口引脚4.2 串口通信代码 问题记录1. 修改晶振频率 注意&#xff1a;GD32F450 总共有三种封装形式&#xff0c;本文所述的相关代码和知识&#xff0c;均为 GD32F450IX 系列。 1. 相关知识 参数配…

Spring Boot 测试:单元、集成与契约测试全解析

一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构&#xff0c;不同层级的功能模块对应不同的测试策略&#xff0c;以确保代码质量和系统稳定性。 Spring Boot 分层架构&#xff1a; Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式&#xff1f;二、 为什么要用模板方法模式&#xff1f;三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&a…

汽车刹车系统设计

摘 要 本次设计内容为汽车刹车系统&#xff0c;其可靠性与驾驶人的生命息息相关&#xff0c;是汽车所有组成部分中最重要的一环。刹车系统是在车辆行驶过程中出现紧急情况时首先保护车辆与驾驶人员安全的反应系统&#xff0c;工作原理是依靠制动装置工作时产生的大量摩擦力来抵…

卷积神经网络梯度下降方向与参数更新方向的一致性论述

梯度下降是一种常用的优化算法&#xff0c;用于最小化损失函数&#xff0c;在机器学习和深度学习领域有着广泛的应用。分别对梯度下降、梯度方向以及参数更新采用负梯度方向的原因进行论述。 1.梯度下降 它的基本思想是通过迭代的方式来更新模型的参数&#xff0c;使得损失函数…

Starrocks入门(二)

1、背景&#xff1a;考虑到Starrocks入门这篇文章&#xff0c;安装的是3.0.1版本的SR&#xff0c;参考&#xff1a;Starrocks入门-CSDN博客 但是官网的文档&#xff0c;没有对应3.0.x版本的资料&#xff0c;却有3.2或者3.3或者3.4或者3.1或者2.5版本的资料&#xff0c;不要用较…

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站&#xff0c;想分享给大家。 在学习和工作的过程中&#xff0c;想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量&#xff0c;但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录 1. JVM内存模型2. 常量池中有什么类型&#xff1f;3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗&#xff1f;6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…

DeepSeek模型昇腾部署优秀实践

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…

python编写liunx服务器登陆自动巡检脚本

前言&#xff1a; 用户需要一份用Python编写的Linux系统巡检脚本&#xff0c;检查内存、磁盘、CPU使用率&#xff0c;还有网络连通性。 首先&#xff0c;我得确定用户的使用场景。可能用户是系统管理员&#xff0c;需要定期监控服务器状态&#xff0c;确保系统正常运行。 或者…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏&#xff0c;本文将通过鸿蒙 ArkUI 框架的实现代码&#xff0c;逐步解析其核心技术点&#xff0c;包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块&#xff1a; ├── entry…

ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)

ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类&#xff0c;主要文件的用途如下&#xff1a;   Attributes文件夹保存特性类或过滤器类定义&#xff0c;主要包括&#xff1a;   …

Mysql表字段字符集未设置导致乱码问题

项目场景&#xff1a; 在使用mysql的text类型作为字段类型【未设置编码】&#xff0c;且表结构【设置了编码集】的条件下&#xff0c;查询表这个字段会出现乱码的情况。 问题描述 今日测试小伙伴给题主提出了一个bug&#xff0c;数据库当中的text文本字段在存储json的情况下&…

staruml绘制时序图和用例图

文章目录 1.文章介绍2.绘制用例图3.绘制时序图 1.文章介绍 之前&#xff0c;我们初步介绍了这个staruml软件的安装和如何使用这个软件对于uml类图进行绘制&#xff0c;当时我们是绘制了这个user类&#xff0c;实现了相关的接口&#xff0c;表示他们之间的关系&#xff0c;在今…

火狐浏览器多开指南:独立窗口独立IP教程

无论是跨境电商从业者需要管理多个店铺账号&#xff0c;还是海外社交媒体营销人员要运营多个社交平台账号&#xff0c;亦或是从事多账号广告投放的人员&#xff0c;都面临着一个共同的挑战 —— 如何高效管理多个账号&#xff0c;并确保每个账号的独立性。 在这种情况下&#…