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

如何在Python Selenium的PageObjects中使用__set__与__get__方法

Selenium 页面对象模式问题解答

一、element.py中__set__和__get__方法的功能

这两个方法是Python描述符协议的标准实现,作用是把元素的定位、等待、输入逻辑和页面对象解耦,避免在业务代码中重复写元素查找代码:

  • __get__:当你在页面对象实例中访问对应元素属性时,该方法会自动触发,内部会使用传入的driver,按照预定义的定位规则查找页面元素,返回找到的WebElement对象,通常还会内置显式等待逻辑避免元素未加载导致的报错。
  • __set__:当你给元素属性赋值时,该方法会自动触发,内部会先定位到目标元素,先清空输入框原有内容,再把你赋的值通过send_keys输入到元素中。

二、在page.MainPage中调用search_text_element的方法

你需要先在MainPage类中把search_text_element声明为元素描述符的实例,之后直接通过页面对象实例的属性访问即可:

  1. 先在MainPage类中声明元素属性,传入定位规则:
from selenium.webdriver.common.by import By
from your_project.element import SearchTextElement

class MainPage:
    # 这里传入的参数对应搜索框的定位方式和定位值,可根据实际网站调整
    search_text_element = SearchTextElement(By.NAME, "q")
    
    def __init__(self, driver):
        self.driver = driver
  1. 实际调用示例:
# 实例化主页对象,driver是已经初始化的Selenium驱动实例
main_page = MainPage(driver)
# 给属性赋值就会自动往搜索框输入内容
main_page.search_text_element = "测试关键词"
# 直接访问属性就会返回搜索框的WebElement对象
search_input = main_page.search_text_element

三、定位搜索框、输入内容并发送回车的完整流程

注意:回车指令属于按键操作,存放在selenium.webdriver.common.keys.Keys类中,不是By类的属性,请勿导错包。
按照官方文档的文件结构,操作步骤如下:

步骤1:实现element.py的元素封装逻辑

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

class BasePageElement:
    def __init__(self, by, locator):
        self.locator = (by, locator)
    
    def __get__(self, instance, owner):
        driver = instance.driver
        # 内置10秒显式等待,确保元素加载完成
        WebDriverWait(driver, 10).until(lambda d: d.find_element(*self.locator))
        return driver.find_element(*self.locator)
    
    def __set__(self, instance, value):
        driver = instance.driver
        WebDriverWait(driver, 10).until(lambda d: d.find_element(*self.locator))
        input_elem = driver.find_element(*self.locator)
        input_elem.clear()
        input_elem.send_keys(value)

# 搜索框元素可直接继承基类
class SearchTextElement(BasePageElement):
    pass

步骤2:实现page.py中的MainPage类,封装搜索操作

from selenium.webdriver.common.keys import Keys
from element import SearchTextElement, By

class MainPage:
    # 替换为你目标网站搜索框的实际定位规则
    search_text_element = SearchTextElement(By.ID, "kw")
    
    def __init__(self, driver):
        self.driver = driver
        # 打开目标网站主页
        self.driver.get("https://你的目标网站地址")
    
    def run_search(self, keyword):
        # 输入搜索关键词
        self.search_text_element = keyword
        # 发送回车指令触发搜索
        self.search_text_element.send_keys(Keys.RETURN)

步骤3:业务代码调用

from selenium import webdriver
from page import MainPage

# 初始化浏览器驱动
driver = webdriver.Chrome()
# 实例化主页并执行搜索
main_page = MainPage(driver)
main_page.run_search("你要输入的指定字符串")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:27:03