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

如何将字典值传入Python类作为参数?(Selenium页面对象优化)

解决Selenium页面对象类的简化问题

原代码错误分析

你尝试的代码未生效,核心问题有两个:

  1. 访问字典键时未用字符串包裹:self.elements_map[usernameInputField]中的usernameInputField会被当作未定义变量,正确写法应为self.elements_map['usernameInputField'](用引号包裹键名)。
  2. 元素定位信息不完整:当前字典仅存定位器字符串,未包含定位方式(如By.CSS_SELECTOR),可将两者整合为元组提升灵活性。

修正后的基础版本

from selenium.webdriver.common.by import By
from support.utlis import DriverUtil

# 整合定位方式与定位器的元素映射
elementsMap = {
    'usernameInputField': (By.CSS_SELECTOR, 'input[name="txtUsername"]'),
    'passwordInputField': (By.CSS_SELECTOR, 'input[name="txtPassword"]'),
    'login_button': (By.CSS_SELECTOR, 'input[value="Login"]')
}

class LoginPage:
    def __init__(self, elements_map=None):
        self.driver = DriverUtil.get_driver()
        # 支持传入自定义映射,无传入则用默认值
        self.elements_map = elements_map or elementsMap

    def username_input_field(self):
        by, locator = self.elements_map['usernameInputField']
        return self.driver.find_element(by, locator)

    def password_input_field(self):
        by, locator = self.elements_map['passwordInputField']
        return self.driver.find_element(by, locator)

    def login_button(self):
        by, locator = self.elements_map['login_button']
        return self.driver.find_element(by, locator)

更简洁的@property版本

用装饰器将方法转为属性,调用时无需加括号:

from selenium.webdriver.common.by import By
from support.utlis import DriverUtil

elementsMap = {
    'username_input_field': (By.CSS_SELECTOR, 'input[name="txtUsername"]'),
    'password_input_field': (By.CSS_SELECTOR, 'input[name="txtPassword"]'),
    'login_button': (By.CSS_SELECTOR, 'input[value="Login"]')
}

class LoginPage:
    def __init__(self, elements_map=None):
        self.driver = DriverUtil.get_driver()
        self.elements_map = elements_map or elementsMap

    @property
    def username_input_field(self):
        by, locator = self.elements_map['username_input_field']
        return self.driver.find_element(by, locator)

    @property
    def password_input_field(self):
        by, locator = self.elements_map['password_input_field']
        return self.driver.find_element(by, locator)

    @property
    def login_button(self):
        by, locator = self.elements_map['login_button']
        return self.driver.find_element(by, locator)

极致简化:动态生成元素属性

通过动态绑定属性彻底消除重复代码,新增元素仅需修改字典:

from selenium.webdriver.common.by import By
from support.utlis import DriverUtil

elementsMap = {
    'username_input_field': (By.CSS_SELECTOR, 'input[name="txtUsername"]'),
    'password_input_field': (By.CSS_SELECTOR, 'input[name="txtPassword"]'),
    'login_button': (By.CSS_SELECTOR, 'input[value="Login"]')
}

class LoginPage:
    def __init__(self, elements_map=None):
        self.driver = DriverUtil.get_driver()
        self.elements_map = elements_map or elementsMap

        # 遍历映射,动态生成元素属性
        for name, (by, locator) in self.elements_map.items():
            def get_element(by=by, locator=locator):
                return self.driver.find_element(by, locator)
            setattr(self, name, property(get_element))

版本优势

  • 修正字典键访问错误,确保语法合规。
  • 整合定位方式与定位器,适配后续定位策略变更。
  • 支持传入自定义元素映射,适配多环境/多版本页面。
  • 动态生成属性版本彻底减少冗余代码,维护成本更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:36:21