Page Object 模式, 创建一个对象来对应页面的一个应用. 故我们可以为每个页面定义一个类, 并为每个页面的属性和操作构建模型. 体现在对界面交互细节的封装, 测试在更上层使用页面对象, 在底层的属性或者操作的更改不会中断测试. 减少代码重复, 提高测试代码的可读性和可维护性.
下面将以登录 qq 邮箱为例, 通过 Page Object 设计模式来实现. 代码如下:
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from time import sleep
- # 创建基础类
- class BasePage(object):
- #初始化
- def __init__(self, driver):
- self.base_url = 'https://mail.qq.com/'
- self.driver = driver
- self.timeout = 30
- #打开页面
- def _open(self):
- url = self.base_url
- self.driver.get(url)
- self.driver.switch_to.frame('login_frame') #切换到登录窗口的 iframe
- def open(self):
- self._open()
- #定位方法封装
- def find_element(self,*loc):
- return self.driver.find_element(*loc)
- # 创建 LoginPage 类
- class LoginPage(BasePage):
- username_loc = (By.ID, "u")
- password_loc = (By.ID, "p")
- login_loc = (By.ID, "login_button")
- #输入用户名
- def type_username(self,username):
- self.find_element(*self.username_loc).clear()
- self.find_element(*self.username_loc).send_keys(username)
- #输入密码
- def type_password(self,password):
- self.find_element(*self.password_loc).send_keys(password)
- #点击登录
- def type_login(self):
- self.find_element(*self.login_loc).click()
- # 创建 test_user_login() 函数
- def test_user_login(driver, username, password):
- """测试用户名 / 密码是否可以登录"""
- login_page = LoginPage(driver)
- login_page.open()
- login_page.type_username(username)
- login_page.type_password(password)
- login_page.type_login()
- # 创建 main() 函数
- def main():
- driver = webdriver.Edge()
- username = '3494xxxxx' #qq 号码
- password = 'kemixxxx' #qq 密码
- test_user_login(driver, username, password)
- sleep(3)
- driver.quit()
- if __name__ == '__main__':
- main()
虽然该实现方法看上去复杂多了, 但其中的设计好处是不同层关心不同的问题. 页面对象只关心元素的定位, 测试用例只关心测试数据.
来源: https://www.cnblogs.com/cnkemi/p/8969977.html