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()

  這樣的分層好處是,不同的層關心不同的問題,頁面對象只關心元素的定位問題,測試用例只關心測試數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM