1 Page object
Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,主要体现在对界面交互细节的封装,在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性。
简单来说就是:PageObject是一种程序设计模式,将面向过程转变为面向对象(页面对象),将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。可以使代码复用,降低维护成本,提高程序可读性和编写效率。
PageObject可以将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),提高用例的可维护性。
Page 队形应当将在GUI空间上所有查询和操作数据的行为封装为方法,一个好的经验法则是:即使改变具体的空间,page对象的接口也不应当发生变化。将页面中有重要意义的元素独立为一个page对象,通过给页面建模,使其对应用程序的使用者变得有意义。
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep from selenium.webdriver.support import expected_conditions as EC class Page(object): '''基础类,用于页面对象类的继承''' login_url = 'https://mail.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 switch_frame(self,loc): #1定义切换函数 return self.driver.switch_to_frame(loc) def find_element(self,*loc): return self.driver.find_element(*loc) class loginPage(Page): '''qq邮箱登录页面模型''' url = '/' #定位器 loginframe_loc ='login_frame' #2应切换的目录,因为切换函数仅仅需要变量,所以loginframe_loc的赋值同username_loc不一样,后续的调用也不需* username_loc = (By.ID, 'u') password_loc = (By.ID, 'p') submit_loc = (By.ID, 'login_button') #操作 def switch_to_loginframe(self): #3定义窗口切换函数:调用切换函数,并关联上切换目录 self.switch_frame(self.loginframe_loc) 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 submit(self): self.find_element(*self.submit_loc).click() def qqmail_login(driver,username,passowrd): login_page = loginPage(driver) login_page.open() login_page.switch_to_loginframe() #4调用窗口切换函数: #login_page.driver.switch_to.frame('login_frame') 1~4:可以直接使用该语句: login_page.type_username(username) login_page.type_password(passowrd) login_page.submit() def main(): try: driver = webdriver.Chrome() username = '492000' password = '567899' qqmail_login(driver, username, password) sleep(3) user = driver.find_element(By.ID,'useralias').text assert (user == '登录后的名称), '邮箱登录失败了!——邮箱名错误' finally: print('测试完毕') driver.close() if __name__ == '__main__': main()
注:为了切换窗口函数的调用的调用,真的是,N个小时过去了~
坑太多了,走过最长的路就是:失败是成功之母这条套路,成功兄,你真的有太多的 母……母……母……母……母……了