0

0

4.UI自动化测试框架搭建-文件结构

蓮花仙者

蓮花仙者

发布时间:2025-07-15 10:38:26

|

984人浏览过

|

来源于php中文网

原创

在创建和组织ui自动化测试框架时,根据上述结构设置好文件和文件夹后,我们需要将之前编写的元素操作放置在utils文件夹中,yaml文件放置在data文件夹中。同时,还需要将不同操作系统driver文件和allure报告工具放置在tools文件夹中。以下是详细的伪原创指南:

首先,根据给定的项目结构,创建好相应的文件夹和文件。将元素操作代码放到utils文件夹中,将yaml文件存放于data文件夹中。这些文件的组织方式确保了代码和数据的清晰分离,方便后续的维护和管理。

对于UI测试,需确保浏览器能正常打开。将不同操作系统所需的driver文件放到tools文件夹中。此外,为了生成测试报告,还需要下载allure.zip,解压后将文件也放置在tools文件夹中。完成这些步骤后,文件夹结构将如下所示:

4.UI自动化测试框架搭建-文件结构

随着项目规模的扩大,常量文件中的内容也会增加。为此,我们需要在utils文件夹中创建一个constant.py文件,用于快速获取项目中的路径。首先,通过os.path.abspath(__file__)获取当前文件的绝对路径,然后使用os.path.dirname(path)获取其上一层路径,重复三次即可获得项目根路径:

BASE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

接下来,使用os.path.join()方法拼接路径,以方便访问项目中的各个文件夹:

import os
BASE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
BASE_DATA_PATH = os.path.join(BASE_PATH, 'data')
SRC_PATH = os.path.join(BASE_PATH, 'src')
TOOL_PATH = os.path.join(SRC_PATH, 'tools')
ALLURE_TOOL_PATH = os.path.join(TOOL_PATH, 'allure-2.14.0/bin')

在测试过程中,可能需要创建一些临时文件夹来存储日志和报告等文件。我们可以通过检查这些文件夹是否存在,如果不存在则创建它们:

LOG_PATH = os.path.join(BASE_PATH, 'log')
REPORT_PATH = os.path.join(BASE_PATH, 'report')
TEST_PIC = os.path.join(REPORT_PATH, 'test_pic')
for i in [LOG_PATH, REPORT_PATH, TEST_PIC]:
    if not os.path.exists(i):
        os.mkdir(i)

通过constant.py文件,我们可以轻松获取项目中的路径。现在,我们可以使用绝对路径来访问driver文件,并通过desired_capabilities设置来优化浏览器的启动方式。desired_capabilities有三种设置方式:noneeagernormal。在UI自动化测试中,经常会遇到一些资源未加载完成的问题,这时可以将desired_capabilities设置为eager,以确保DOM加载完成后即可找到并操作元素:

from selenium.webdriver import DesiredCapabilities
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "eager"
webdriver.Chrome(desired_capabilities=desired_capabilities)

为了确保浏览器在不同操作系统上都能正常运行,我们需要根据当前操作系统来选择相应的driver文件:

Blogcast™
Blogcast™

BlogcastTM是一个文本转语音的工具,允许用户创建播客、视频、电子学习课程的音频和音频书籍,而无需录制。

下载
if platform.system() == "Windows":
    driver_path = f'{TOOL_PATH}/driver/win/chromedriver'
elif platform.system() == "Linux":
    driver_path = f'{TOOL_PATH}/driver/linux/chromedriver'
    os.system(f"chmod -R 777 {driver_path}")
else:
    driver_path = f'{TOOL_PATH}/driver/mac/chromedriver'
    os.system(f"chmod -R 777 {driver_path}")

对于没有图形界面的Linux系统,需要使用无头浏览器模式运行:

chrome_option = Options()
chrome_option.add_argument('--headless')
chrome_option.add_argument('--no-sandbox')
chrome_option.add_argument('--disable-gpu')
chrome_option.add_argument('--disable-dev-shm-usage')

如果需要以H5方式运行测试,则需要修改浏览器的mobileEmulation配置:

chrome_option = Options()
chrome_option.add_experimental_option('mobileEmulation', {'deviceName': deviceName})
chrome_option.add_experimental_option('w3c', False)

完整的浏览器启动代码应包含异常处理和兼容性处理,并在浏览器打开后最大化窗口:

try:
    self.driver.maximize_window()
except Exception as e:
    print(f"浏览器最大化失败:{e}")

在操作过程中,如果需要切换到某个frame,可以使用以下代码:

def switch_frame(self, frame_locator):
    self.driver.switch_to.default_content()
    self.driver.switch_to.frame(frame_locator.element)

最后,提供完整的浏览器打开函数,包含所有必要的参数和处理逻辑:

def open(self, url, locator, frame_locator=None, driver='chrome', deviceName='iPhone X'):
    """ 
    :param url: 打开的地址 
    :param locator: 确认打开成功的元素 
    :param frame_locator: 需要切换的frame 
    :param driver: 浏览器驱动 
    :param deviceName: h5测试设备型号 
    :return: 
    """
    driver = driver.lower()
    if driver in ['chrome', 'ie', 'chrome-h5']:
        try:
            socket.setdefaulttimeout(50)
            if not self.driver:
                if 'chrome' in driver:
                    desired_capabilities = DesiredCapabilities.CHROME
                    desired_capabilities["pageLoadStrategy"] = "eager"
                    chrome_option = Options()
                    if HEADLESS == 'true':
                        chrome_option.add_argument('--headless')
                    if driver == 'chrome-h5':
                        chrome_option.add_experimental_option('mobileEmulation', {'deviceName': deviceName})
                        chrome_option.add_experimental_option('w3c', False)
                    if platform.system() == "Windows":
                        driver_path = f'{TOOL_PATH}/driver/win/chromedriver'
                    elif platform.system() == "Linux":
                        chrome_option.add_argument('--headless')
                        chrome_option.add_argument('--no-sandbox')
                        chrome_option.add_argument('--disable-gpu')
                        chrome_option.add_argument('--disable-dev-shm-usage')
                        driver_path = f'{TOOL_PATH}/driver/linux/chromedriver'
                        os.system(f"chmod -R 777 {driver_path}")
                    else:
                        driver_path = f'{TOOL_PATH}/driver/mac/chromedriver'
                        os.system(f"chmod -R 777 {driver_path}")
                    logger.info(f'使用的chromedriver为「{driver_path}」。请确认版本是否与当前浏览器版本一致')
                    self.driver = webdriver.Chrome(executable_path=f'{driver_path}', 
                                                   chrome_options=chrome_option, 
                                                   desired_capabilities=desired_capabilities)
                elif driver == 'ie':
                    ie_options = DesiredCapabilities.INTERNETEXPLORER  # 将忽略IE保护模式的参数设置为True
                    ie_options['ignoreProtectedModeSettings'] = True  # 忽略浏览器缩放设置
                    ie_options['ignoreZoomSetting'] = True  # 启动带有自定义设置的IE浏览器
                    self.driver = webdriver.Ie(capabilities=ie_options)
            time.sleep(2)
            self.driver.get(url)
            time.sleep(5)
            try:
                self.driver.maximize_window()
            except Exception as e:
                print(f"浏览器最大化失败:{e}")
            if frame_locator:
                self.wait_element_visible(frame_locator)
                self.switch_frame(frame_locator)
            if locator:
                self.wait_element_visible(locator)
        except Exception as e:
            raise Exception(f"打开浏览器进入{url}失败:{e}")
    self.wait_for(10)
    return self.driver

项目地址已在version_1分支中更新:

https://www.php.cn/link/cec819fa603e0b3f17e6aeaf4a6e6890

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3072

2024.08.14

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1996

2024.08.16

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1349

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

703

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

573

2023.07.06

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

52

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.8万人学习

CSS教程
CSS教程

共754课时 | 21.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号