selenium+Python(Page Object 设计模式实例)
以下实例演示了采用了page Object设计模式的方式登录qq空间:
1、创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(timeout)等
2、创建LoginPage类:Page类中定义的方法是页面操作的基本方法,后面根据登录页面特点创建LoaginPage类并继承Page,这就是page Object设计模式中的对象层
3、创建test_user_login()函数:创建test_user_login()函数将单个元素操作组成一个完整动作,这个动作包含打开浏览器、输入账号密码、登录等操作
4、创建main()函数:main()函数更接近用户操作行为,用户操作只需要关系是那个浏览器打开打开网址,登录的用户名和密码是什么,不会关系是如何去定位输入框的
代码:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep class Page(object): """基础类,用于所以页面对象类继承""" login_url = 'https://i.qq.com' def __init__(self, selenium_driver, base_url=login_url): self.base_url = base_url self.driver = selenium_driver self.timeout = 30 def on_page(self): return self.driver.current_url == (self.base_url + self.url) def _open(self,url): url = self.base_url+url self.driver.get(url) assert self.on_page(),'did not land on %s' % url def open(self): self._open(self.url) def find_element(self, *loc): return self.driver.find_element(*loc) class LoginPage(Page): """登录页面模型""" url = '/' # 定位器 username_loc = (By.ID, 'u') password_loc = (By.ID, 'p') submit_loc = (By.ID, 'login_button') def type_username(self, username): 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_submit(self): self.find_element(*self.submit_loc).click() def test_user_login(driver, username, password): """测试获取的用户名、密码是否可以登录成功""" login_page = LoginPage(driver) login_page.open() driver.maximize_window() driver.switch_to_frame('login_frame') driver.find_element_by_id("switcher_plogin").click() login_page.type_username(username) login_page.type_password(password) login_page.type_submit() def main(): try: driver = webdriver.Firefox() username = 'qq号' #调试的时候需要换成对应的QQ号 password = 'qq密码' #需要换成对应的密码 test_user_login(driver, username, password) sleep(3) # 断言的方式判断登录是否成功 try: assert '对应空间的title' in driver.title #调试时候title要换 print ('successful') except Exception as e : print ('failed') finally: driver.close() if __name__ == '__main__': main()
这样的分层好处是,不同的层关心不同的问题,页面对象只关心元素的定位问题,测试用例只关心测试数据