当前位置:首页 > 技术 > 正文内容

YAML深度解析:语法规范与Python实践指南

访客 技术 2026年5月28日 2

YAML简介

YAML(YAML Ain’t Markup Language)是一种以人类可读性为核心设计的数据序列化格式。它通过简洁的结构表达复杂的数据关系,广泛应用于配置管理、数据交换和自动化测试等领域。其核心优势在于语法直观、层级清晰,且对多种编程语言具有良好的兼容性。

基本语法规则

  • 缩进表示层级:使用空格而非括号或符号定义嵌套结构,推荐每级缩进2或4个空格,全文档需保持一致。
  • 键值对用冒号分隔:如 name: "Alice"
  • 列表项以短横线开头:如 - item1 表示一个元素。
  • 注释以 # 开头:例如 # 这是一个注释
  • 支持锚点与引用:可通过 &anchor 定义,用 *anchor 引用。

常见数据类型示例

类型语法示例
字符串双引号或单引号包裹,也可省略city: "Beijing"
数字直接书写score: 95
布尔值true / falseactive: true
列表每项前加 -colors: - red - blue
字典键值对分行书写user: name: Bob age: 25
空值nullstatus: null

Python中操作YAML文件

使用 PyYAML 库实现读写功能:

pip install pyyaml

读取YAML文件

import yaml

with open("config.yaml", "r", encoding="utf-8") as file:
    data = yaml.safe_load(file)
print(data)

该方法将YAML内容转换为Python原生数据类型(字典、列表等),安全且避免执行恶意代码。

写入YAML文件

import yaml

data = {
    "user": {
        "name": "Emma",
        "age": 28,
        "address": {
            "street": "456 Oak Ave",
            "city": "New York",
            "zip": "10001"
        }
    }
}

with open("output.yaml", "w", encoding="utf-8") as file:
    yaml.dump(data, file, default_flow_style=False, encoding="utf-8")

使用 default_flow_style=False 可确保输出格式美观,适合人工阅读。

结合UI自动化构建关键字驱动测试

利用YAML存储测试步骤,实现逻辑与脚本分离:

1. 准备测试数据(test_steps.yaml)

steps:
  - action: goto
    params: {url: "https://example.com"}
  - action: click
    params: {locator: ("id", "submit-btn")}
  - action: sendkeys
    params: {value: "test@example.com", locator: ("name", "email")}
  - action: assert_text_contains
    params: {locator: ("class", "message"), excepted: "成功"}

2. 封装基础操作类

from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

class BasePage:
    def __init__(self, driver: Chrome):
        self.driver = driver

    def goto(self, url: str):
        self.driver.get(url)

    def click(self, locator: tuple):
        element = self.driver.find_element(*locator)
        element.click()

    def sendkeys(self, value: str, locator=None):
        if locator:
            element = self.driver.find_element(*locator)
            element.send_keys(value)
        else:
            self.driver.send_keys(value)

    def assert_text_contains(self, locator: tuple, expected: str):
        element = self.driver.find_element(*locator)
        assert expected in element.text

3. 执行测试用例

import time
import yaml
from selenium import webdriver
from basepage import BasePage

# 读取配置
with open("test_steps.yaml", "r", encoding="utf-8") as f:
    steps = yaml.safe_load(f)["steps"]

# 启动浏览器并运行测试
driver = webdriver.Chrome()
base_page = BasePage(driver)
driver.implicitly_wait(10)

for step in steps:
    method_name = step["action"]
    params = step["params"]
    method = getattr(base_page, method_name)
    method(**params)
    time.sleep(1)

driver.quit()

通过动态调用方法与参数解包,实现高度灵活的测试流程控制。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。