You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+Selenium测试框架JSON存元素报错及方案咨询

解决JSONDecodeError问题

首先,你遇到的JSONDecodeError是因为用错了JSON读取方法:json.loads()是用来解析JSON格式的字符串,但你传入的是文件名'elements.json'——这只是个普通字符串,根本不是JSON内容,所以解析失败。

修正后的元素操作脚本

把读取JSON的逻辑改成用json.load()打开文件读取内容,同时结合你JSON里的type字段动态选择定位方式(这样更贴合你的JSON结构):

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json

class HomeScreen:
    def __init__(self, driver):
        self.driver = driver
        # 正确读取JSON文件
        with open('elements.json', 'r', encoding='utf-8') as f:
            element_data = json.load(f)
        
        # 根据JSON中的type字段动态获取By类型,避免硬编码
        locator_type = getattr(By, element_data['type'])
        self.logo_element = WebDriverWait(self.driver.instance, 10).until(
            EC.visibility_of_element_located((locator_type, element_data['element']))
        )

    def validate_logo_is_present(self):
        assert self.logo_element.is_displayed(), "Logo元素未显示"

另外注意:你原来的代码里用了data['name'][0],但你的JSON中"name"是字符串"LOGO",不是数组,这会引发另一个错误——我们需要的是element字段的值"logo img-responsive",所以直接用element_data['element']即可。

修复JSON写入的问题

你当前的写入代码用追加模式'a'每次写入单个JSON对象,这会导致文件内容是多个独立的JSON对象,不是合法的JSON结构(比如{...}\n{...}),后续读取会报错。如果要存储多个元素,应该把JSON组织成数组:

正确的JSON结构(支持多个元素)

[
    {
        "name": "LOGO",
        "element": "logo img-responsive",
        "type": "CLASS_NAME"
    },
    {
        "name": "SEARCH_BOX",
        "element": "search-input",
        "type": "ID"
    }
]

修正后的写入代码

def write_to_json(new_element, filename):
    try:
        # 先读取现有文件中的元素列表
        with open(filename, 'r', encoding='utf-8') as file:
            elements_list = json.load(file)
    except FileNotFoundError:
        # 如果文件不存在,初始化空列表
        elements_list = []
    
    # 添加新元素并写入
    elements_list.append(new_element)
    with open(filename, 'w', encoding='utf-8') as file:
        json.dump(elements_list, file, indent=4)

# 调用示例
new_logo = {"name": "LOGO", "element": "logo img-responsive", "type": "CLASS_NAME"}
write_to_json(new_logo, 'elements.json')

关于元素信息存储方案的疑问

把元素信息存入JSON是非常合理的方案,这属于测试框架中常见的「对象库模式」,是页面对象模型(POM)的延伸,优势很明显:

  • 解耦性强:元素定位信息和测试逻辑完全分离,以后元素定位器变更时,只需要修改JSON文件,不用动测试脚本
  • 复用性高:多个测试用例可以共用同一个元素定义,避免重复代码
  • 可读性好:所有元素集中管理,方便团队成员查找和维护

针对「文件过长」的优化建议

如果担心后续JSON文件过于庞大,可以试试这些方案:

  1. 按页面拆分文件:比如给首页创建home_elements.json,登录页创建login_elements.json,每个页面对应一个独立的JSON文件
  2. 层级化组织内容:在单个JSON文件里按页面分组,结构更清晰:
    {
        "home_page": {
            "logo": {"element": "logo img-responsive", "type": "CLASS_NAME"},
            "nav_menu": {"element": "main-nav", "type": "ID"}
        },
        "login_page": {
            "username_input": {"element": "user-name", "type": "NAME"}
        }
    }
    
  3. 换用YAML格式:YAML比JSON语法更简洁,支持注释,可读性更好,Python里可以用pyyaml库解析

不推荐直接嵌入脚本的原因

如果把元素定位硬编码到测试脚本里,短期看似简单,但长期维护成本极高:当元素定位变更时,你需要在大量测试脚本中逐个查找修改,很容易遗漏;而且重复的定位器会导致代码冗余,不符合「DRY(Don't Repeat Yourself)」原则。

内容的提问来源于stack exchange,提问作者JD2775

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:25:02