利用pytest+selenium编写网页UI自动化脚本和用例

[复制链接]
发表于 2026-2-8 23:01:31 | 显示全部楼层 |阅读模式



1 UI自动化测试

UI自动化测试(User Interface Automation Testing)是一种通过编写脚本或利用自动化测试工具,对界面(UI)举行自动化测试的方法。原理重要是模拟用户打开客户端或网页的UI界面,自动化实行用户界面上的利用,如点击按钮、输入文本、选择但下拉框/单选,多选项等,并查抄测试对象的相应运动是否符合预期。
比如一些常用的测试框架大概工具(robotframework,testng,pytest,selenium,appnium,playwright等)都支持UI界面的自动化测试,而这节内容重要先容下pytest框架+selenium工具在web端的自动化实践。

                                                                        测试分层
2 安装所需的python包

pytest安装

利用pip下令安装: pip install pytest -i https://mirrors.aliyun.com/pypi/simple/
selenium安装

利用pip下令安装: pip install selenium -i https://mirrors.aliyun.com/pypi/simple/
如今最新版本4.23.1,须要适配python版本3.8+及以上版本
PS:安装在pytest工程所运行的python情况,python的安装目次大概捏造情况目次,可以参考之前文章检察运行情况pycharm设置pytest运行情况)
3 selenium先容

Selenium是一个用于Web应用步调的自动化测试工具,支持多平台(Windows、Linux和Mac)、多欣赏器(IE,Mozilla Firefox、Safari、Google Chrome、Opera、Edge)、多语言(Java、Python、C#、JavaScript、Ruby),可以大概让测试脚本像真实用户一样在欣赏器中利用。
核心组件:
Selenium IDE:Selenium Suite下的开源Web自动化测试工具,是Firefox的一个插件,具有纪录和回放功能,无需编程即可创建测试用例。
Selenium WebDriver:Selenium 2.0及以后版本的核心,通过原生欣赏器支持或欣赏器扩展直接控制欣赏器,取代了Selenium RC中的JavaScript注入技能。
Selenium Grid:一种自动化测试辅助工具,可以大概加快Web应用的功能测试,支持并行实行多个测试事例。
3.1 设置利用体系情况支持利用selenium打开欣赏器

以下先容以在mac体系上设置打开safari欣赏器和谷歌欣赏器举例。
设置MAC体系safari欣赏器支持selenium打开

safari欣赏器从10及以上版本通常内置了对WebDriver的支持,不须要下载欣赏器的驱动,但是须要设置欣赏器支持利用selenium打开。假如不设置实行步调会报以下错误:

设置步调:
打开Safari欣赏器。
点击菜单栏上的“Safari欣赏器”,然后选择“偏好设置”(Preferences)。
在偏好设置窗口中,点击“高级”(Advanced)标签页。
勾选“在菜单栏中表现‘开发’菜单”(Show Develop menu in menu bar)。
关闭偏好设置窗口,然后点击菜单栏上的“开发”(Develop)菜单。
勾选“答应远程自动化”(Allow Remote Automation)。



设置后我们利用selenium打开safari欣赏器

起首导入selenium.webdriver,然后我们打开欣赏器,等候一段时间后利用quit函数退出欣赏器。
  1. from selenium import webdriver
  2. import time
  3. # 创建Safari浏览器的WebDriver实例
  4. driver = webdriver.Safari()
  5. # 打开一个网页
  6. driver.get("https://www.baidu.com")
  7. #打开后等待60s退出
  8. time.sleep(60)
  9. # 关闭浏览器
  10. driver.quit()
复制代码
python步调实行后,结果如下:会自动打开欣赏器输入百度网址,完成访问。

设置MAC体系支持selenium打开google欣赏器

google欣赏器不像safari欣赏器,利用前我们先要下载驱动步调(下载所在https://chromedriver.storage.googleapis.com/index.html「链接」),驱动步调的版本要跟欣赏器的版本划一,比如欣赏器是127版本,驱动步调也要下载127的版本。(不外如今还不能下载127的版本,最多是114版本。)

下载后解压,并将步调chromedriver放到/usr/local/bin目次下,并实行下令赋予权限:sudo xattr -d com.apple.quarantine chromedriver。否则无权限通过selenium打开后会报如下错误:

设置后我们利用selenium打开google欣赏器

起首导入selenium.webdriver,然后我们打开欣赏器,等候一段时间后利用quit函数退出欣赏器。
  1. from selenium import webdriver
  2. from time import sleep
  3. # 创建Safari浏览器的WebDriver实例
  4. driver = webdriver.Chrome()
  5. # 打开一个网页
  6. driver.get("https://www.baidu.com")
  7. # 等待几秒钟以便观察浏览器行为
  8. sleep(60)
  9. # 关闭浏览器
  10. driver.quit()
复制代码
3.2 selenium的常用元素定位方法

通常利用find_element方法定位页面元素,函数源代码如下:实用selenium4.23.1版本

函数中的参数by体现定位元素的方式,在库
selenium.webdriver.common.by.By中界说如下:

函数中的参数value体现by方式对应的值。
也就是说find_element函数可以通过以下8种方式举行元素定位:
["id", "xpath", "link text", "partial link text", "name", "tag name", "class name", "css selector"]
3.3 selenium获取元素后的利用方法

当我们获取到元素后,我们可以在对应的元素位置,输入文本,点击按钮等。
重要方法有:
1. 文本输入与扫除
send_keys():在元素上模拟按键输入,通常用于向输入框中添补文本。
clear():扫除元素的输入内容,如清空一个文本输入框。
2. 点击利用
click():单击元素,可以是按钮、链接等可点击的元素。
3. 表单提交
submit():提交表单,也可以利用click()方法,但submit()方法专门用于表单的提交。
4. 元素属性与状态获取
get_attribute(element_name):获取元素的属性值,如id、name、type等。
is_selected():判定元素是否被选中,常用于单选框、复选框等。
is_displayed():判定元素是否可见,返回一个布尔值。
is_enabled():判定元素是否可启用,比方,某些按钮在特定条件下大概不可点击。
5. 鼠标与键盘利用
ActionChains 类:Selenium的ActionsChains类提供了更复杂的鼠标和键盘利用,如鼠标悬停(move_to_element)、双击(double_click)、右击(context_click)等。
6. 获取元素尺寸与位置
size:返回元素的尺寸,通常包罗宽度和高度。
location:返回元素在页面上的位置,通常是元素的左上角坐标。
7. 获取元素文本
text:获取元素的文本内容,如获取一个段落或链接的文本。
8 页面利用
refresh():革新当前页面。
back() 和 forward():模拟欣赏器的退却和进步利用。
maximize_window() 和 minimize_window():最大化或最小化欣赏器窗口。
9 窗口利用
window_handles:一个属性,体现打开的每个欣赏器窗口的句柄,每个窗口都有一个唯一的标识;返回的是一个列表
current_window_handle:一个属性,当前窗口的句柄。
switch_to.window: 通过SwitchTo类的window函数可以切换窗口。
3.4 打开百度输入文本后点击搜刮

以打开百度网站,输入文本并点击搜刮为例先容下怎样查找界面元素
我们以获取元素的id举例,先上代码:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from time import sleep
  4. # 创建Safari浏览器的WebDriver实例
  5. driver = webdriver.Safari()
  6. # 打开一个网页
  7. driver.get("https://www.baidu.com")
  8. #最大化网页
  9. driver.maximize_window()
  10. #查找id=kw的元素位置,对应于搜索输入框,找到后我们输入字符python
  11. driver.find_element(By.ID,'kw').send_keys('python')
  12. ##查找id=su的元素位置,对应于‘百度一下’的按钮,找到后我们点击按钮
  13. driver.find_element(By.ID,'su').click()
  14. # 等待几秒
  15. sleep(60)
  16. # 关闭浏览器
  17. driver.quit()
复制代码
代码实行后,网页自动打开并搜刮如下:

3.5 切换窗口

以百度网站间隔,打开消息链接,然后切换窗口
  1. driver = webdriver.Safari()
  2. # 打开一个网页
  3. driver.get("https://www.baidu.com")
  4. driver.maximize_window()
  5. sleep(2)
  6. #打开新闻链接
  7. driver.find_element(By.LINK_TEXT,'新闻').click()
  8. #打印文件句柄
  9. print(driver.window_handles)
  10. #循环切换窗口
  11. while True:
  12.     for i in driver.window_handles:
  13.         sleep(1)
  14.         driver.switch_to.window(i)
复制代码
步调实行后,会打开消息,然后来回切换两个窗口

3.6 打开百度输入用户名和暗码举行登录(表单利用)

代码如下:
  1. driver = webdriver.Safari()
  2. # 打开一个网页
  3. driver.get("https://www.baidu.com")
  4. driver.maximize_window()
  5. sleep(1)
  6. #点击登录
  7. driver.find_element(By.ID,'s-top-loginbtn').click()
  8. sleep(1)
  9. #输入用户名
  10. driver.find_element(By.ID,'TANGRAM__PSP_11__userName').send_keys('*****')
  11. sleep(1)
  12. #输入密码
  13. driver.find_element(By.ID,'TANGRAM__PSP_11__password').send_keys('*****')
  14. sleep(1)
  15. #点击同意
  16. driver.find_element(By.ID,'TANGRAM__PSP_11__isAgree').click()
  17. sleep(1)
  18. #点击提交
  19. driver.find_element(By.ID,'TANGRAM__PSP_11__submit').submit()
复制代码
步调实行后,自动输入用户名和暗码,然后登录
​​​​​​​
3.7 先容下元素的查找方法

打开网页后,通过查找元素,找到输入框和百度一下按钮对应元素信息。


  • 输入框的元素信息:<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
      Xpath相对路径为://*[@id="kw"]




  • 百度一下按钮的元素信息:
<input type="submit" id="su" value="百度一下" class="bg s_btn">
Xpath相对路径为://*[@id="su"]

通过以上元素信息我们就拿到了输入框和百度一下按钮的id信息,然后获取后输入文本和点击按钮,就完成了一次查找和点击的动作。
固然我们除了通过id获取元素,也可以通过name,xpath等方式利用,各人不妨多试下。
比如上面点击‘百度一下’按钮,除了上面id的方式,还可以如下:
  1. #class name方式
  2. driver.find_element(By.CLASS_NAME,'bg.s_btn').click()
  3. #xpath的全路径
  4. driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input').click()
  5. #xpath的相对路径
  6. driver.find_element(By.XPATH,'//*[@id="su"]').click()
复制代码
百度登录干系的元素信息:


  • 点击登录

<a class="s-top-login-btn c-btn c-btn-primary c-btn-mini lb
btn-fixed"style="position:relative;overflow:visible;id="s-top-loginbtn" href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5"name="tj_login" οnclick="return false;">登录</a>


  • 用户名:

<input id="TANGRAM__PSP_11__userName" type="text" name="userName" class="pass-text-input pass-text-input-userName" autocomplete="off" value="" placeholder="手机号/用户名/邮箱">


  • 暗码:

<input id="TANGRAM__PSP_11__password" type="password" name="password" class="pass-text-input pass-text-input-password" autocomplete="off" value="" placeholder="暗码">​​​​​​​


  • 阅读并继续选项:

<input name="isAgree" id="TANGRAM__PSP_11__isAgree" type="checkbox" class="pass-checkbox-input pass-checkbox-isAgree" autocomplete="off">


  • 登录按钮:

<input id="TANGRAM__PSP_11__submit" type="submit" value="登录" class="pass-button pass-button-submit pass-button-full-disabled" disabled="">

4 pytest框架实现selenium自动化用例

在pytest框架下我们创建1条测试用例,在百度查找内容后,校验下输入框中的内容是不是我们之前输入的内容,具体代码如下:
  1. import pytest
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from time import sleep
  5. def test_1():
  6.         driver = webdriver.Safari()
  7.         # 打开一个网页
  8.         driver.get("https://www.baidu.com")
  9.         driver.maximize_window()
  10.         driver.find_element(By.ID, 'kw').send_keys('python')
  11.         driver.find_element(By.ID, 'su').click()
  12.         sleep(1)
  13.         #断言
  14.         assert driver.find_element(By.ID, 'kw').get_attribute('value') == 'python'
  15.         #等待几秒钟
  16.         sleep(5)
  17.         #关闭浏览器
  18.         driver.quit()
复制代码
用例实行的结果为通过。
我们将用例改造下,通过设置fixture函数来实现用例的setup和teardown动作,并在用例中实现参数化,增长多个搜刮的文本。fixture函数的利用先容请参考之前文章fixture函数先容。
  1. @pytest.fixture()
  2. def open_close_web():
  3.         driver = webdriver.Safari()
  4.         # 打开一个网页
  5.         driver.get("https://www.baidu.com")
  6.         driver.maximize_window()
  7.         yield driver
  8.         # 关闭浏览器
  9.         driver.quit()
  10. @pytest.mark.parametrize('text',['python','pytest'])
  11. def test_1(text,open_close_web):
  12.         open_close_web.find_element(By.ID, 'kw').send_keys(f'{text}')
  13.         open_close_web.find_element(By.ID, 'su').click()
  14.         sleep(1)
  15.         assert open_close_web.find_element(By.ID, 'kw').get_attribute('value') == f'{text}'
复制代码
PS:以上代码都是颠末当地实际测试通过,各人可自利用用。
总结:本章我们扼要先容了利用python库selenium在pytest框架下的UI自动化脚本和用例的编写调试过程,各人可以在线下多多实践,固然对于大型的项目,我们还要规划好整个测试用例和脚本目次结构,方便后续维护。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不绝地滴,可以滴穿石头;
-----比喻对峙不懈,集渺小的气力也能结果难能的功劳。
----感谢读者的阅读和学习,点个赞和关注吧,谢谢各人。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表