所需环境

  1. 浏览器 Chrome
  2. Python 3.9
  3. Selenium
  4. Pytest

配置驱动

在项目根目录下创建 conftest.py

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
import os
import time# 配置driver  在所有的用例执行之前开始
@pytest.fixture(scope="session",autouse=True)
def driver():driverpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'drivers/chromedriver.exe')driver = webdriver.Chrome(executable_path=driverpath)driver.implicitly_wait(5)driver.maximize_window()yield driver# 运行结束# driver.quit()@pytest.fixture(scope='function',autouse=True)
def handler_case(driver:WebDriver):yield# 每个用例执行完成之后进行截图screenshots =  os.path.join(os.path.dirname(os.path.abspath(__file__)),"screenshots")if not os.path.exists(screenshots):os.mkdir(screenshots)filename = time.strftime('%Y-%m-%d_%H_%M_%S')file = os.path.join(screenshots,filename+".png")driver.save_screenshot(file) 

 创建测试用例

testcases/test_login.py 

from selenium.webdriver.chrome.webdriver import WebDriver
def test_login(driver:WebDriver):"""用户登录:param driver::return:"""driver.get("http://1.117.45.85/zentao/my/")driver.find_element_by_id('account').send_keys("abtester")driver.find_element_by_css_selector('[name="password"]').send_keys('Abtester123')driver.find_element_by_id("submit").click()def test_create_topic(driver:WebDriver):driver.find_element_by_css_selector('li[title="测试"]').click()# 切换iframeqa = driver.find_element_by_id('appIframe-qa')driver.switch_to.frame(qa)driver.find_element_by_css_selector('li[data-id="testcase"]').click()driver.find_element_by_css_selector('a.btn.btn-primary[data-app="qa"]').click()driver.find_element_by_id('title').send_keys('用户登录测试成功登录')driver.find_element_by_id('precondition').send_keys('网络正常:存在用户 abtester 密码:Abtester123')# step1driver.find_element_by_xpath('//tbody[@id="steps"]/tr[1]/td[2]//textarea').send_keys('打开登录页面')driver.find_element_by_xpath('//tbody[@id="steps"]/tr[1]/td[3]//textarea').send_keys('能够正常打开')# step2driver.find_element_by_xpath('//tbody[@id="steps"]/tr[2]/td[2]//textarea').send_keys("输入用户名 abtester")driver.find_element_by_xpath('//tbody[@id="steps"]/tr[2]/td[3]//textarea').send_keys('输入成功')# step3driver.find_element_by_xpath('//tbody[@id="steps"]/tr[3]/td[2]//textarea').send_keys('输入密码:Abtester123')driver.find_element_by_xpath('//tbody[@id="steps"]/tr[3]/td[3]//textarea').send_keys('输入成功')# submitdriver.find_element_by_id('submit').click() 

封装POM

将自动化脚本直接写在代码中不是好的方案,如果后期页面进行了更改,那么维护起来很麻烦,一种业界通用的做法就是配置页面模型 POM

POM是将每个页面封装到一个类中,类中定义相关的操作,将上面的自动化创建测试用例的操作封装一下

pom/mainnav.py

"""
页面导航
"""
from selenium.webdriver.chrome.webdriver import WebDriver
from pom.testcasepage import TestCasePageclass MainNavgation:def __init__(self,driver:WebDriver):self.driver = driverdef nav_qa(self):"""导航到测试页面:return:"""self.driver.find_element_by_xpath('//li[@title="测试"]').click()qa = self.driver.find_element_by_id('appIframe-qa')self.driver.switch_to.frame(qa)return TestCasePage(self.driver)

pom/testcasepage.py

from selenium.webdriver.chrome.webdriver import WebDriverclass TestCasePage:"""测试用例相关的页面"""def __init__(self,driver:WebDriver):self.driver = driverself.driver.find_element_by_xpath('//li[@data-id="testcase"]').click()def create_testcase(self,title,*steps,precondition=''):"""创建测试用例:param title: 标题:param precondition: 前置条件:param steps: 测试步骤:return:"""self.driver.find_element_by_id('title').send_keys(title)self.driver.find_element_by_id('precondition').send_keys(precondition)# 约定测试数据 steps=[{step:"打开登录页面",expect:""},{step:"打开登录页面",expect:""}]for i in range(len(steps)):self.driver.find_element_by_xpath(f'//tbody[@id="steps"]/tr[{i+1}]/td[2]//textarea').send_keys(steps[i].get("step"))self.driver.find_element_by_xpath(f'//tbody[@id="steps"]/tr[{i+1}]/td[3]//textarea').send_keys(steps[i].get("expect"))# submitself.driver.find_element_by_id('submit').click()def click_add_testcase(self):"""点击添加测试用例:return:"""self.driver.find_element_by_css_selector('a.btn.btn-primary[data-app="qa"]').click() 

将页面封装为独立的类,在测试用例中调用测试方法

testcases\test_login.py

from selenium.webdriver.chrome.webdriver import WebDriver
from pom.mainnav import MainNavgationdef test_login(driver:WebDriver):"""用户登录:param driver::return:"""driver.get("http://1.117.45.85/zentao/my/")driver.find_element_by_id('account').send_keys("abtester")driver.find_element_by_css_selector('[name="password"]').send_keys('Abtester123')driver.find_element_by_id("submit").click()def test_create_topic(driver:WebDriver):mainnav = MainNavgation(driver)# 导航到测试页面qa = mainnav.nav_qa()# 点击添加测试用例qa.click_add_testcase()step1 = {'step':"输入用户名zhangsan","expect":"输入成功"}step2 = {'step': "输入密码zhangsan", "expect": "输入成功"}step3 = {'step': "输入确认密码zhangsan", "expect": "输入成功"}step4 = {'step': "输入确认密码zhangsan", "expect": "输入成功"}step5 = {'step': "输入确认密码zhangsan", "expect": "输入成功"}qa.create_testcase("用户注册",step1,step2,step3,step4,step5,precondition='网络正常') 

yaml配置页面元素定位

当创建的页面越来越多的时候,单纯的pom模型在维护元素定位时也会变得不方便,这时可以将页面上的元素放到yaml配置文件中;

安装 pyyaml 可以解析yaml文件

pip install pyyaml 

配置页面的定位

pageconf/testcase.yaml

testcase:xpath: //li[@data-id="testcase"] #测试
createbtn:css: a.btn.btn-primary[data-app="qa"] # 创建用例
title:id: title # 用例的标题
precondition:id: precondition  # 前置条件
submit:id: submit  # 提交 

在pom文件中定义解析yaml文件的基类

pom\basepage.py

from selenium.webdriver.chrome.webdriver import WebDriver
import os
import yamlclass BasePage:def __init__(self,driver:WebDriver,yamlfile):self.driver = driverself.__yamlpath = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'pageconf')self.__yamlfile = yamlfileself.config = self.__load_yaml()def __load_yaml(self):"""加载yaml文件"""with open(os.path.join(self.__yamlpath,self.__yamlfile),encoding="utf8") as file:return yaml.load(file,Loader=yaml.SafeLoader)def find_element_by_yaml_config(self,name):"""自定义从yaml文件中获取元素定位:param name::return:"""selector:dict = self.config.get(name)for key,value in selector.items():if key == "xpath":return self.driver.find_element_by_xpath(value)elif key=="css":return self.driver.find_element_by_css_selector(value)elif key=="id":return self.driver.find_element_by_id(value)elif key=="name":return self.driver.find_element_by_name(value)elif key=="class":return self.driver.find_element_by_class_name(value)

定义所有页面的基类,在基类中设置从yaml文件中读取配置的方法,后续所有的页面类都继承basepage 父类;

pom/testcasepage.py

from selenium.webdriver.chrome.webdriver import WebDriver
from pom.basepage import BasePage
class TestCasePage(BasePage):"""测试用例相关的页面"""def __init__(self,driver:WebDriver):# 调用父类的构造器   'testcase.yaml' 传入页面的配置文件路径super(TestCasePage, self).__init__(driver,'testcase.yaml')self.find_element_by_yaml_config("testcase").click()def create_testcase(self,title,*steps,precondition=''):"""创建测试用例:param title: 标题:param precondition: 前置条件:param steps: 测试步骤:return:"""self.find_element_by_yaml_config('title').send_keys(title)# self.driver.find_element_by_id('title').send_keys(title)self.find_element_by_yaml_config('precondition').send_keys(precondition)# self.driver.find_element_by_id('precondition').send_keys(precondition)# 约定测试数据 steps=[{step:"打开登录页面",expect:""},{step:"打开登录页面",expect:""}]for i in range(len(steps)):self.driver.find_element_by_xpath(f'//tbody[@id="steps"]/tr[{i+1}]/td[2]//textarea').send_keys(steps[i].get("step"))self.driver.find_element_by_xpath(f'//tbody[@id="steps"]/tr[{i+1}]/td[3]//textarea').send_keys(steps[i].get("expect"))# submitself.find_element_by_yaml_config('submit').click()def click_add_testcase(self):"""点击添加测试用例:return:"""self.find_element_by_yaml_config('createbtn').click() 

至此,实现了自动化测试框架中的最常用的操作

POM页面配置

Yaml元素定位配置

Pytest 配置单独driver

整个代码架构

附录-所涉及到的知识点

  1. Selenium基本用法
  2. yaml文件处理
  3. pytest的使用

测试人必看

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接免费拿走:

① 2000多本软件测试电子书(主流和经典的书籍应该都有了)

② 软件测试/自动化测试标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python编程语言、API接口自动化测试、web自动化测试、App自动化测试(适合小白学习)


⑤ Python学习路线图(告别不入流的学习)

上图的资料 在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

可以自助拿走,群号953306497(备注“csdn111”)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

Selenium Web自动化测试框架搭建相关推荐

  1. python web自动化测试框架搭建(功能接口)——功能测试模块

    功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...

  2. web自动化测试框架搭建(python+selenium+pytest+pom+ddt)

    本篇文件利用当下流行的pom设计模式设置测试框架,编写测试用例,生成测试报告,并最终jenkins集成. 一.selenium selenium是一个开源的web ui自动化测试工具,详细就不再过多介 ...

  3. python的web自动化框架实例_Selenium基于Python web自动化测试框架 -- PO

    关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...

  4. 基于python的界面自动化测试-基于Selenium+Python的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

  5. python selenium po_python+selenium基于po模式的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

  6. java web典型模块大全_python+selenium基于po模式的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

  7. 【万字长文】2022年最全的搭建Web自动化测试框架教程

    测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程.另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人.本章和 ...

  8. Web 自动化解决方案 [开源项目] 基于 Selenium 的 Web 自动化测试框架完美版

    欢迎查阅Selenium(Web自动化测试框架体系) Selenium ) Selenium是一个用于Web应用程序的自动化测试工具,直接运行在浏览器中,就像真正的用户在操作一样• 支持的浏览器包括I ...

  9. 从0开始搭建Web自动化测试框架

    前言: 测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程.另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人 ...

  10. 基于Selenium实现的web自动化测试框架

    目录 一.什么是Selenium? 二.自动化测试框架 三.自动化框架的设计和实现 四.需要改进的模块 五.总结 一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供 ...

最新文章

  1. HDU2222(AC自动机模版题)
  2. PHP cron中的批处理(转)
  3. 【Lv1-Lesson002】He and She
  4. CentOS7安装Nginx及其相关
  5. jenkin系列_调度jmeter实现分布式测试
  6. 【职场】什么是 “职场PUA” ?
  7. 【unity3d--初始学习五--c#脚本对xml文件的创建和解析】
  8. 小汤学编程之JDBC(二)——dbutils框架和DataSource连接池
  9. 阿里巴巴数据库分库分表的最佳实践
  10. 二元函数求最小值 c语言,遗传算法C语言源代码(一元函数和二元函数)
  11. MathorCup数模竞赛,为你的保研之路添砖加瓦~
  12. mysql唯一索引和聚合索引区别_唯一索引、聚集索引和聚集索引
  13. 适合全家一起看的温馨大电影-《熊出没之雪岭熊风》
  14. 动态显示姓名--汇编语言版
  15. 面部关键特征点(Landmark)的定位
  16. oracle表空间不足影响,oracle表空间不足
  17. 图像质量评估指标(3) 特征相似度FSIM
  18. http 代理服务器搭建 tinyProxy
  19. 程序员最爱用的在线代码编辑器合集,哪款是你的最爱?
  20. 计算机组成原理 启航教育,2021计算机考研:计算机组成原理知识点CPU的功能和基本结构...

热门文章

  1. Laravel8 小程序手机号获取验证码登录
  2. 在Excel中统计出指定区域的空单元格个数和非空单元格个数
  3. 正面管教:不凶不吼教出好孩子读后感
  4. android 随手记 摄像头录像
  5. 中高端洪流已至,酒店企业如何趁势突围
  6. linux 耳机驱动程序,TAS571XSW-LINUX
  7. kali系统自带的aircrack-ng破解WIFI
  8. tt桌球瞄准器手机版_tt桌球辅助瞄准器-tt桌球辅助瞄准手机版1.0.0 安卓版-东坡下载...
  9. c++编译提示:系统找不到指定路径
  10. 阿里云存储开通与使用