如何在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()
关键说明
- 实例化页面对象:和Java的
new SignInPage()对应,Python中用GoodExample1(self.driver)创建实例——所有页面对象需要共享同一个Seleniumdriver实例,所以初始化时要传入driver。 - 调用实例方法:在测试代码中可以这样使用返回的页面对象:
# 初始化主页面 main_page = MainPage(driver) # 点击打开新页面并获取其页面对象 good_example_page = main_page.open_good_example_1() # 调用新页面的方法 assert good_example_page.is_heading_displayed() - 原错误修正:你之前的
GoodExample1.is_heading_displayed(self)写法错误,因为is_heading_displayed是实例方法,必须通过GoodExample1的实例调用,而非直接通过类名调用。
内容的提问来源于stack exchange,提问作者Murka
相关产品推荐
相关产品推荐

