如何在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声明为元素描述符的实例,之后直接通过页面对象实例的属性访问即可:
- 先在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
- 实际调用示例:
# 实例化主页对象,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
相关产品推荐
相关产品推荐

