跳转至

最后更新:2026-09-04 01:19

实验15 高级操作与Unittest框架

15.1 实验目的

  • 知识目标:理解删除元素属性、submit() 提交表单、滚动条操作、下拉框处理、文件上传、页面截图与 alert 对话框处理的作用与适用场景;理解 Unittest 框架四大组件(TestCase/TestSuite/TestRunner/TestFixture)与执行流程;
  • 技能目标:能用 execute_script 删除 target 属性、用 Select 模块操作下拉框、用 send_keys 上传文件、用 get_screenshot_as_file 截图、处理三种 alert 对话框;能编写继承 unittest.TestCase 的测试用例并用 setUp/tearDown 组织执行;
  • 素养目标:养成「用框架管理用例、批量执行自动出结果」的工程化测试意识。

15.2 实验环境

  1. 操作系统:Windows 10 / Windows 11;
  2. 工具:PyCharm + Python + Selenium;
  3. 浏览器:Chrome;
  4. 被测系统:人力资源综合服务系统(http://192.168.X.XXX/suthr/logon)。

15.3 实验重难点

重点execute_script 执行 JS 删除属性;Select 模块三种选择方法;alert 的 switch_to_alert() 处理;Unittest 的 setUp/tearDown 与用例编写。

难点:文件路径反斜杠处理;alert 类型区分(send_keys 只能用于 prompt);Unittest 中 setUpClass 与 setUp 的区别。

15.4 实验内容

15.4.1 删除页面元素属性

1. 任务描述 用 JavaScript 删除链接的 target 属性,让链接不再弹出新窗口,在同一标签页中打开。

2. 实验步骤

  • 步骤 1:理解原理:HTML 中链接有 target 属性就会新开窗口;删除 target 后就在当前页打开。

  • 步骤 2:记住三步:

1
2
3
4
5
6
# (1) 定位目标链接
login_link = driver.find_element_by_XX("目标")
# (2) 删除 target 属性
driver.execute_script("arguments[0].removeAttribute('target')", login_link)
# (3) 单击
login_link.click()

arguments[0] 表示 JS 字符串后面的第一个参数(即 login_link)的真实值。

为什么要删除 target 属性?

target 属性就像快递单上写的「送到新地址」——链接带了 target 就会新开一个窗口;把它删掉,链接就在当前页面打开,不用来回切换窗口。

常见错误与排错

  • 若删除后仍弹新窗口:确认 removeAttribute('target') 里写的属性名是 target,且定位到的元素是链接本身;
  • execute_script 报错:检查 arguments[0] 与后面传入的元素参数是否一一对应。

  • 步骤 3:完整实例——进入回帖管理页面(不弹新标签页):

删除target属性后同页打开

图 15-1:删除target属性后同页打开
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://192.168.X.XXX/suthr/logon")
driver.implicitly_wait(30)
driver.find_element_by_name("username").send_keys("hrteacher")
driver.find_element_by_name("password").send_keys("123456")
driver.find_element_by_class_name("uppercase").click()     # 登录
driver.find_element_by_link_text("人资工作台").click()
driver.find_element_by_link_text("论坛后台管理").click()
driver.find_element_by_link_text("主题及回帖管理").click()
element = driver.find_element_by_xpath("/html/body/div[4]/div[2]/div/div[2]/div/div/div[2]/div[2]/table/tbody/tr[1]/td[10]/a[2]")
driver.execute_script("arguments[0].removeAttribute('target')", element)  # 删除 target
element.click()   # 在同一标签页进入回帖管理页面

15.4.2 submit() 方法

1. 任务描述submit() 提交表单,代替单击"登录"按钮。

2. 实验步骤

  • 步骤 1:理解:在 form 表单中,只要定位到表单里的任意元素,都可以用 submit() 提交整个表单。

  • 步骤 2:实例:

1
2
3
4
5
6
7
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://192.168.X.XXX/suthr/logon")
driver.find_element_by_name("username").send_keys("hrteacher")
driver.find_element_by_name("password").send_keys("123456")
driver.find_element_by_id("loginBtn").submit()   # 提交登录表单

submit() 和 click() 有什么区别?

submit() 相当于按下表单的「提交回车键」:只要元素在 form 表单里,定位到表单内任意一个元素都能提交整个表单;click() 只是模拟鼠标点那个按钮。如果元素不在 form 表单里,就只能用 click()

常见错误与排错

  • submit() 报错:确认目标元素确实在 form 表单内,否则改用定位到登录按钮的 click()

15.4.3 操作下拉滚动条

1. 任务描述 用键盘方向键或 JavaScript 实现页面滚动条移动。

2. 实验步骤

方式一:连续按方向键

1
2
3
4
5
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

ActionChains(driver).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).perform()
# 按5次下方向键让滚动条下移

方式二:JavaScript 滚动

driver.execute_script("window.scrollTo(0,400)")
# (0,400) 中 0 是横向坐标,400 是纵向坐标

实例:登录后进入"人资工作台",用 JS 把页面纵向滚动到 400:

1
2
3
driver.find_element_by_class_name("uppercase").click()   # 登录
driver.find_element_by_link_text("人资工作台").click()
driver.execute_script("window.scrollTo(0,400)")          # 滚动条移动

按方向键和 JS 滚动,哪种更常用?

按方向键是「一下一下挪」,模拟的是人的操作;window.scrollTo(0,400) 是「一步到位跳到指定坐标」,精准且不受页面响应快慢影响——实际脚本里 JS 滚动更常用。

常见错误与排错

  • 若页面没滚动:检查 scrollTo(0,400) 的两个坐标——第 1 个是横向、第 2 个是纵向,别写反;要纵向滚动就改第 2 个数。

15.4.4 下拉框处理(三种方法)

页面下拉框select元素

图 15-2:页面下拉框select元素

1. 任务描述 在"员工信息管理"页面选择"政治面貌",掌握下拉框的三种处理方式。

2. 实验步骤

方法一:option 标签定位

driver.find_elements_by_tag_name("select")[1].click()   # 打开下拉框
driver.find_elements_by_tag_name("option")[8].click()   # 选择"其他"

方法二:xpath 层级标签定位

driver.find_element_by_xpath("/html/body/div[4]/div[2]/div/div[2]/div[2]/div/div/form/div/div[1]/div/div[3]/select/option[6]").click()

方法三:Select 模块(推荐,最专业)

1
2
3
4
5
6
7
8
from selenium.webdriver.support.select import Select

select = driver.find_element_by_id("dictPoliticalStatus")   # 定位下拉框
Select(select).select_by_visible_text("其他")               # 按文本选"其他"

# 其他方法:
# Select(select).select_by_index(2)        # 按索引
# Select(select).select_by_value("261")    # 按 value 值

三种方法怎么选?

Select 模块最规范、最不易错。索引(index)从 0 开始;value 是 option 的 value 属性;visible_text 是页面上显示的文字。

常见错误与排错

  • 若 Select 模块报错:确认定位到的元素确实是 select 标签(下拉框本体),而不是某个 option
  • 若用方法一/二没反应:页面结构一变,下标和 xpath 就会失效,优先改用 Select 模块。

15.4.5 文件上传

1. 任务描述 定位上传按钮的 input 标签,用 send_keys 填入本地文件路径完成上传。

2. 实验步骤

  • 步骤 1:理解:Selenium 上传文件的关键是思路——定位 <input type="file"> 后,用 send_keys 直接填本地路径(不需要操作 Windows 弹窗)。

  • 步骤 2:注意路径写法(把反斜杠 \ 处理成 /,推荐加前缀 r):

1
2
3
4
# 三种处理反斜杠的方法:
r"C:\Users\Public\Pictures\Sample Pictures\juehua.jpg"   # 加 r 前缀
# 或 "C:\\Users\\...\\juehua.jpg"(双反斜杠)
# 或 "C:/Users/.../juehua.jpg"(直接正斜杠)
  • 路径中不要有中文

  • 步骤 3:完整实例:

import time
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get("http://192.168.X.XXX/suthr/logon")
driver.implicitly_wait(30)
driver.find_element_by_name("username").send_keys("hrteacher")
driver.find_element_by_name("password").send_keys("123456")
driver.find_element_by_class_name("uppercase").click()    # 登录
driver.find_element_by_link_text("人资工作台").click()
a = driver.find_element_by_link_text("员工基本信息管理")
ActionChains(driver).click(a).perform()
driver.find_element_by_link_text("员工照片管理").click()
driver.find_element_by_xpath("/html/body/div[4]/div[2]/div/div[2]/div/div/div/div[2]/table/tbody/tr[1]/td[9]/a").click()   # 编辑
driver.find_element_by_name("file").send_keys(r"C:\Users\Public\Pictures\Sample Pictures\juehua.jpg")   # 上传文件

为什么不操作 Windows 上传弹窗?

Selenium 只能操作网页里的元素,Windows 弹窗属于操作系统界面,它够不着。好在 <input type="file"> 本身就支持「把路径填进去」这种做法,就像不打开快递柜、直接把取件码给柜子,柜子自己就把件取出来了。

常见错误与排错

  • 若上传后文件为空/报路径错误:检查路径是否加了 r 前缀(或用 /、双反斜杠),且路径中不能有中文。

15.4.6 页面截图

1. 任务描述get_screenshot_as_file() 对页面进行截图。

2. 实验步骤

  • 步骤 1:记住截图方法:
driver.get_screenshot_as_file(r"路径名\图片名字")
  • 步骤 2:实例——对登录页面截图:
1
2
3
4
5
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://192.168.X.XXX/suthr/logon")
driver.get_screenshot_as_file(r"C:\Users\Public\Pictures\Sample Pictures\denglu.png")

截图有什么用?

自动化测试跑完,通常要截图留证(成功界面、报错界面)。这也是你提交作业最常用的"成果证据"。

常见错误与排错

  • 若截图文件没生成:检查保存路径的文件夹是否存在、图片名是否带 .png 后缀,路径记得加 r 前缀防止反斜杠转义。

15.4.7 alert 对话框处理

1. 任务描述 处理登录/操作过程中弹出的警告、确认、提示对话框。

2. 实验步骤

  • 步骤 1:认识三种对话框: | 类型 | 特点 | 可操作 | | --- | --- | --- | | 警告对话框 alert | 只有一个"确定"按钮,必须先关闭 | accept | | 确认对话框 confirm | "确定 / 取消"两个按钮 | accept / dismiss | | 提示对话框 prompt | 有输入框,可输入答案 | accept / dismiss / send_keys |

  • 步骤 2:使用 switch_to_alert() 定位,配合 text / accept / dismiss / send_keys

1
2
3
4
5
6
7
8
9
# 获取对话框文本
element = driver.switch_to_alert().text
print(element)
# 单击"确定"
driver.switch_to_alert().accept()
# 单击"取消"
driver.switch_to_alert().dismiss()
# 输入值(仅 prompt 可用)
driver.switch_to_alert().send_keys("hello")
  • 步骤 3:完整实例——弹出并处理警告对话框:
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get("http://192.168.X.XXX/suthr/logon")
driver.implicitly_wait(30)
driver.find_element_by_name("username").send_keys("hrteacher")
driver.find_element_by_name("password").send_keys("123456")
driver.find_element_by_class_name("btn-success").click()   # 登录
driver.find_element_by_link_text("门户首页").click()
a = driver.find_element_by_xpath("/html/body/div[3]/div[1]/div/div/div/div[2]/div[2]/div/a")
driver.execute_script("arguments[0].removeAttribute('target')", a)
a.click()                                                   # 论坛
driver.find_element_by_link_text("颠三倒四多").click()      # 主题
driver.execute_script("window.scrollTo(0,2000)")
b = driver.find_element_by_id("replyBtn")
ActionChains(driver).click(b).perform()                     # 弹出警告框
time.sleep(5)
print(driver.switch_to_alert().text)                        # 打印警告文字
driver.switch_to_alert().accept()                           # 关闭警告框

send_keys 只能用在哪?

send_keys 只能用于 prompt(提示对话框),alert 和 confirm 没有输入框,用了会报错。

常见错误与排错

  • 若弹框弹出后脚本卡住、后续代码不执行:alert 不关闭页面就无法继续操作,必须先用 accept() / dismiss() 关掉它;
  • switch_to_alert()NoAlertPresentException:说明弹框还没弹出来,可在前面加 time.sleep() 等待。

15.4.8 Unittest 单元测试框架

1. 任务描述 掌握 Unittest 框架原理,用 setUp/tearDown 组织自动化测试用例。

2. 实验步骤

  • 步骤 1:理解四大核心部分: | 组件 | 作用 | | --- | --- | | TestCase | 测试用例基类,run() 依次调用 setUp → 用例方法 → tearDown | | TestSuite | 测试用例集合,可用 addTest() 手动添加或用 TestLoader 自动加载 | | TestRunner | 运行测试用例的驱动类,执行后自动管理 TestResult | | TestFixture | 测试准备活动,常用 setUp() / tearDown() |

  • 步骤 2:理解测试流程:

  • 写 TestCase(class 继承 unittest.TestCase,方法以 test 开头);
  • TestLoader 把 TestCase 加载到 TestSuite;
  • TextTestRunner 运行 TestSuite,结果保存在 TextTestResult;
  • unittest.main() 或 TextTestRunner 触发执行。

  • 步骤 3:理解关键方法:

  • setUp()每个用例执行前执行一次;
  • tearDown()每个用例执行后执行一次;
  • setUpClass():整个用例集执行前只执行一次(需 @classmethod);
  • tearDownClass():整个用例集执行后只执行一次(需 @classmethod)。

  • 步骤 4:实例1——setUp 启动浏览器、tearDown 关闭浏览器、两个登录用例:

import unittest
import time
from selenium import webdriver

class Denglu(unittest.TestCase):
    def setUp(self):                       # 每个用例前执行
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)

    def tearDown(self):                    # 每个用例后执行
        self.driver.quit()

    def test_denglu(self):                 # 用例1:登录
        self.driver.get("http://192.168.X.XXX/suthr/logon")
        self.driver.find_element_by_name("username").send_keys("hrteacher")
        self.driver.find_element_by_name("password").send_keys("123456")
        self.driver.find_element_by_class_name("uppercase").click()
        time.sleep(5)

    def test_denglu1(self):                # 用例2:登录后进入门户首页
        self.driver.get("http://192.168.X.XXX/suthr/logon")
        self.driver.find_element_by_name("username").send_keys("hrteacher")
        self.driver.find_element_by_name("password").send_keys("123456")
        self.driver.find_element_by_class_name("uppercase").click()
        self.driver.find_element_by_link_text("门户首页").click()
        time.sleep(5)

if __name__ == '__main__':
    unittest.main()                        # 启动测试
  • 步骤 5:实例2——setUpClass 只启动一次浏览器(用 @classmethod):
import unittest
import time
from selenium import webdriver

class Denglu(unittest.TestCase):
    @classmethod
    def setUpClass(cls):                   # 用例集执行前只执行一次
        cls.driver = webdriver.Chrome()
        cls.driver.implicitly_wait(30)

    @classmethod
    def tearDownClass(cls):                # 用例集执行后只执行一次
        cls.driver.quit()

    def test_denglu(cls):
        cls.driver.get("http://192.168.X.XXX/suthr/logon")
        cls.driver.find_element_by_name("username").send_keys("hrteacher")
        cls.driver.find_element_by_name("password").send_keys("123456")
        cls.driver.find_element_by_class_name("uppercase").click()
        time.sleep(5)

    def test_denglu1(cls):
        cls.driver.find_element_by_link_text("门户首页").click()
        time.sleep(5)

if __name__ == '__main__':
    unittest.main()

setUp 和 setUpClass 怎么选?

  • 每个用例独立浏览器(互不干扰):用 setUp / tearDown
  • 所有用例共用一个浏览器(更快):用 setUpClass / tearDownClass(注意加 @classmethod)。

常见错误与排错

  • 若写好的用例方法不被执行:检查方法名是否以 test 开头(如 test_denglu),Unittest 只认 test 开头的方法;
  • setUpClass 不生效:检查上面有没有加 @classmethod 装饰器。

15.5 实验总结

本次实验掌握了以下要点:

  1. 一是理解了删除元素属性、submit() 提交、滚动条操作、下拉框处理、文件上传、截图、alert 对话框处理的作用与适用场景(对应知识目标);
  2. 二是掌握了 execute_script 删属性、Select 模块选下拉框、send_keys 上传、get_screenshot_as_file 截图、三种 alert 处理,以及编写继承 unittest.TestCase 的测试用例(对应技能目标);
  3. 三是建立了「用框架管理用例、批量执行自动出结果」的工程化测试意识(对应素养目标)。

15.6 作业提交

  1. 提交地点:吾爱作业网
  2. 提交资料:
  3. 15.4.4 下拉框 Select 模块实例运行截图;
  4. 15.4.7 alert 处理实例运行截图(能看到打印的警告文字);
  5. 15.4.8 Unittest 实例运行结果截图。
  6. 不会做时填写"心得感悟"(1~50 字)。

15.7 知识检测

  • [ ] (填空)删除链接的 target 属性后,链接就不会再弹出新窗口,而是在当前页面打开。
  • [ ] (填空)Select 模块按页面显示文字选择下拉选项的方法是 select_by_visible_text()(另有 select_by_index / select_by_value)。
  • [ ] (选择)alert / confirm / prompt 三种对话框中,可以输入内容的是( )。
  • A. alert B. confirm C. prompt D. 都可以
查看解析

正确答案:C。只有 prompt 有输入框,send_keys 只能用于 prompt;alert 和 confirm 用了会报错。

  • [ ] (选择)Unittest 中 setUpClass 的执行时机是( )。
  • A. 每个用例前执行一次 B. 每个用例后执行一次 C. 整个用例集执行前只执行一次 D. 从不执行
查看解析

正确答案:C。setUpClass 在整个用例集执行前只执行一次(需加 @classmethod);每个用例前执行的是 setUp。

  • [ ] (判断)Unittest 测试用例类中的方法可以随意命名,比如叫 denglu1 也会被执行。(
查看解析

错。方法必须以 test 开头(如 test_denglu),Unittest 只会执行 test 开头的用例方法。

本课相关资源

序号 资源名称 类型 说明
1 任务3.8 页面元素属性删除方法使用.pptx 课件 removeAttribute
2 任务3.9 submit()方法使用.pptx 课件 表单提交
3 任务3.10 操作下拉滚动条方法使用.pptx 课件 滚动条
4 任务3.11 页面中下拉框方法的使用.pptx 课件 下拉框三方法
5 任务3.12 文件上传处理方法使用.pptx 课件 文件上传
6 任务3.13 页面截图操作方法使用.pptx 课件 截图
7 任务3.14 alert对话框处理方法使用.pptx 课件 alert 处理
8 任务3.15 Unittest单元测试框架方法使用.pptx 课件 Unittest 框架

实验素材下载

点击下方链接获取本节课全部资源(含课件、任务清单、安装包等): 🔗 夸克网盘

本站总访问 次 | 访客 人 | 本页阅读