selenium测试框架快速搭建(UI自动化测试)

news2024/11/24 17:07:55

一、介绍
        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代码

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

十七、生产报告

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

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

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

相关文章

【力扣刷题 | 第十五天】

目录 前言&#xff1a; ​​​​​​​63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 本篇我们主要刷动态规划的题&#xff0c;解题还是严格按照我们在【夜深人静写算法…

Linux查看文件大小

1、Linux下查看文件和文件夹大小 当磁盘大小超过标准时会有报警提示&#xff0c;这时如果掌握df和du命令是非常明智的选择。 df可以查看一级文件夹大小、使用比例、档案系统及其挂入点&#xff0c;但对文件却无能为力。 du可以查看文件及文件夹大小。 两者配合使用&#xf…

UE中创建可脚本化编辑器工具(Scriptable Tools)

UE5.2中提供了可脚本化工具编辑模式&#xff0c;该模式下用户可以编写蓝图节点自定义界面操作模式下的逻辑&#xff0c;例如重写鼠标点击事件&#xff0c;制作自定义画刷等。 如果你不太了解UE编辑器工具&#xff0c;可以参考这篇文章&#xff1a; https://blog.csdn.net/gray…

chatgpt赋能python:Python编程计算一元二次方程——最简单的方法实现

Python编程计算一元二次方程——最简单的方法实现 前言 Python编程语言是一种优秀的开源编程语言&#xff0c;具有易于学习、代码简洁明了、易于维护等优点&#xff0c;因此在近年来得到了广泛的应用。 本文将介绍如何使用Python编写一个简单而又实用的计算一元二次方程的程…

华为认证哪个方向考的人多?考试费用是多少?

从学校毕业后&#xff0c;就要走上社会了&#xff0c;很多人就要面临就业困难&#xff0c;对于信息通信行业的人来说&#xff0c;考一份技术证书&#xff0c;是可以帮助自己提高职业竞争力、获得好工作的方法。华为云认证是华为云旗下的认证&#xff0c;其设立时间长&#xff0…

多线程爬虫实战-思路

前言 最近有很多小伙伴找到我&#xff0c;说想要王者荣耀所有英雄皮肤的照片&#xff0c;但是又不想自己去下载&#xff0c;正好借这个机会给大家讲解一下多线程的爬虫实战 由于线程爬虫会对任何服务器都有一定的影响&#xff0c;本文仅供学习交流使用&#xff0c;切勿拿去做什…

PID原理及仿真程序套用(matlab仿真与图像处理系列第3期)

PID控制器模拟器 概述: PID控制器是一种常用的反馈控制算法,用于实现系统输出与期望值之间的精确调节。PID控制器模拟器是一个工具,可以模拟和测试PID控制器的性能,并对系统进行调整和优化。 输入参数: setpoint:期望值或目标值process_variable:过程变量或实际测量…

go中map哈希表使用总结

作者&#xff1a;程序员CKeen 博客&#xff1a;http://ckeen.cn​​​​​​​ 长期坚持做有价值的事&#xff01;积累沉淀&#xff0c;持续成长&#xff0c;升维思考&#xff01;希望把编码做为长期爱好&#x1f604; 在 Go 语言中&#xff0c;map是一种基于哈希表实现的数据结…

设计模式之解释器模式笔记

设计模式之解释器模式笔记 说明Interpreter(解释器)目录解释器模式示例类图抽象表达式类环境角色类封装变量的类加法表达式类减法表达式类测试类 说明 记录下学习设计模式-解释器模式的写法。JDK使用版本为1.8版本。 Interpreter(解释器) 意图:定义一个语言&#xff0c;定义…

chatgpt赋能python:Python编程:如何将程序变成软件

Python编程&#xff1a;如何将程序变成软件 Python是一种非常流行的编程语言&#xff0c;因为它具有简单易学、高效和灵活等优点。许多人使用Python编写程序&#xff0c;但他们可能不知道如何将这些程序变成可执行的软件。在本文中&#xff0c;我们将介绍Python程序如何成为软…

【C/C++数据结构】链表与快慢指针

目录 一、单链表 二、双向循环链表 三、判断链表是否带环 四、链表的回文结构判断 五、复制带随机指针的链表 一、单链表 优点&#xff1a;头部增删效率高&#xff0c;动态存储无空间浪费 缺点&#xff1a;尾部增删、遍历效率低&#xff0c;不支持随机访问节点 头结点&…

【Linux | Shell】bash shell 基础命令

目录 一、概述二、启动shell2.1 用户的默认 Shell 程序2.2 Shell 提示符 三、 基础命令3.1、man 命令3.2、cd 命令3.3、ls命令 一、概述 很多 Linux 发行版的默认 shell 是 GNU bash shell。本文将介绍 bash shell 的基本特性&#xff0c;比如 bash 手册、命令行补全以及如何显…

JavaWeb 第一个Servlet程序

1.Servlet Servlet是Java编写的用于Web应用程序的服务器端程序。 它可以接收来自Web浏览器的HTTP请求并生成响应。 Servlet通常用于创建动态Web内容&#xff0c;例如网页、表单处理、登录和数据库访问等。 Servlet是Java EE&#xff08;Enterprise Edition&#xff09;规范…

[补充]托福口语21天——day2 课堂内容

day1 课堂&#xff1a;http://t.csdn.cn/cyvZm day1 语料&#xff1a;http://t.csdn.cn/syTBy 目录 1 时间准备 2 例题 3 答题步骤 3.1 范例 3.2 范例 4 连接词 5 完整回答 5.1 范例 5.2 范例 6 总结 背背背&#xff01; 1. 如今的生活成本非常高。人们要付…

学习系统编程No.25【核心转储实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/16/8:39&#xff0c;实训课中&#xff0c;大一下学期最后有课的一天&#xff0c;还有两天就要期末考啦&#xff01;目前什么都还没有复习&#xff0c;不到星期天晚上&#xff0c;咱不慌&#xff0c;小小挂科&#xff0c;岂能拦得…

postgresql_internals-14 学习笔记(六)—— 统计信息

不完全来自这本书&#xff0c;把查到的和之前的文章重新汇总整理了一把。 一、 统计信息的收集 1. 主要参数 其中最主要的是track_counts&#xff0c;开启才会收集统计信息。 postgres# select name,setting,short_desc,context from pg_settings where name like track%; na…

LeetCode 周赛 351(2023/06/25)T2 有点意思

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 往期回顾&#xff1a;LeetCode 单周赛第 348 场 数位 DP 模版学会了吗&#xff1f; T1. 美丽下标对的数目&#xff08;Easy&#xff09; 标签&am…

python爬虫并做可视化分析--前程无忧

一.数据采集 1.采集逻辑 2.数据schema 招聘信息Schema { "岗位名称": "财务会计主管", "薪资":"1.3-2万", "地址": "*******", "经验要求": "5-7年", "公司名": "***…

JDK8新特性-上部

文章目录 一、Java发展史1.1 发展史1.2 OpenJDK和OracleJDK1.3 Open JDK 官网介绍 二、Lambda表达式2.1 需求分析2.2 Lamada表达式的体验2.3 Lambda表达式的语法规则2.3.1 Lambda表达式练习2.3.2 Lambda表达式练习 2.4 Lambda表达式的使用前提2.5 FunctionalInterface注解2.6 L…

MATLAB | 如何使用MATLAB获取顶刊《PNAS》绘图(附带近3年图像)

千呼万唤始出来&#xff0c;《PNAS》绘图获取的代码来啦&#xff0c;不过这次研究了半天也没想到如何获取付费文章的绘图&#xff0c;就只下载了免费文章(主要也怕侵权)&#xff0c;不过光免费文章的图片三年了也有接近1.7w张了&#xff0c;同时使用代码下载时依旧需要科学上网…