Selenium+Pytest+POM

Selenium 官方文档

一、为什么选择 Selenium

1、什么是 Selenium?
Selenium 不是一个工具,是一个工具包:

  • Selenium IDE
  • Selenium Grid
  • Selenium WebDriver

2、为什么选择 Selenium ?

  • 1.1 Selenium 提供完备工具包,用例创建、编辑、执行,开箱即用
  • 1.2 Selenium 支持多种编程语言
  • 1.3 Selenium 支持多种浏览器进行测试

如果仅仅测试 Chrome 下的 web 页面,建议用:playwright;
如果不只是测试 Chrome 下的 web 页面,建议用:Selenium

二、Selenium 底层原理

编程语言通过调用 selenium,selenium 通过 webdriver 接口(基于 HTTP 协议)调用浏览器驱动,浏览器驱动(是各浏览器开发的)去驱动浏览器。
比如:Python->selenium->HTTP->chromedriver->chrome


三、搭建 web 自动化测试环境

可参考 Selenium-WEB自动化测试环境配置
文档
1、安装 Python
2、安装浏览器-比如 Chrome
3、安装浏览器驱动,注意和浏览器版本保持一致。
4、安装 selenium,在 pycharm 的终端下执行:

  • pip install selenium

5、测试脚本:

from time import sleep
from selenium import webdriver
Ch_driver = webdriver.Chrome()
Ch_driver.get("https://www.baidu.com")
sleep(3)
Ch_driver.quit()

from webdriver_helper import get_webdriver
driver = get_webdriver() # 启动浏览器
driver.get("https://www.baidu.com") # 控制浏览器
sleep(3)
driver.quit()

四、测试框架


五、浏览器启动、关闭与控制

1、 浏览器启动

安装 webdriver-helper :pip install webdriver-helper==1.*

  • 带浏览器类型启动浏览器:
from webdriver_helper import get_webdriver
driver = get_webdriver('edge') # 启动浏览器,不需要再单独安装浏览器驱动
  • 带浏览器参数启动浏览器
options = webdriver.EdgeOptions()
# options.add_argument('--headless') #无头模式
# options.add_argument('--start-maximized') # 最大化模式
# options.add_argument('--proxy-server=https://127.0.0.1:8866://') #使用代理
driver = get_webdriver(options=options) # 带浏览器参数启动浏览器
2、 浏览器关闭
  • python 执行完毕会自动关闭
  • 退出浏览器 driver.quit()
  • 关闭当前窗口 driver.close()
3、 浏览器控制

代码是 driver.xxxxxx

driver.maximize_window() #最大化窗口
driver.set_window_size(390, 844) #设置窗口大小
driver.back() #回到空白页面
driver.forward() #前进到上一次访问的页面
driver.refresh() #刷新:地址不变,输入框的内容全部丢失

六、元素定位与控制

代码是 driver.find_element().xxxxxx
先定位元素,再控制元素

1、 元素定位

八大定位策略:

分为三类:

  • 1-属性

  • 2-文本
    在这里插入图片描述

  • 3-表达式:

    • xpath 和 css selector 最常用,两个核心
    • xpath :xml 的查询语言,网页是 HTML 是 XML 的子类

定位策略被 find_element 使用:

  • find_element:返回一个元素
  • find_elements:返回多个元素,放在一个列表
2、三大等待

等待是为了解决页面尚未就绪,导致的自动化操作失败
拓展知识-页面的状态:

  • a、加载 HTML
  • b、渲染 DOM
  • c、元素出现在画面中
  • d、元素可以接受交互

三种等待:

  • a、强制等待:知道等待时长的时候使用
from time import sleep
sleep(1)
  • b、隐式等待:不知道等待时长的时候使用
driver.implicitly_wait(5)
  • c、显式等待:复杂的等待就绪条件下使用
def wait_el_can_click(driver):
   # 元素可以被定位
   element = driver.find_element(By.XPATH, '//*[@class="bg s_btn"]')
   # 元素可以点击
   return element.is_enabled()
   #等待
wait = WebDriverWait(driver, 10)
wait.until(wait_el_can_click)
3、元素控制

举例:

  • 点击:click 右键点击
  • 输入内容:send_keys
driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys("python")
4、信息获取
print("浏览器名称",driver.name)
print("网站标题",driver.title)
print("网站地址",driver.current_url)
print("网站源码",driver.page_source)
5、高级控制技巧
  • 窗口切换
  • 读写 cookies
  • 执行 JavaScript

七、 POM 封装

1、什么是 POM?

2、怎么封装 POM?



创建一个对象,就会执行它的 init 方法
执行步骤:

  • 1、执行 Main pytest.main()
  • 2、执行前置:driver = login_baidu()
  • 3、执行用例:test_login
  • 4、执行 LoginPage 页的方法
  • 5、执行后置:print(“关闭浏览器”)
<think>嗯,用户想了解如何使用PythonSeleniumPytestPOM模式构建自动化测试框架并进行封装。首先,我需要回忆一下这些工具和设计模式的基本概念。Python是编程语言,Selenium用于浏览器自动化,Pytest是测试框架,而POM(Page Object Model)是一种设计模式,用于提高测试代码的可维护性和复用性。 接下来,用户可能需要一个结构化的步骤说明,所以应该分步骤讲解,比如环境搭建、POM模式实现、测试用例编写、Pytest集成、封装优化等。每个部分需要详细说明,并且给出代码示例,这样用户更容易理解。 用户提供的引用内容中提到了Pytest的官网和测试示例,以及页面对象的好处,比如降低修改影响、复用代码等。需要确保在回答中引用这些内容,比如在讲解POM时引用[^2]提到的抽象出对象的好处。 另外,用户可能对框架的目录结构不太清楚,需要给出一个典型的项目结构示例,比如将页面对象、测试用例、配置文件等分开存放。同时,代码示例要符合POM模式,比如BasePage类封装通用方法,具体的页面类继承它,并在测试用例中使用这些页面类。 还需要考虑如何集成Pytest的特性,比如fixture,用于管理浏览器实例,这样每个测试用例可以复用同一个浏览器会话,提高效率。在示例代码中展示conftest.py的使用,这样用户能明白如何全局管理资源。 封装部分可能需要讲解如何将常用功能如元素定位、断言、报告生成等进行封装,引用[^4]提到的拓展功能可能需要对应到配置文件或命令行参数的封装,但用户的问题中可能更关注框架本身的封装,所以重点放在页面对象和测试用例的分离。 最后,生成的相关问题需要与用户当前的问题相关,比如框架优化方法、Pytest的高级功能、元素定位策略和持续集成等,这样用户如果有进一步的需求,可以继续深入探索。</think>### Python+Selenium+Pytest+POM自动化测试框架构建指南 根据《Selenium自动化测试——基于Python语言》的实践建议[^2],以下是分步构建方案: #### 一、环境搭建 ```bash # 安装核心库 pip install selenium pytest pytest-html ``` #### 二、项目目录结构 ``` project/ ├── pages/ # 页面对象 ├── testcases/ # 测试用例 ├── conftest.py # Pytest配置 └── config/ # 配置文件 ``` #### 三、POM模式实现 1. **基础页面类**(base_page.py) ```python from selenium.webdriver.support.wait import WebDriverWait class BasePage: def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(driver, 10) def find_element(self, locator): return self.wait.until(EC.presence_of_element_located(locator)) ``` 2. **登录页面对象**(login_page.py) ```python class LoginPage(BasePage): username_loc = (By.ID, "username") password_loc = (By.NAME, "password") def input_username(self, text): self.find_element(self.username_loc).send_keys(text) def input_password(self, text): self.find_element(self.password_loc).send_keys(text) ``` #### 四、测试用例实现 ```python # test_login.py import pytest class TestLogin: @pytest.fixture(autouse=True) def setup(self, browser): self.driver = browser self.login_page = LoginPage(self.driver) def test_valid_login(self): self.login_page.input_username("admin") self.login_page.input_password("123456") # 添加断言逻辑... ``` #### 五、Pytest集成封装 1. **浏览器管理**(conftest.py) ```python import pytest from selenium import webdriver @pytest.fixture(scope="session") def browser(): driver = webdriver.Chrome() driver.implicitly_wait(10) yield driver driver.quit() ``` 2. **执行命令生成报告** ```bash pytest --html=report.html --self-contained-html ``` #### 六、框架优化方向 1. 配置分离:使用YAML/JSON管理测试数据 2. 异常处理:封装智能等待机制 3. 日志系统:集成logging模块 4. 持续集成:对接Jenkins/GitHub Actions
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值