# frame_web_ui_PublicVersion **Repository Path**: la1nce4/frame_web_ui_PublicVersion ## Basic Information - **Project Name**: frame_web_ui_PublicVersion - **Description**: 公开版:web端UI自动化测试框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-04-11 - **Last Updated**: 2025-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # web_ui_frame ## 框架介绍 ​ 1、本项目为根据PO模式设计实现的web端UI自动化框架 ​ 2、测试框架简单可以理解为一定的目录结构,这些目录结构分别实现了公共代码的封装,日志,用例的封装,测试报告等 ​ 3、测试框架就是将公共方法,日志,测试报告,截图,数据驱动等独立封装出来 ​ 4、测试框架的一个重要特性就是可移植性,即针对不同的业务项目,只需要单独写业务代码,其他模块都可以通用 ## 软件架构 ​ cases:用例文件管理目录 ​ datas:用例数据文件管理目录 ​ etc:配置文件管理目录 ​ logs:日志目录 ​ pages:page文件管理目录 ​ plugins:第三方插件管理目录 ​ reports:测试报告目录 ​ tools:通用方法代码文件管理目录 ## 设计步骤 ​ 1、项目目录结构搭建 ​ 2、封装日志打印、文件读取、数据库操作、邮件发送等公共方法 ​ 3、PO模式设计 ​ 3.1 PO模式基于传统的关键字驱动与数据驱动,将页面元素定位和对元素的操作行为封装成一个page类,实现对页面对象和测试用例的分离,使得自动化测试脚本的减少代码重复、更易读、减少维护成本 ​ 3.2 基础层:BasePage ​ 对Selenium各种常用的元素定位、元素操作、元素等待等方法进行2次封装,组成公共组件库BasePage类 ​ 3.3 PO层:PageCalss ​ 将每一个页面都作为一个单独的pageClass类,都继承BasePage类。主要实现web页中的元素定位、元素操作、业务操作方法的封装,分三步: ​ 第一步(定位分离):将界面的元素抽离出来(定位的方式、定位的值) ​ 第二步(操作分离):将元素的操作方法抽离出来 ​ 第三步(业务分离):将业务操作抽离出来(经常操作的业务绑定在一起) ​ 3.4 测试用例层:TestCase ​ TestCase依赖PageCalss类,从而实现相应的测试步骤 ## 过程记录 ​ 1、目录结构搭建 ​ 2、同步项目到Git进行版本控制,创建dev分支 ​ 3、创建utility.py文件,封装常用功能方法 ​ 4、创建get_log.py文件,封装日志打印功能类 ​ 5、创建get_data.py文件,封装获取ini、Json、yaml等文件类型的数据方法 ​ 6、创建get_path.py文件,用于获取项目路径 ​ 7、创建get_time.py文件,封装获取时间相关方法 ​ 8、创建get_db.py文件,封装常用数据库类型的操作模块 ​ 9、创建push_ddmsg.py文件,封装推送钉钉机器人消息方法 ​ 10、创建config.py文件,日志打印配置公共参数等 ​ 11、封装BasePage基础类。存放在pages文件夹内 ​ 12、将每个页面封装为pageclass类。存放在pages文件夹内 ​ 12.1 定位分离 ​ 12.1.1 隔离定位:页面元素进行分离,每个元素只定位一次,如果页面改变,只需要改变相应的元素定位 ​ 12.1.2 数据驱动:将元素信息,及对元素的操作方法,写到yaml中。优点:如果有100个地方用到了一个元素,当元素定位表达式变了,只需要改配置文件就行了,不用100个地方每个都修改。存放在datas文件夹内 ​ 12.2 操作分离 ​ 12.2.1 分离操作:将常用的元素操作封装为方法 ​ 12.2.2 日志打印:将操作内容输出到日志 ​ 12.3 业务分离 ​ 根据业务逻辑对操作方法进行组装实现业务操作。如果跳转到新的页面,return返回这个新页面 ​ 13、创建conftest.py文件,存放在根目录下: ​ 13.1 利用pytest_runtest_makereport这个方法实现失败用例自动截图 ​ 13.2 利用pytest_report_teststatus实现自定义测试结果 ​ 13.3 利用pytest_runtest_setup、pytest_runtest_makereport实现用例执行失败后其他不再执行(当前类内) ​ 14、测试用例 ​ 13.1 使用测试框架pytest ​ 13.2 创建run_test.py,用于启动测试用例。存放在根目录下 ​ 13.3 创建conftest.py,用于配置pytest全局参数。存放在根目录下 ​ 13.4 测试用例:将自动化测试用例编写成代码。存放在cases文件夹内 ​ 13.5 数据驱动:把用例数据提取到数据文件中,使用数据驱动来驱动测试用例,可以方便我们用例的管理和维护。存放在datas文件夹内 ​ 15、结合allure生成测试报告 ​ 15、创建run_test.py文件,用于启动测试。存放在根目录下 ## 功能简介 ``` 1、钉钉机器人消息推送 2、失败用例自动截图 3、当前测试类中被标记的用例执行失败后,跳过其他同样被标记的未执行用例 4、登录含图形验证 4.1)通过图像识别方式直接登录 4.2)通过cookies注入绕过登录 4.3)通过增加sessionStorage缓存绕过登录 ``` ## 使用教程 ### 准备工作 #### 项目插件 ``` # python解释器 Python == 3.6.5 # 自动化相关 selenium == 3.141.0 pytest == 7.0.1 pytest-rerunfailures == 10.3 allure-pytest == 2.10.0 pytest-ordering == 0.6 pytest-dependency == 0.5.1 pytest-assume == 2.4.3 pytest-xdist == 3.0.2 # 其他 pandas == 1.1.5 xlrd == 2.0.1 xlwt == 1.3.0 pytesseract == 0.3.8 requests == 2.27.1 colorlog == 6.7.0 PyMySQL == 1.0.2 pymongo == 4.1.1 redis == 4.3.5 DBUtils == 3.0.2 PyYAML == 6.0 ``` #### 公共配置 ``` 文件夹etc——文件config.py:配置公共参数 文件夹plugins:对应版本的浏览器驱动 ``` ### 使用说明 ​ 1、PO模式使用要点 ​ 1.1 不要在page页面对象外做元素定位 ​ 1.2 不在page页面对象里面写断言,除非是页面是否成功加载断言 ​ 1.3 需要多少个元素就定位多少个,不需要对整个页面的元素进行定位 ​ 1.4 当用例设计页面跳转时,例如登陆操作,登陆完成后跳转首页,当页面发生“跳转”,封装的业务逻辑需要返回(return)对应的页面对象的实例 ​ 1.5 BasePage封装Selenium基础方法,不需要全部封装,用到多少方法就封装多少方法 ​ 2、定位要点 ​ 2.1 定位一个时,要求定位方式做到唯一准确,一般优先考虑id、name、link_text、partial_link_text,次考虑class_name、xpath、css_selector,最后再考虑tag_name,最后考虑tag_name是因为大部分时候不是唯一值 ​ 2.2 定位多个时,要求定位方式均有共同特征,一般优先考虑class_name、xpath、css_selector、tag_name,次考虑link_text、partial_link_text,基本不考虑id、name,因为id、name基本是唯一的,没有共同特征。 ​ 2.2.1)使用class_name寻找共同特征的技巧是:如果class属性值中有空格,则可以截取class属性的部分值(截取到的部分值中一定不要包含空格) ​ 2.2.1)使用xpath寻找共同特征的技巧是:一般布局规范的前端HTML代码路径有相同层级分布,xpath的值选择它们之间共同的层级路径,最后在需要做出区分的层级,去掉其序号,比如: ``` 菜单1-子级1://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[1]/ul/li[1] 菜单1-子级2://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[1]/ul/li[2] 菜单2-子级3://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[2]/ul/li[3] 菜单2-子级5://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[2]/ul/li[5] 定位所有菜单,xpath的值为://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li 定位所有子级,xpath的值为://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li/ul/li ``` ​ 2.3 定位方法最好使用显式等待 ​ 2.3.1)定位可点击的元素时,优先考虑使用的定位方法是显式等待的element_to_be_clickable方法 ​ 2.3.1.1)注意判断按钮是否可点击,不是所有按钮都可点击的 ​ 2.3.1.2)注意使用 click() 点击方法时,最好点击前加个强制等待时间,因为可点击不代表点击之后就会起作用,可能页面还没有渲染完成 ​ 2.3.2) 定位多个元素时,优先考虑使用的定位方法是显式等待的visibility_of_all_elements_located、visibility_of_any_elements_located方法,这两种方法的区别是要定位的元素是否全部可见(元素可见的含义为元素的高和宽都大于0),注意判断元素是否可见,不是所有元素都会处于一直可见的状态的 ​ 2.4 定位不到元素 ​ 在保证xpath正确的情况下,使用绝对路径xpath都定位不到元素时,需要更换定位方法:依据该元素是否可见、是否出现在DOM树里面等,使用适合的方法 ​ 3、元素操作 ​ 3.1) 定位到了元素,不代表能马上获取到其属性值,比如点击元素无效、当前页面刷新获取到旧的url等,所以需要把控好获取元素的属性值时间,手动加个强制时间等待等 ## 问题解决 ``` 1、 问题:allure-pytest=2.13.0与pytest-rerunsfailures=10.3搭配使用时,不明原因导致生成allure报告后会出现多条重复的失败用例记录,且没有标记重跑次数 解决:使用低版本allure-pytest=2.10.0或更低 ``` ``` 2、 问题:cases/test_login_case.py: 25 warnings E:\DATA\PycharmProjects\web_ui_frame\venv\lib\site-packages\selenium\webdriver\remote\remote_connection.py:418: DeprecationWarning: HTTPResponse.getheader() is deprecated and will be removed in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default). if resp.getheader('Content-Type') is not None: cases/test_login_case.py: 25 warnings E:\DATA\PycharmProjects\web_ui_frame\venv\lib\site-packages\selenium\webdriver\remote\remote_connection.py:419: DeprecationWarning: HTTPResponse.getheader() is deprecated and will be removed in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default). content_type = resp.getheader('Content-Type').split(';') 解决: 这是由于selenium中,底层使用urllib3在处理http请求,相关的相应头操作已被移除,所以报出以上warning。 可以在报错的文件(remote_connection.py)的相关行内,把getheader()替换为headers.get()即可。 如把: if resp.getheader('Content-Type') is not None: 替换为: if resp.headers.get('Content-Type') is not None: 同理,content_type = resp.getheader('Content-Type').split(';') 替换为: content_type = resp.headers.get('Content-Type', '').split(';') ``` ``` 3、 问题:pytest.ini 文件加注解报错,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf 解决: 1)选中pytest.ini,点击选中File->File Properties->File Encoding 2)找到GBK格式,选中保存 3)重新执行正常脚本,不再报错 ``` ## 其他内容 ### 测试流程 ​ 1、可行性分析 ​ 确认其可行性,是否可以实行测试自动化 ​ 2、测试需求分析 ​ 确定测试覆盖率以及自动化测试粒度、测试用例上的筛选等 ​ 3、制定测试计划 ​ 评估完成所有测试活动的时间,测试活动安排及资源分配等,控制测试过程以及跟踪整个测试过程 ​ 4、测试用例设计 ​ 通过从功能测试用例筛选、修改,转为自动化测试用例 ​ 5、测试脚本开发 ​ 框架设计与搭建,测试脚本编写,Git版本控制,脚本合并联调 ​ 6、测试执行阶段 ​ 脚本运行环境搭建,手动、半手动半自动方式执行或Jenkins无人值守自动执行 ​ 7、测试总结阶段 ​ 对测试结果文件中报告错误的记录进行分析,如果确实是由于被测系统的缺陷导致,则提交缺陷报告。对自动化测试的结果进行总结,分析系统存在的问题,并提交《测试报告》 ​ 8、脚本维护迭代 ## 演示图片 #### 业务系统 ![输入图片说明](datas/images/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F1.png) ![输入图片说明](datas/images/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F2.png) ![输入图片说明](datas/images/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F3.png) ![输入图片说明](datas/images/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F4.png) #### 测试用例 ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B1.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B2.png) #### 测试报告 ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A1.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A2.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A3.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A4.png)