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个小时过去了~

坑太多了,走过最长的路就是:失败是成功之母这条套路,成功兄,你真的有太多的 母……母……母……母……母……了

 
posted on 2018-05-20 11:35  jxba  阅读(186)  评论(0编辑  收藏  举报