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.quit()

2.4 实验内容

本实验将对一个虚拟的线上购物系统进行功能性测试,确保购物流程正常运行。我们的测试内容包括:

  • 登录功能
    • 输入正确的用户名和密码,验证是否成功登录,并跳转到商品显示界面。
    • 输入错误的用户名或密码,或被封号的用户,验证是否显示错误提示信息。
  • 购物车功能
    • 测试从产品列表页添加商品到购物车的功能是否正常。
    • 验证是否能够更新购物车中的商品数量。
    • 测试是否能够删除购物车中的商品。
  • 结算和支付功能
    • 测试是否能完成填写收货信息、确认订单的步骤。

示例代码 ./testing-web/test_SwagLabs.py 使用 Python 的 unittest 框架和 Selenium 来进行在线购物系统的自动化功能测试。请根据下列要求补全其实现:

  1. 本文件已在 test_login_success 实现对正确用户名和密码的测试,请参考此,利用类里已有的 login 方法实现:
    1. test_login_wrong:错误的用户名和密码下,是否登录失败并显示相应错误提示;
    2. test_login_wrong:使用被封禁的用户名 locked_out_user,是否登录失败并显示相应错误提示。
  2. 请参考其他测试用例的实现,完成 test_add_to_cart 用例,测试从产品列表页添加商品到购物车的功能是否正常,直至所有测试用例均通过。
  3. 修改 test_add_to_cart 用例,将用户名改为 error_user,再次运行同一测试,观察报错并说明哪些组件的功能不正常。
  4. 补全 test_checkout_and_payment 用例,实现对结算和支付功能的测试。

使用本机的 Python 环境,在./testing-web目录下运行 python test_SwagLabs.py,或使用即可自动运行所有 test_ 开头的测试用例。