2. Web 测试
2.1 实验目的
基于 Web 自动化工具 Selenium, 对 Web 服务进行功能性测试。
2.2 环境配置
Selenium是一个广泛用于Web应用的自动化测试工具,基于WebDriver协议构建,支持多种编程语言,包括但不限于 Java、C#、Python、Ruby、JavaScript 等。在此我们推荐在 Python 安装 Selenium 库. 同时本部分还需要用到 Python 的单元测试库 unittest 及其参数化库parameterized。为此,你需要在本机上安装 Python:
在 Window 上,使用 WinGet:
winget install Python.Python.3.12
Mac 上:
brew install python
很多 Linux 发行版通常预装了 Python,可以通过运行 python 或 python –version 来检查。
接下来,使用 pip 为 Python 安装所需的库:
pip install selenium parameterized allure-pytest
Selenium 需要使用 WebDriver 提供的接口,以驱动浏览器的自动化运行。在新版本的 Selenium 中,这一过程被自动管理,无需手动干预。
为确认安装,请运行 ./web-test/helloweb.py,确认浏览器正常弹出并完成自动化操作。运行前请修改 driver 至本机使用的浏览器。
2.3 Selenium 用法
如 ./web-test/helloweb.py 所示的,使用 Selenium 编写的测试脚本通常包括:
- 启动浏览器会话:以Chrome为例,
driver = webdriver.Chrome(options=options) - 浏览器导航: 包括打开网站、后退、前进、刷新页面等操作
- 打开网站:
driver.get("https://www.example.com") - 后退:
driver.back() - 前进:
driver.forward() - 刷新:
driver.refresh()亦支持通过获取当前浏览器相关信息,包括窗口句柄、浏览器尺寸 / 位置、cookie等。例如,可使用driver.current_url获取当前网址URL,使用driver.title获取当前网页标题。
- 打开网站:
- 等待策略: 为保证代码与浏览器的当前状态同步,可使用隐式或显式的方法在操作间设置等待。注意不要混合使用隐式和显式等待,以避免不可预测的等待时间。
- 隐式等待:全局设置,适用于整个会话的每个元素位置调用。
driver.implicitly_wait(2) - 显式等待:直接添加到代码中,用于轮询应用程序以获取特定条件.
wait = WebDriverWait(driver, timeout=2) wait.until(lambda d : revealed.is_displayed())
- 隐式等待:全局设置,适用于整个会话的每个元素位置调用。
- 元素操作: 大多数会话内操作都与元素有关。为此,Selenium可进行
- 查找元素: 使用 driver.find_element 可使用多种测试快速定位页面上的元素。在 find_element 中传入 By 类的定位器策略即可。
from selenium.webdriver.common.by import By # 使用 By.ID 定位 element = driver.find_element(By.ID, "element_id") # 使用 By.NAME 定位 element = driver.find_element(By.NAME, "element_name") # 使用 By.XPATH 定位 element = driver.find_element(By.XPATH, "//div[@id='element_id']") # 使用 By.LINK_TEXT 定位 element = driver.find_element(By.LINK_TEXT, "链接文本") # 使用 By.PARTIAL_LINK_TEXT 定位 element = driver.find_element(By.PARTIAL_LINK_TEXT, "部分链接文本") # 使用 By.TAG_NAME 定位 element = driver.find_element(By.TAG_NAME, "tag_name") # 使用 By.CLASS_NAME 定位 element = driver.find_element(By.CLASS_NAME, "class_name") # 使用 By.CSS_SELECTOR 定位 element = driver.find_element(By.CSS_SELECTOR, "css_selector")在浏览器中,可使用开发者工具快速定位网页元素。以 Edge 为例,按下 F12 打开开发者工具,在 Elements 选项卡中点击左上角的选择元素工具,即可快速选中元素并查看其属性。
操作元素: 包括五种基本指令:点击(
element.click())、发送键位(element.send_keys("foo"))、清除(element.clear()),提交表单(不推荐使用),和选择列表元素(Select(select_element))。- 获取元素信息: 查询元素的属性。
- 查找元素: 使用 driver.find_element 可使用多种测试快速定位页面上的元素。在 find_element 中传入 By 类的定位器策略即可。
- 结束会话:
driver.quit()
2.4 实验内容
本实验将对一个虚拟的线上购物系统进行功能性测试,确保购物流程正常运行。我们的测试内容包括:
- 登录功能
- 输入正确的用户名和密码,验证是否成功登录,并跳转到商品显示界面。
- 输入错误的用户名或密码,或被封号的用户,验证是否显示错误提示信息。
- 购物车功能
- 测试从产品列表页添加商品到购物车的功能是否正常。
- 验证是否能够更新购物车中的商品数量。
- 测试是否能够删除购物车中的商品。
- 结算和支付功能
- 测试是否能完成填写收货信息、确认订单的步骤。
示例代码 ./testing-web/test_SwagLabs.py 使用 Python 的 unittest 框架和 Selenium 来进行在线购物系统的自动化功能测试。请根据下列要求补全其实现:
- 本文件已在
test_login_success实现对正确用户名和密码的测试,请参考此,利用类里已有的login方法实现:test_login_wrong:错误的用户名和密码下,是否登录失败并显示相应错误提示;test_login_wrong:使用被封禁的用户名locked_out_user,是否登录失败并显示相应错误提示。
- 请参考其他测试用例的实现,完成
test_add_to_cart用例,测试从产品列表页添加商品到购物车的功能是否正常,直至所有测试用例均通过。 - 修改
test_add_to_cart用例,将用户名改为error_user,再次运行同一测试,观察报错并说明哪些组件的功能不正常。 - 补全
test_checkout_and_payment用例,实现对结算和支付功能的测试。
使用本机的 Python 环境,在./testing-web目录下运行 python test_SwagLabs.py,或使用即可自动运行所有 test_ 开头的测试用例。