【Selenium07篇】python+selenium實現Web自動化:PO模型,PageObject模式!

一、前言

最近問我自動化的人確實有點多,個人突發奇想:想從0開始講解python+selenium實現Web自動化測試,請關注博客持續更新!

這是python+selenium實現Web自動化第七篇博文

二、Selenium成套博文地址,總有你需要的:

【Selenium篇01】python+selenium實現Web自動化:搭建環境,Selenium原理,定位元素以及瀏覽器常規操作!

https://blog.csdn.net/pengjiangchun/article/details/105532670

【Selenium02篇】python+selenium實現Web自動化:鼠標操作和鍵盤操作!

https://blog.csdn.net/pengjiangchun/article/details/105532867

【Selenium03篇】python+selenium實現Web自動化:元素三類等待,多窗口切換,警告框處理,下拉框選擇

https://blog.csdn.net/pengjiangchun/article/details/105533107

【Selenium04篇】python+selenium實現Web自動化:文件上傳,Cookie操作,調用 JavaScript,窗口截圖

https://blog.csdn.net/pengjiangchun/article/details/105534081

【Selenium05篇】python+selenium實現Web自動化:讀取ini配置文件,元素封裝,代碼封裝,異常處理,兼容多瀏覽器執行

https://blog.csdn.net/pengjiangchun/article/details/105573687

【Selenium06篇】python+selenium實現Web自動化:日誌處理

https://blog.csdn.net/pengjiangchun/article/details/105574193

【Selenium07篇】python+selenium實現Web自動化:PO模型,PageObject模式!

https://blog.csdn.net/pengjiangchun/article/details/105574676

【Selenium08篇】python+selenium實現Web自動化:數據驅動框架,ddt,關鍵字驅動框架

https://blog.csdn.net/pengjiangchun/article/details/105574954

 

三、Selenium之-PO模型

PO 模型:將測試的每個頁面看作一個對象,將這些對象抽象成類,完成頁面元素和業務操作;將測試類和 page 類區分開來,需要調用什麼類去取即可,降低耦合。當頁面元素髮生變化時,只需修改對應頁面類部分,其他部分極可能做到最小修改。

PO 模型的分層結構(以註冊頁面作爲page對象):

(1)register_page(頁面元素查找類) --->
(2)register_handle(操作層:將查找到的元素上傳遞數據) --->
(3)register_business(業務層:調用操作層,根據操作層傳遞的數據進行測試業務場景判斷,如驗證碼輸入錯誤場景等) 
(4)register_cases(測試模塊:封裝業務層,進行測試用例業務組裝)。

1. 元素查找

此頁面主要是查找註冊頁面中正常的元素和異常的元素(錯誤的提示信息)。

register_email_error = id>register_email-error
register_nickname_error = id>register_nickname-error
register_password_error = id>register_password-error
captcha_code_error = id>captcha_code-error

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

from basic.find_element import FindElement
from selenium import webdriver

class RegisterPage(object):
    # 初始化元素查找類,執行該類的時候就會加載
    def __init__(self, driver):
        self.fe = FindElement(driver)

    # 註冊郵箱
    def get_register_email(self):
        return self.fe.get_element('register_email')

    # 用戶暱稱
    def get_register_nickname(self):
        return self.fe.get_element('register_nickname')

    # 密碼
    def get_register_password(self):
        return self.fe.get_element('register_password')

    # 驗證碼輸入框
    def get_getcode_num(self):
        return self.fe.get_element('getcode_num')

    # 驗證碼圖片
    def get_captcha_code(self):
        return self.fe.get_element('captcha_code')

    # 註冊郵箱框文本提示語
    def get_register_email_placeholder(self):
        print(self.fe.get_element('register_email').get_attribute('placeholder'))
        return self.fe.get_element('register_email').get_attribute('placeholder')

    # 用戶暱稱框文本提示語
    def get_register_nickname_placeholder(self):
        print(self.fe.get_element('register_nickname').get_attribute('placeholder'))
        return self.fe.get_element('register_nickname').get_attribute('placeholder')

    # 密碼框文本提示語
    def get_register_password_placeholder(self):
        print(self.fe.get_element('register_password').get_attribute('placeholder'))
        return self.fe.get_element('register_password').get_attribute('placeholder')

    # 驗證碼框文本提示語
    def get_captcha_code_placeholder(self):
        print(self.fe.get_element('captcha_code').get_attribute('placeholder'))
        return self.fe.get_element('captcha_code').get_attribute('placeholder')

   # 不合法註冊郵箱錯誤提示語
    def get_register_email_error(self):
        return self.fe.get_element('register_email_error')

    # 不合法註冊用戶錯誤提示語
    def get_register_nickname_error(self):
        return self.fe.get_element('register_nickname_error')

    # 不合法密碼錯誤提示語
    def get_register_password_error(self):
        return self.fe.get_element('register_password_error')

    # 不合法驗證碼錯誤提示語
    def get_captcha_code_error(self):
        return self.fe.get_element('captcha_code_error')


if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rp = RegisterPage(driver)
    rp.get_register_email_placeholder()
    rp.get_register_nickname_placeholder()
    rp.get_register_password_placeholder()
    rp.get_captcha_code_placeholder()
    driver.close()

2.操作層

上一層我們獲取到註冊頁面中主要元素信息,接下來就該給這些元素進行數據上的操作處理(賦值)。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

from page_object_model.regitser_page import RegisterPage
from selenium import webdriver
from time import sleep

class RegisterHandle(object):
    def __init__(self, driver):
        self.rp = RegisterPage(driver)

    # 輸入註冊郵箱
    def send_register_email(self, email):
        self.rp.get_register_email().send_keys(email)

    # 輸入用戶暱稱
    def send_register_nickname(self, nickname):
        self.rp.get_register_nickname().send_keys(nickname)

    # 輸入註冊密碼
    def send_register_password(self, password):
        self.rp.get_register_password().send_keys(password)

    # 輸入驗證碼
    def send_register_captcha(self, captcha):
        self.rp.get_getcode_num().send_keys(captcha)

    # 獲取錯誤信息
    def get_user_text(self, error_info, error_value):
        text = None
        if error_info == "register_email_error":
            text = self.rp.get_register_email_error().send_keys(error_value)
        elif error_info == 'register_nickname_error':
            text = self.rp.get_register_nickname_error().send_keys(error_value)
        elif error_info == 'register_password_error':
            text = self.rp.register_password_error().send_keys(error_value)
        elif error_info == 'captcha_code_error':
            text = self.rp.captcha_code_error().send_keys(error_value)
        else:
            print("error element not found")
        return text

    # 點擊註冊按鈕
    def click_register_btn(self):
        self.rp.get_register_btn().send_keys()


if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rh = RegisterHandle(driver)
    rh.send_register_email('[email protected]')
    rh.send_register_nickname('MiFan')
    rh.send_register_password('123@123abc')
    rh.send_register_captcha('qwer')
    rh.click_register_btn()
    sleep(5)
    driver.close()

3.業務層

業務層,也就是我們要做些什麼,做事的邏輯是什麼?對於自動化測試來說,就是自動化的測試場景,也就是我們的測試點邏輯。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

from page_object_model.register_handle import RegisterHandle
from selenium import webdriver
from time import sleep


class RegisterBusiness(object):
    def __init__(self, driver):
        self.rh = RegisterHandle(driver)

    # 正常註冊
    def common_register(self, register_email, nickname, password, captcha):
        self.rh.send_register_email(register_email)
        self.rh.send_register_nickname(nickname)
        self.rh.send_register_password(password)
        self.rh.send_register_captcha(captcha)

    # 判斷是否註冊成功
    def success_or_fail(self):
        if self.rh.get_register_btn_text() is None:
            return True
        else:
            return False

    # 郵箱錯誤
    def register_email_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('register_email_error', "請輸入有效的電子郵件地址") is None:
            print("註冊郵箱輸入錯誤")
            return True
        else:
            return False

    # 用戶暱稱錯誤
    def register_nickname_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('register_nickname_error', "字符長度必須大於等於4,一箇中文字算2個字符") is None:
            print("用戶暱稱錯誤")
            return True
        else:
            return False

    # 用戶密碼錯誤
    def register_password_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('register_password_error', "最少需要輸入 5 個字符") is None:
            print("用戶密碼錯誤")
            return True
        else:
            return False

    # 驗證碼錯誤
    def captcha_code_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('captcha_code_error', "驗證碼錯誤") is None:
            print("驗證碼錯誤")
            return True
        else:
            return False


if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rb = RegisterBusiness(driver)
    rb.captcha_code_error('[email protected]', 'pass123', 'test@123', 'sds')

    sleep(3)
    driver.close()

4.測試層

經過一些列分層計劃,雖然在每一層我們都在進行測試,但是我們最終還是要回歸到本質進行測試,將各層模塊一同調用起來。基於業務層編寫測試用例。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公衆號:軟測之家  更多技術乾貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術羣:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

from page_object_model.register_business import RegisterBusiness
from selenium import webdriver
import unittest

class RegisterTestcase(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.register_url = 'http://www.5itest.cn/register'
        cls.driver = webdriver.Chrome('../tools/chromedriver.exe')
        cls.driver.get(cls.register_url)
        cls.driver.maximize_window()
        cls.rb = RegisterBusiness(cls.driver)

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.close()

    # 註冊郵箱錯誤,但用例執行成功
    def test_register_email_error(self):
        register_email_error = self.rb.register_email_error('23', 'test01', 'test01abc', 'abc4')
        if register_email_error is True:
            print("賬號註冊失敗,該用例執行成功")
        else:
            print("賬號註冊成功,該用例執行失敗")

    # 驗證碼錯誤,但用例執行成功‘
    def test_captcha_code_error(self):
        captcha_code_error = self.rb.captcha_code_error('[email protected]', 'test02', 'test02abc', 'height')
        if captcha_code_error is True:
            print("賬號註冊失敗,該用例執行成功")
        else:
            print("賬號註冊成功,該用例執行失敗")


if __name__ == "__main__":
    unittest.main()

四、持續更新中請關注

如果你覺得此文對你有幫助,如果你對軟件測試、接口測試、自動化測試、面試經驗交流感興趣歡迎加入:

軟件試技術羣:695458161,羣裏發放的免費資料都是筆者十多年測試生涯的精華。還有同行大神一起交流技術哦。

作者:諸葛
出處:https://blog.csdn.net/pengjiangchun
原創不易,歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章