Web自动化测试

前言

python对于版本十分敏感,建议统一使用最新版本,减少报错可能。

一、搭建自动化环境

1.下载python

地址:Python Releases for Windows | Python.org

选择需要的版本下载

下载后长这样

一般默认既可,如果对下载路径或者要下载其他的东西,可以选择自定义

2.下载PyCharm

地址:下载 PyCharm:JetBrains 出品的用于数据科学和 Web 开发的 Python IDE

下载步骤

1

2

3

4

3.安装Selenium

(1)pip包管理工具

命令提示符命令:

复制代码
pip install selenium==3.141.0

注:需要明确版本的就写全部,不然就写前三个英文既可以

(2)PyCharm安装

1

2

3

4下载成功

4.安装浏览器驱动

查看谷歌版本

1

2

下载谷歌驱动

网址:谷歌浏览器114之前、147、148版本驱动下载,实时更新_chromedriver122-CSDN博客

将压缩包解压到与python.exe同级

二、Selenium工具的基本应用

1.Selenium元素定位方法

案例

商城地址:首页-开源商城 | B2C商城 | B2B2C商城 | 三级分销 | 免费商城 | 多用户商城 | tpshop|thinkphp shop|TPshop 免费开源系统 | 微商城 (itheima.net)https://hmshop-test.itheima.net/index.php

使用谷歌打开

使用功能快速定位到组件位置

或者Ctrl+F,打开查找,输入进行定位

定位格式

输入框: css autocomplete='off'

搜索按钮: xpath //*text()='搜索'

购物车按钮: class c-n fl

代码

python 复制代码
# 1.导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time  # 加个等待,防止页面没加载完报错

# 2.创建浏览器驱动(修复这里!自动匹配驱动)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 3.打开web端项目页面
driver.get("https://hmshop-test.itheima.net/index.php")
time.sleep(2)  # 等待页面加载

print("登录成功")

# 4.页面元素定位
# ①商品搜索输入框
search_input = driver.find_element(By.CSS_SELECTOR, "[autocomplete='off']")
search_input.send_keys("手机")  # 测试输入内容

# ②搜索按钮
search_btn = driver.find_element(By.XPATH, "//*[text()='搜索']")
search_btn.click()  # 点击搜索
time.sleep(2)

# ③加入购物车按钮
add_cart = driver.find_element(By.CSS_SELECTOR, ".c-n.fl")
add_cart.click()  # 点击加入购物车

time.sleep(3)
driver.quit()  # 关闭浏览器

print("搜索成功")

2.selenium常用的操作方法

案例

网址:IHRM-人力资源管理系统

账号:13800000002

密码:929itheima.CN032@.当前日期

代码:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 1. 驱动初始化
service = Service("./chromedriver.exe")
driver = webdriver.Chrome(service=service)

# 2. 基础配置
driver.maximize_window()
driver.implicitly_wait(10)
driver.set_page_load_timeout(15)

# 3. 打开登录页
driver.get("https://ihrm-java.itheima.net/#/login")

# 4. 输入账号
user_input = driver.find_element(By.CSS_SELECTOR, "[name='username']")
user_input.clear()
user_input.send_keys("13800000002")

# 5. 输入密码
pwd_input = driver.find_element(By.CSS_SELECTOR, "[name='password']")
pwd_input.clear()
pwd_input.send_keys("929itheima.CN032@.20260610")

# ========== 这里用你按钮的专属类名定位 ==========
login_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button.loginBtn"))
)
login_btn.click()

# 6. 登录后操作
time.sleep(3)
driver.get_screenshot_as_file("登录成功.png")
print("登录成功~~~~")

# 7. 关闭浏览器
driver.quit()

目录:

结果:

三、自动化测试框架

案例

创建test_sum.py和test_add.py文件。

在test_sum.py文件中,使用unittest框架测试定义的函数my_sum()是否为求和函数。

在test_add.py文件中,使用pytest框架测试定义的函数add()是否为求和函数。

1.unittest框架

代码

python 复制代码
# 使用unittest框架,管理测试用例
import unittest

def my_sum(a, b):
    return a + b

class TestSum(unittest.TestCase):
    def test01_sum(self):
        res = my_sum(4,5)
        self.assertEqual(res, 9)

结果

2.pytest框架

代码

python 复制代码
# 使用pytest框架,管理测试用例
import pytest

def add(a,b):
    return a + b

class TestAdd:
    def test_add(self):
#       assert test_add(1,2) == 3
        res = add(4,5)
        assert res == 9

下载pytest(没有的话)

命令

python 复制代码
pip install pytest

切换运行方式

结果

四、学成在线教育平台测试

1.测试环境准备

2.定位学成在线教育平台首页元素

(1)搞定Katalon Recorder
法1:谷歌浏览器应用商店

进入应用商店

搜索Katalon Recorder

添加后

法2:外部下载(适用应用商店进不去的情况)

下载

Katalon Recorder 7.0.1 Crx (Old Version) - Crx4Chrome

翻到下面

长这样

打开扩展程序

将我们下载的东西直接拖进来后,选择添加扩展程序

结果

(2)Katalon Recorder使用

创建

开启录制,获取定位

点击网页的功能,获取定位

导出

定位

3.测试登录和退出功能

1.UI界面手动操作

①了解要涉及哪些页面

②记录定位元素的元素定位信息(元素定位方式,元素定位数据)

③梳理针对元素进行何种操作

登录成功--测试用例

登录按钮://*text()='登录'

账号输入框:placeholder='请输入登录手机号'

密码输入框:placeholder='请输入登录密码'

登录按钮://button/spantext()='登录'

登录成功之后://*contains(text(),'个人中心')

退出登录--测试用例

账号名称://div@class='dropbtn'/span

退出登录按钮://*text()='退出登录'

2.代码的编写(使用Selenium模拟浏览器操作,unittes框架管理测试用例脚本)
  • 下载浏览器驱动

  • 下载Selenium

  • 链接:学成在线2.0

  • 账号:12022222227

  • 密码:037itheima.CN032@.20260613

    导包

    import time
    import unittest
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC

    class TestSum(unittest.TestCase):
    # 定义类对象
    service = None
    driver = None

    复制代码
      @classmethod
      def setUpClass(cls) -> None:
          # 创建浏览器驱动对象
          cls.service = Service("chromedriver.exe")
          cls.driver = webdriver.Chrome(service=cls.service)
          # 窗口最大化
          cls.driver.maximize_window()
          # 设置隐式等待时间--10s
          cls.driver.implicitly_wait(10)
          # 增加页面加载超时,防止卡死
          cls.driver.set_page_load_timeout(20)
    
      @classmethod
      def tearDownClass(cls) -> None:
          # 关闭浏览器
          cls.driver.quit()
    
      # 测试用例:登录成功和退出登录
      def test01_login_success_loginout(self):
          # 1.进入首页
          self.driver.get('https://xczx2-portal.itheima.net/')
          # 2.进入登录页面(点击登录按钮,跳转到登录页面)
          dl = self.driver.find_element(By.XPATH, "//*[text()='登录']")
          dl.click()
          # 3.完成登录操作
          # ①请输入手机号
          number = self.driver.find_element(By.CSS_SELECTOR, "[placeholder='请输入登录手机号']")
          number.clear()
          number.send_keys('12022222227')
          # ②请输入密码
          password = self.driver.find_element(By.CSS_SELECTOR, "[placeholder='请输入登录密码']")
          password.clear()
          password.send_keys('037itheima.CN032@.20260613')
          # ③点击登录按钮
          self.driver.find_element(By.XPATH, "//button/span[text()='登录']").click()
          print("登录成功")
          # 4.断言--登录成功
          is_sus = None
          try:
              is_sus = self.driver.find_element(By.CSS_SELECTOR, "a.personal")
              print("获取个人中心元素信息成功")
          except:
              print("获取个人中心元素信息失败,登录失败")
          self.assertIsNotNone(is_sus)  # 判断元素是否为空
          # 5.退出登录
          # ① 鼠标悬停在账号信息上:1.创建鼠标对象;2.调用鼠标方法;3.执行鼠标操作
          action = ActionChains(self.driver)
          action.move_to_element(self.driver.find_element(By.XPATH,"//div[@class='dropbtn']/span"))
          action.perform()
          # ② 点击"退出登录按钮"
          self.driver.find_element(By.XPATH, "//a[text()='退出登录']").click()
          time.sleep(2)

结果

视频演示

测试登录和退出功能-CSDN直播

4.测试页面跳转功能

单击菜单栏中的"课程"文本链接可以从学成在线首页跳转到课程页面;单击"注册"文本链接可以跳转到注册页面,注册页面的效果如下图所示。

定位

课程 文件链接://*text()='课程'

断言-跳转课程页面成功://*contains(text(),'一级分类')

注册 文本链接://*text()='注册'

断言-跳转注册页面成功://*contains(text(),'注册协议')

代码编写

复制代码
# 导包
import unittest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


class TestJumpPage(unittest.TestCase):
    driver = None
    Service = None

    @classmethod
    def setUpClass(cls) -> None:
        # 创建浏览器驱动对象
        cls.service = Service("chromedriver.exe")
        cls.driver = webdriver.Chrome(service=cls.service)
        # 窗口最大化
        cls.driver.maximize_window()
        # 设置隐式等待时间--10s
        cls.driver.implicitly_wait(10)
        # 增加页面加载超时,防止卡死
        cls.driver.set_page_load_timeout(20)

    @classmethod
    def tearDownClass(cls) -> None:
        # 关闭浏览器
        cls.driver.quit()

    # 测试用例:跳转页面(跳转课程,跳转注册页面)
    def test01_jump_page(self):
        # 1.进入首页
        self.driver.get('https://xczx2-portal.itheima.net/')
        # 2.跳转课程页面
        self.driver.find_element(By.XPATH, "//*[text()='课程']").click()
        # 3.断言--跳转课程页面成功
        is_course_suc = None
        try:
            is_course_suc = self.driver.find_element(By.XPATH, "//*[contains(text(),'一级分类')]")
            print("跳转课程页面成功")
        except:
            print("跳转课程页面失败")
        self.assertIsNotNone(is_course_suc)
        # 4.跳转注册页面
        self.driver.find_element(By.XPATH, "//*[text()='注册']").click()
        # 5.断言--跳转
        is_register_suc = None
        try:
            is_register_suc = self.driver.find_element(By.XPATH, "//*[contains(text(),'注册协议')]")
            print("跳转注册页面成功")
        except:
            print("跳转注册页面失败")
        self.assertIsNotNone(is_register_suc)
相关推荐
C+++Python2 小时前
详细介绍一下Java泛型的通配符
java·windows·python
Kagol2 小时前
Superpowers GSD gstack AgentSkills深度测评
前端·人工智能
小帅热爱难回头3 小时前
编写Skill生成AI落地项目系统架构
python
excel3 小时前
JavaScript 字符串与模板字面量:从表象到本质理解
前端
diving deep3 小时前
脚本速览-python
开发语言·python
京东云开发者3 小时前
当AI成为导演-如何用AI创作动漫短剧
前端
李白的天不白4 小时前
使用 SmartAdmin 进行前后端开发
java·前端
乘风gg4 小时前
🤡PUA AI Coding 工具 的 10 条终极语录
前端·ai编程·claude
学Linux的语莫4 小时前
Vue 3 入门教程
前端·javascript·vue.js