上篇:简易web页面ui自动化架构学习(4)-PageObject
PageLocatorst-bid_page_locator.py
所有页面的定位元素,按页面编写,方便编写页面方法的时候复用
import syssys.path.append('..')from selenium.webdriver.common.by import Byclass BidPageLocator:# 投资输入框invest_input = (By.XPATH,'//input[@data-url="/Invest/invest"]')# 投资按钮invest_button = (By.XPATH,'//button[text()="投标"]')# 投资成功 - 查看并激活按钮active_button_in_successPopup = (By.XPATH,'//div[@class="layui-layer-content"]//button[text()="查看并激活"]')# 投资失败 - 弹出框 - 提示信息invest_failed_popup = (By.XPATH,'//div[contains(@class,"layui-layer-dialog")]//div[@class="text-center"]')# 投资失败 - 弹出框 - 关闭弹出框invest_close_failed_popup_button = (By.XPATH,'//div[contains(@class,"layui-layer-dialog")]//a')
这段代码定义了一个名为 BidPageLocator 的类,用于存储投标页面(Bid Page)中各种元素的定位器。这些定位器使用 Selenium 的 By 类来指定定位策略(如 XPath)。以下是代码的解析:
1. 导入模块
import syssys.path.append('..')from selenium.webdriver.common.by import By
sys.path.append('..'):将上一级目录添加到 Python 的模块搜索路径中,通常用于导入上级目录中的模块。 from selenium.webdriver.common.by import By:导入 Selenium 的 By类,用于指定元素定位策略(如By.XPATH、By.ID等)。
2. BidPageLocator 类
class BidPageLocator:
这是一个包含投标页面元素定位器的类,所有属性都是静态的(无需实例化即可使用)。
3. 元素定位器
以下是类中定义的元素定位器,均使用 By.XPATH 策略:
- 投资输入框
invest_input = (By.XPATH, '//input[@data-url="/Invest/invest"]')
通过 input 标签的 data-url 属性定位投资金额输入框。
- 投资按钮
invest_button = (By.XPATH, '//button[text()="投标"]')
通过按钮的文本内容 "投标" 定位投资按钮。
- 投资成功弹窗的“查看并激活”按钮
invest_input = (By.XPATH, '//input[@data-url="/Invest/invest"]')
定位投资成功后弹窗中的“查看并激活”按钮。
-
先找到 class="layui-layer-content"的div,再在其子元素中找到文本为 "查看并激活" 的button。
- 投资失败弹窗的提示信息
invest_button = (By.XPATH, '//button[text()="投标"]')
定位投资失败弹窗中的提示信息。
-
找到 class包含"layui-layer-dialog"的div,再在其子元素中找到class="text-center"的div。
- 投资失败弹窗的关闭按钮
active_button_in_successPopup = (By.XPATH, '//div[@class="layui-layer-content"]//button[text()="查看并激活"]')
定位投资失败弹窗的关闭按钮(通常是一个 a 标签)。
-
找到 class包含"layui-layer-dialog"的div,再在其子元素中找到a标签。
4. 用途
-
这些定位器用于在 Selenium 自动化测试中定位投标页面的关键元素,例如输入投资金额、点击投标按钮、处理成功或失败的弹窗等。 -
通过将定位器集中管理,可以提高代码的可维护性(如需修改定位方式,只需调整此处)。
这段代码是一个典型的 Page Object Model (POM) 设计模式的实现,将页面元素的定位信息集中管理,便于维护和复用。
PageObjects-bid_page.py
根据页面编写操作函数,方便后续用例调用的时候复用。
import syssys.path.append("..")from PageLocators.bid_page_locator import BidPageLocator as locfrom Common.BasePage import BasePageclass BidPage(BasePage):#获取用户余额def get_user_leftMoney(self):name = "标页面_获取用户余额"#等待self.wait_eleVisible(loc.invest_input,model=name)# 获取金额输入框的data-amount属性值;return self.get_element_attribute(loc.invest_input,"data-amount",model=name)#投资操作def invest(self,money):name = "标页面_投资操作"#输入框,输入值self.wait_eleVisible(loc.invest_input,model=name)self.input_text(loc.invest_input,money,model=name)# 点击按钮self.click_element(loc.invest_button,model=name)#投资成功 - 弹出框 - 点击激活并查看按钮def click_activeButton_from_investSuccess_popup(self):name = "标页面_投资成功弹出框_点击查看并激动按钮"self.wait_eleVisible(loc.active_button_in_successPopup,model=name)self.click_element(loc.active_button_in_successPopup,model=name)#投资失败 - 2种场景# 投资失败的弹出框 - 获取信息def get_errorMsg_from_popup(self):name = "投资失败弹出框_提示信息"self.wait_eleVisible(loc.invest_failed_popup, model=name)msg = self.get_text(loc.invest_failed_popup, model=name)# 关闭弹出框self.click_element(loc.invest_close_failed_popup_button, model=name)return msg
这段代码定义了一个 BidPage 类,继承自 BasePage,用于封装投标页面(Bid Page)的操作逻辑。它结合了 BidPageLocator(页面元素定位器)和 BasePage(基础页面操作类)来实现投标页面的功能。以下是详细解析:
1. 导入模块
import syssys.path.append("..")from PageLocators.bid_page_locator import BidPageLocator as locfrom Common.BasePage import BasePage
sys.path.append(".."):将上级目录添加到 Python 的模块搜索路径,以便导入其他目录的模块。 BidPageLocator:导入页面元素定位器类,并重命名为 loc,简化后续调用。BasePage:导入基础页面类, BidPage继承它,复用其封装的方法(如输入文本、点击元素等)。
2. BidPage 类
继承 BasePage,封装投标页面的具体操作:
(1) 获取用户余额
def get_user_leftMoney(self):name = "标页面_获取用户余额"self.wait_eleVisible(loc.invest_input, model=name)return self.get_element_attribute(loc.invest_input, "data-amount", model=name)
- 功能
:获取投资输入框中 data-amount属性的值(用户可用余额)。 - 步骤
:
-
等待投资输入框可见( wait_eleVisible)。 -
获取输入框的 data-amount属性值(get_element_attribute)。
- 参数说明
:
model=name:用于日志记录,标识当前操作所属模块。
(2) 投资操作
def invest(self, money):name = "标页面_投资操作"self.wait_eleVisible(loc.invest_input, model=name)self.input_text(loc.invest_input, money, model=name)self.click_element(loc.invest_button, model=name)
- 功能
:输入投资金额并点击投标按钮。 - 步骤
:
-
等待投资输入框可见。 -
在输入框中输入金额( input_text)。 -
点击投标按钮( click_element)。
(3) 处理投资成功弹窗
def click_activeButton_from_investSuccess_popup(self):name = "标页面_投资成功弹出框_点击查看并激动按钮"self.wait_eleVisible(loc.active_button_in_successPopup, model=name)self.click_element(loc.active_button_in_successPopup, model=name)
- 功能
:点击投资成功弹窗中的“查看并激活”按钮。 - 步骤
:
-
等待按钮可见。 -
点击按钮。
(4) 处理投资失败弹窗
def get_errorMsg_from_popup(self):name = "投资失败弹出框_提示信息"self.wait_eleVisible(loc.invest_failed_popup, model=name)msg = self.get_text(loc.invest_failed_popup, model=name)self.click_element(loc.invest_close_failed_popup_button, model=name)return msg
- 功能
:获取投资失败弹窗的提示信息,并关闭弹窗。 - 步骤
:
-
等待失败提示弹窗可见。 -
获取弹窗文本内容( get_text)。 -
关闭弹窗(点击关闭按钮)。 -
返回错误消息。
3. 关键设计思想
- Page Object Model (POM)
-
页面元素定位( BidPageLocator)与操作逻辑(BidPage)分离,提高代码可维护性。 -
元素定位变更只需修改 BidPageLocator,不影响测试脚本。
- 继承
BasePage
-
复用基础方法(如 input_text、click_element),避免重复代码。 -
统一处理等待、日志等通用逻辑。
- 显式等待
-
所有操作前均通过 wait_eleVisible确保元素可交互,增强脚本稳定性。
- 错误处理
-
投资失败场景通过弹窗提示和关闭操作封装,简化调用方代码。
4. 示例调用
# 假设在测试脚本中调用driver = webdriver.Chrome()bid_page = BidPage(driver)# 获取用户余额balance = bid_page.get_user_leftMoney()print(f"当前余额: {balance}")# 投资操作bid_page.invest("100")# 处理成功弹窗bid_page.click_activeButton_from_investSuccess_popup()# 处理失败弹窗(如金额不足)error_msg = bid_page.get_errorMsg_from_popup()print(f"错误信息: {error_msg}")
5. 总结
- 优点
:
-
代码结构清晰,符合 POM 设计模式。 -
操作与定位分离,易于维护。 -
显式等待和日志记录提升脚本健壮性。
- 适用场景
:Web 自动化测试中的投标页面功能测试。

