Python實(shí)現(xiàn)Selenium自動(dòng)化Page模式
Selenium是當(dāng)前主流的web自動(dòng)化工具,提供了多種瀏覽器的支持(Chrome,Firefox, IE等等),當(dāng)然大家也可以用自己喜歡的語(yǔ)言(Java,C#,Python等)來(lái)寫用例,很容易上手。當(dāng)大家寫完第一個(gè)自動(dòng)化用例的時(shí)候肯定感覺”哇...好牛x“,但是大家用余光掃了一下代碼后,內(nèi)心也許是崩潰的,因?yàn)樘珌y了!像這樣:
__author__ = 'xua'
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import unittest
class TCRepeatLogin(unittest.TestCase):
def setUp(self):
#webdriver
self.driver = webdriver.Chrome(r'C:\Users\xua\Downloads\chromedriver_win32\chromedriver.exe')
self.driver.implicitly_wait(30)
self.base_url = "http://10.222.30.145:9000/"
def test_(self):
driver = self.driver
driver.get(self.base_url)
#enter username and password
driver.find_element_by_id("username").clear()
driver.find_element_by_id("username").send_keys("sbxadmin")
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("IGTtest1"+Keys.RETURN)
#find dialog and check
dialogTitle = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[1]/h3')
self.assertEqual("Sign in",dialogTitle.text)
#find cancel button and click
cancelBtn = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[3]/button[2]')
cancelBtn.click()
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
從幾點(diǎn)來(lái)分析下上邊的代碼:
1. 易讀性:非常難理解。這么多find element?這難道也是test case?
2. 可擴(kuò)展性:都是一個(gè)個(gè)孤立的test case,無(wú)擴(kuò)展性可言
3. 可復(fù)用性:無(wú)公共方法,很難提到復(fù)用
4. 可維護(hù)性:一旦頁(yè)面元素修改,則需要相應(yīng)修改所有相關(guān)用例,effort大
基于以上的問題,Python為我們提供了Page模式來(lái)管理測(cè)試,它大概是這樣子的:(TestCase中的虛線箭頭應(yīng)該是指向各個(gè)page,家里電腦沒裝修改軟件,就不改了:))

關(guān)于Page模式:
1. 抽象出來(lái)一個(gè)BasePage基類,它包含一個(gè)指向Selenium.webdriver的屬性
2. 每一個(gè)webpage都繼承自BasePage基類,通過driver來(lái)獲取本頁(yè)面的元素,每個(gè)頁(yè)面的操作都抽象為一個(gè)個(gè)方法
3. TestCase繼承自u(píng)nittest.Testcase類,并依賴相應(yīng)的Page類來(lái)實(shí)現(xiàn)相應(yīng)的test case步驟
利用Page模式實(shí)現(xiàn)上邊的用例,代碼如下:
BasePage.py:
__author__ = 'xua'
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
#super class
class BasePage(object):
def __init__(self, driver):
self.driver = driver
class LoginPage(BasePage):
#page element identifier
usename = (By.ID,'username')
password = (By.ID, 'password')
dialogTitle = (By.XPATH,'//html/body/div[7]/div/div/div[1]/h3')
cancelButton = (By.XPATH,'//html/body/div[7]/div/div/div[3]/button[2]')
#Get username textbox and input username
def set_username(self,username):
name = self.driver.find_element(*LoginPage.usename)
name.send_keys(username)
#Get password textbox and input password, then hit return
def set_password(self, password):
pwd = self.driver.find_element(*LoginPage.password)
pwd.send_keys(password + Keys.RETURN)
#Get pop up dialog title
def get_DiaglogTitle(self):
digTitle = self.driver.find_element(*LoginPage.dialogTitle)
return digTitle.text
#Get "cancel" button and then click
def click_cancel(self):
cancelbtn = self.driver.find_element(*LoginPage.cancelButton)
cancelbtn.click()
Test_Login.py:
__author__ = 'xua'
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
import unittest
import time
import BasePage
class Test_Login(unittest.TestCase):
#Setup
def setUp(self):
self.driver = webdriver.Chrome(r'C:\Users\xua\Downloads\chromedriver_win32\chromedriver.exe')
self.driver.implicitly_wait(30)
self.base_url = "http://10.222.30.145:9000/"
#tearDown
def tearDown(self):
self.driver.close()
def test_Login(self):
#Step1: open base site
self.driver.get(self.base_url)
#Step2: Open Login page
login_page = BasePage.LoginPage(self.driver)
#Step3: Enter username
login_page.set_username("sbXadmin")
#Step4: Enter password
login_page.set_password("IGTtest1")
#Checkpoint1: Check popup dialog title
self.assertEqual(login_page.get_DiaglogTitle(),"Sign in")
#Step5: Cancel dialog
login_page.click_cancel()
if __name__ == "__main__":
unittest.main()
Ok, 那么我們回頭來(lái)看,Page模式是否解決了上邊的四個(gè)方面的問題:
1. 易讀性: 現(xiàn)在單看test_login方法,確實(shí)有點(diǎn)test case的樣子了,每一步都很明了
2. 可擴(kuò)展性:由于把每個(gè)page的元素操作都集成到一個(gè)page類中,所以增刪改查都和方便
3. 可復(fù)用性: page的基本操作都變成了一個(gè)個(gè)的方法,在不同的test case中可以重復(fù)使用
4. 可維護(hù)性:如果頁(yè)面修改,只需修改相應(yīng)page類中的方法即可,無(wú)需修改每個(gè)test case
總結(jié):
Page模式給我們提供了一個(gè)很好的頁(yè)面和用例實(shí)現(xiàn)的分離機(jī)制,降低了耦合,提高了內(nèi)聚,可以使我們?cè)趙eb自動(dòng)化中做到游刃有余。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python+Selenium使用Page Object實(shí)現(xiàn)頁(yè)面自動(dòng)化測(cè)試
- python3+PyQt5圖形項(xiàng)的自定義和交互 python3實(shí)現(xiàn)page Designer應(yīng)用程序
- python GUI庫(kù)圖形界面開發(fā)之PyQt5 Qt Designer工具(Qt設(shè)計(jì)師)詳細(xì)使用方法及Designer ui文件轉(zhuǎn)py文件方法
- python飛機(jī)大戰(zhàn)pygame游戲背景設(shè)計(jì)詳解
- Python PO設(shè)計(jì)模式的具體使用
- PageFactory設(shè)計(jì)模式基于python實(shí)現(xiàn)
相關(guān)文章
解決Pytorch 加載訓(xùn)練好的模型 遇到的error問題
今天小編就為大家分享一篇解決Pytorch 加載訓(xùn)練好的模型 遇到的error問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-01-01
基于Python實(shí)現(xiàn)圖片九宮格切圖程序
這篇文章主要為大家詳細(xì)介紹了如何利用python和C++代碼實(shí)現(xiàn)圖片九宮格切圖程序,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-04-04
python 求10個(gè)數(shù)的平均數(shù)實(shí)例
今天小編就為大家分享一篇python 求10個(gè)數(shù)的平均數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-12-12
Python中不同數(shù)據(jù)對(duì)象的空值校驗(yàn)的方法小結(jié)
Python中有多種數(shù)據(jù)對(duì)象,每種都有其特定的空值表示方法和校驗(yàn)方式,本文將深入探討這些空值校驗(yàn)的方法,有需要的小伙伴可以參考一下2024-04-04
Python Paramiko創(chuàng)建文件目錄并上傳文件詳解
Paramiko是一個(gè)用于進(jìn)行SSH2會(huì)話的Python庫(kù),它支持加密、認(rèn)證和文件傳輸?shù)裙δ?本文旨在詳細(xì)指導(dǎo)新手朋友如何使用Python的Paramiko庫(kù)來(lái)創(chuàng)建遠(yuǎn)程文件目錄并上傳文件,希望對(duì)大家有所幫助2024-10-10

