一、前言
最近問我自動化的人確實有點多,個人突發奇想:想從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
原創不易,歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。