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

如何在Python方法中返回Selenium页面对象的新实例?

问题

我有Java编写Selenium页面对象模型(POM)测试的经验,现在要在Python里实现相同逻辑:点击方法内的链接后,返回新打开页面的页面对象实例,方便调用该实例的方法。

Java里的实现方式:

public class MainPage extends BasePage {

    public SignInPage clickSignIn(){
        clickElementByXpath(SIGN_IN_OPTION);
        return new SignInPage();
    }
}

但在Python中尝试时遇到问题,以下是项目示例代码,调用页面对象方法时提示需传入self参数:

class MainPage(BasePage):
    def open_good_example_1(self):
        """Open good example 1 and return it's heading."""
        example_heading = GoodExample1.is_heading_displayed(self)
        return example_heading

class GoodExample1(BasePage):
    """Page object model for good menu example.

    Search locators and methods are included here for Selenium tests.
    """

    # Search locators
    GOOD_MENU_EXAMPLE_HEADING = "//h1[@id='good-menu-example-heading']"

    def is_heading_displayed(self):
        """Find and return heading to check if it is displayed in test."""
        return self.find_element_by_xpath(self.GOOD_MENU_EXAMPLE_HEADING)

请问如何在Python中像Java那样,在主页面的方法中调用并返回GoodExample1的实例?

解决方法

你的问题核心是直接通过类名调用实例方法,而没有先创建类的实例。Python中实例方法必须通过类的实例调用,无法直接用类名调用(静态方法除外)。要实现和Java一致的逻辑,需在MainPage的方法中先创建GoodExample1的实例并返回,后续即可通过该实例调用其方法。

修正后的代码示例

class MainPage(BasePage):
    def open_good_example_1(self):
        """点击打开GoodExample1页面,并返回该页面的实例"""
        # 先执行打开页面的点击操作(替换为实际的元素定位器)
        self.click_element_by_xpath("定位打开GoodExample1的元素的XPath")
        # 创建并返回GoodExample1实例,对应Java的new SignInPage()
        return GoodExample1(self.driver)  # 需确保BasePage初始化时接收driver参数,根据你的BasePage实现调整

class GoodExample1(BasePage):
    """Page object model for good menu example.

    Search locators and methods are included here for Selenium tests.
    """

    # Search locators
    GOOD_MENU_EXAMPLE_HEADING = "//h1[@id='good-menu-example-heading']"

    def is_heading_displayed(self):
        """检查标题是否显示"""
        return self.find_element_by_xpath(self.GOOD_MENU_EXAMPLE_HEADING).is_displayed()

关键说明

  1. 实例化页面对象:和Java的new SignInPage()对应,Python中用GoodExample1(self.driver)创建实例——所有页面对象需要共享同一个Selenium driver实例,所以初始化时要传入driver。
  2. 调用实例方法:在测试代码中可以这样使用返回的页面对象:
    # 初始化主页面
    main_page = MainPage(driver)
    # 点击打开新页面并获取其页面对象
    good_example_page = main_page.open_good_example_1()
    # 调用新页面的方法
    assert good_example_page.is_heading_displayed()
    
  3. 原错误修正:你之前的GoodExample1.is_heading_displayed(self)写法错误,因为is_heading_displayed是实例方法,必须通过GoodExample1的实例调用,而非直接通过类名调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:55:20