selenium测试框架快速搭建详解

news2024/9/30 19:12:13

一、介绍

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控制浏览器。

三、脚本实例 

  1. from selenium import webdriver

  2. import time

  3. #打开浏览器

  4. driver = webdriver.Chrome()

  5. #浏览器最大化

  6. driver.maximize_window()

  7. # 打开baidu

  8. driver.get("http://www.baidu.com")

  9. #打印浏览器地址

  10. print(driver.current_url)

  11. #打印网页标题

  12. print(driver.title)

  13. #暂停一会,3 秒

  14. time.sleep(3)

  15. #关闭当前窗口

  16. driver.close()

  17. #关闭整个浏览器,并且关闭驱动chromedriver

  18. 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')

  1. #打开百度,输入软件测试,点击百度一下

  2. driver.find_element_by_id('kw').send_keys('软件测试')

  3. driver.find_element_by_id('su').click()

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

  1. #输入selenium 自动化,点击百度一下

  2. driver.find_element_by_name('wd').send_keys('selenium自动化')

  3. #百度一下按钮没提供名字

  4. 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性能。

  1. #打开百度页面,把百度一下 改成 test

  2. driver.get("http://www.baidu.com")

  3. driver.execute_script('document.getElementById("su").value = "test"')

七、窗口切换

浏览器窗口切换:

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

  1. # 当前窗口url地址:

  2. print(driver.current_url)

  3. #暂停一会,10 秒

  4. time.sleep(10)

  5. # 打印所有窗口句柄

  6. windows = driver.window_handles

  7. print(windows,'\n')

  8. #切换到最后的窗口

  9. driver.switch_to.window(windows[-1])

  10. #打印url,核对下是不是最后的窗口;或者根据网页名等校验

  11. print(driver.current_url)

  12. print('\n\n')

  13. time.sleep(3)

  14. #切换到第二个窗口

  15. #先获取现在的窗口

  16. current_window = driver.current_window_handle

  17. # 获取第二个窗口的索引(由当前窗口索引+1)

  18. next_window_index = windows.index(current_window) + 1

  19. # 切换到第二个窗口

  20. driver.switch_to.window(windows[next_window_index])

  21. print(driver.current_url)

iframe切换:

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

  1. <iframe src="frame.html" id="myframe" name="myframe">

  2. <input id="kw" / >

  3. </iframe>

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

  1. from selenium import webdriver

  2. driver = webdriver.Chrome()

  3. # 通过id切换iframe

  4. driver.switch_to.frame('myframe')

  5. # 通过name切换iframe

  6. # driver.switch_to.frame('myframe')

  7. # 通过index切换iframe,0代表第一个

  8. # driver.switch_to.frame(0)

  9. # 通过WebElement对象切换iframe

  10. # 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界面,

  1. #切换到alert窗口 ;获取alert 窗口

  2. alert= driver.switch_to_alert

  3. #获取alert的文本内容

  4. print(alert.text)

  5. #点击确定,关闭弹框

  6. alert.accept()

  7. #点击取消,关闭弹簧

  8. alert.dismiss()

八、鼠标经过操作

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

from selenium.webdriver.common.action_chains import ActionChains

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

  1. from selenium.webdriver.common.action_chains import ActionChains

  2. from selenium import webdriver

  3. chr_driver = webdriver.Chrome()

  4. chr_driver.maximize_window()

  5. chr_driver.get("https://www.baidu.com/")

  6. ele = chr_driver.find_element_by_id('su')

  7. # 实例化,悬浮、点击,可以连续调用多个方法,是因为返回的都是self对象

  8. ActionChains(chr_driver).move_to_element(ele).pause(0.5).click(ele).perform()

ActionChains的常用方法:

  1. #单击鼠标左键

  2. click(on_element=None)

  3. #点击鼠标左键,不松开

  4. click_and_hold(on_element=None)

  5. #点击鼠标右键

  6. context_click(on_element=None)

  7. #双击鼠标左键

  8. double_click(on_element=None)

  9. #拖拽到某个元素然后松开

  10. drag_and_drop(source, target)

  11. #拖拽到某个坐标然后松开

  12. drag_and_drop_by_offset(source, xoffset, yoffset)

  13. #按下某个键盘上的键

  14. key_down(value, element=None)

  15. #松开某个键

  16. key_up(value, element=None)

  17. #鼠标移动到某个元素,悬浮

  18. move_to_element(to_element)

  19. #执行链中的所有动作

  20. perform()

九、拖拽

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

  1. from selenium.webdriver.common.action_chains import ActionChains

  2. #打开浏览器

  3. driver = webdriver.Chrome()

  4. #浏览器最大化

  5. driver.maximize_window()

  6. #打开百度地图

  7. driver.get('https://map.baidu.com/@12697919.69,2560977.31,12z')

  8. #定位地图

  9. mask = driver.find_element_by_id('mask')

  10. #动作

  11. ac = ActionChains(driver)

  12. 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)

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

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

  2. 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):在警告框中输入内容
 

  1. #打印警告框中的文本信息

  2. print(swtch_to.alert.text)

  3. #在警告框中点击确定

  4. driver.swtch_to.alert.accept()

  5. #在警告框中点击取消

  6. driver.swtch_to.alert.dismiss()

  7. #在警告框中输入内容 100块

  8. 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():通过选项的文本值选择

  1. #定位下拉框,内容是省份

  2. s = driver.find_element_by_id('province')

  3. #获取下拉框里的所有选项内容

  4. opt = Select(s).options

  5. #通过索引选择;若是通过value选择,则html代码要写有value属性

  6. Select(s).select_by_index(-1)

十五、ActionChains 动作链

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

调用方法有两种:

  1. #链式写法

  2. ActionChains(driver).click(click_btn).double_click(doubleclick_btn).perform()

  3. #分步写法

  4. ActionChains(driver).click(click_btn)

  5. ActionChains.double_click(doubleclick_btn)

  6. ActionChains.perform()

ActionChains常用方法:

  1. click(on_element=None) ——单击鼠标左键

  2. click_and_hold(on_element=None) ——点击鼠标左键,不松开

  3. context_click(on_element=None) ——点击鼠标右键

  4. double_click(on_element=None) ——双击鼠标左键

  5. drag_and_drop(source, target) ——拖拽到某个元素然后松开

  6. drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

  7. key_down(value, element=None) ——按下某个键盘上的键

  8. key_up(value, element=None) ——松开某个键

  9. move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

  10. move_to_element(to_element) ——鼠标移动到某个元素

  11. move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

  12. perform() ——执行链中的所有动作

  13. release(on_element=None) ——在某个元素位置松开鼠标左键

  14. send_keys(*keys_to_send) ——发送某个键到当前焦点的元素

  15. send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

十六、table表格处理

table表格代码如下:

  1. <table border="1">

  2. <tr>

  3. <td>row 1, cell 1</td>

  4. <td>row 1, cell 2</td>

  5. </tr>

  6. <tr>

  7. <td>row 2, cell 1</td>

  8. <td>row 2, cell 2</td>

  9. </tr>

  10. </table>

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

  1. #获取table

  2. table = driver.find_elements_by_id('table')

  3. #获取 tr

  4. tr = table.find_elements_by_tag_name('tr')

  5. #获取td

  6. td = tr[1].find_elements_by_tag_name('td')

  7. #输出内容

  8. print(td[1].text)

十七、生产报告

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

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的软件测试八股文,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

拯救华为秘盒M310

这个盒子当年宣传得比较厉害&#xff0c; 当时确实也没有什么可选的&#xff0c;当年是高价入的,这个盒子有二切一的hdmi切换功能&#xff0c; 这点从今天来看&#xff0c; 都是一个亮点 华为秘盒M310是一款小巧但功能强大的网络机顶盒。它搭载了基于安卓系统的操作平台&#x…

序列化方式四——Hessian

介绍 Hessian是一个轻量级的、基于HTTP的RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;由Resin开源提供。它使用一个简单的、基于二进制的协议来序列化对象&#xff0c;并通过HTTP进行传输。Hessian的设计目标是提供一种高效、可靠且易于使用的远程服务调用机制。…

算法分析——《二分查找》

&#x1f6e9;《二分查找》 &#x1f3a8;题目描述&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 …

厦门大龄自闭症寄宿学校:为孩子们提供全方位关怀和教育

在自闭症儿童的教育与关怀领域&#xff0c;厦门大龄自闭症寄宿学校以其专业性和全面性&#xff0c;为众多家庭提供了宝贵的支持与帮助。而在中国南方的广州&#xff0c;也有一所同样致力于自闭症儿童全方位关怀与教育的机构——星贝育园自闭症儿童寄宿制学校。星贝育园以其独特…

为什么要自定义异常

背景 我们在阅读各类源码时&#xff0c;会注意到几乎各个功能包中&#xff0c;都包含有自定义的异常&#xff1b;那有没有想过&#xff0c;JDK的源码中&#xff0c;已经定义了各种异常体系&#xff0c;为啥后续的一些依赖Jar包中&#xff0c;还要自定义异常呢&#xff1f; 下面…

Java应用程序的服务器有哪些?

1.Tomcat、Jetty 和 JBoss 区别&#xff1f; Apache Tomcat、Jetty 和 JBoss都是用于部署Java应用程序的服务器&#xff0c;它们都支持Servlet、JSP和其他Java EE&#xff08;现在称为Jakarta EE&#xff09;技术。尽管它们有一些相似的功能&#xff0c;但它们之间还是存在一些…

二叉树相关oj题(Java)

一. 检查两颗树是否相同。OJ链接 这里我们考虑两种情况: 1.结构上 2.节点值上 当上面两种情况同时遍历时: 1.如果两颗树的节点都不为空,就判断值 2.如果两棵树种一棵树的节点为空另一棵树的节点不为空,则这两颗肯定不是相同的树 整体来看:要判断两棵树是否相同,得判断根,然后判…

SQLite数据库迁移与备份技术详解

目录 引言 SQLite数据库迁移 迁移概述 迁移步骤 1. 创建目标数据库系统 2. 导出SQLite数据库数据 3. 导入数据到目标数据库 4. 验证数据迁移 迁移注意事项 SQLite数据库定期备份 备份的重要性 备份方法 1. 使用VACUUM命令 2. 使用ATTACH DATABASE和PRAGMA语句 3.…

这些211热度不高,毕业年薪20-40万!自动化考研择校

这些211学校&#xff0c;今年热度不高&#xff0c;就业还意外的好&#xff0c;一定不要错过&#xff01;搭配历年数据&#xff0c;供大家参考~ 目录 ① 华东理工大学 ② 东华大学 ③ 江南大学 ④ 安徽大学 ① 华东理工大学 复试线招生人数 控制学科等级为B&#xff0c;上…

Qt QIntValidator详解

一、介绍 QIntValidator是Qt框架中用于验证整数输入的验证器类。它可以限制用户输入的整数范围&#xff0c;确保输入的整数在指定的范围内。通过QIntValidator&#xff0c;可以轻松地实现整数输入的有效性和范围限制。 二、 常用方法 QIntValidator(QObject *parent Q_NULLPT…

Python编码系列—Python设计模式的选择与权衡:打造高效代码架构

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

SigmaStudio中部分滤波器算法有效性频谱分析

一、各类滤波器参数如下图设置 1.1、输入源白噪音经过如下算法处理后Notch\Band Pass\Band Stop&#xff0c;如下频谱分析图 1.2、输入源白噪音经过low pass后处理前后的频谱分析如如下 二、Notch滤波器配置图&#xff0c;如下 2.1、两串联、五个串联和未串联的Notch对白噪音…

券商股大涨,至少17家券商已入局AI人工智能金融大模型

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 最近&#xff0c;券商股价的大涨成为了财经…

鲜花配送小程序开发制作方案

鲜花配送小程序系统通过用户端、商家端和配送员端的协同工作&#xff0c;确保鲜花能够在指定时间内送达&#xff0c;提升用户满意度和忠诚度。 目标用户 个人消费者&#xff1a;生日、纪念日、节日等特殊场合送花的人群。 企业客户&#xff1a;需要定期为办公场所或活动提供花…

低至1元/小时:国庆七天,30元通关《黑神话:悟空》!

目录 前言 一、云游戏解决方案的引入 二、服务的核心亮点及性价比 1、高清画质体验 2、广泛的手柄支持 3、隐私与安全性 4、直播推流优势 5、游戏快速启动 6、价格优惠 &#xff08;1&#xff09;新用户专享&#xff0c;低至1元/时&#xff01; &#xff08;2&#…

利用C++优化Chrome浏览器的启动速度

Chrome浏览器是全球使用最广泛的网络浏览器之一&#xff0c;但有时候它的启动速度可能会让人感到不满。为了解决这个问题&#xff0c;我们可以使用C进行一些优化。本文将介绍如何通过关闭预加载功能、设置允许弹出窗口和为网页添加快捷方式来加快Chrome浏览器的启动速度。 &am…

谨防火灾!电瓶车检测算法助力城市/小区/园区多场景安全管理精细化、智能化

随着人工智能技术的快速发展&#xff0c;AI智能分析网关V4在电瓶车检测领域的应用日益广泛。这一技术通过深度学习、计算机视觉等先进算法&#xff0c;实现了对电瓶车及其相关行为的智能识别和分析&#xff0c;为电瓶车的管理和应用提供了强大的技术支持。 一、电瓶车检测算法…

python为姓名注音实战案例

有如下数据&#xff0c;需要对名字注音。 数据样例&#xff1a;&#x1f447; 一、实现过程 前提条件&#xff1a;由于会用到pypinyin库&#xff0c;所以一定得提前安装。 pip install pypinyin1、详细代码&#xff1a; from pypinyin import pinyin, Style# 输入数据 names…

Unreal 对象、属性同步流程

文章目录 类型同步初始化创建 FObjectReplicator创建 FRepLayout、Cmd、ShadowOffset创建 FRepChangedPropertyTracker、FRepState创建 FReplicationChangelistMgr、FRepChangelistState、ShadowBuffer 属性同步属性变化检测查找变化属性&#xff0c;写入ShadowMemory发送数据 …

如何在Code::Blocks中集成EasyX库?

EasyX库是一个轻量级的C图形库&#xff0c;专为Windows平台设计&#xff0c;适用于图形编程初学者&#xff0c;特别是少儿编程或编程启蒙阶段。使用EasyX库&#xff0c;用户可以在C环境下快速绘制简单的图形、动画等视觉效果。本文将详细介绍如何在Code::Blocks中集成EasyX库&a…