您好,登錄后才能下訂單哦!
Selenium是當(dāng)前主流的web自動(dòng)化工具,提供了多種瀏覽器的支持(Chrome,Firefox, IE等等),當(dāng)然大家也可以用自己喜歡的語(yǔ)言(Java,C#,Python等)來寫用例,很容易上手。當(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]/h4') 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)來分析下上邊的代碼:
1. 易讀性:非常難理解。這么多find element?這難道也是test case?
2. 可擴(kuò)展性:都是一個(gè)個(gè)孤立的test case,無擴(kuò)展性可言
3. 可復(fù)用性:無公共方法,很難提到復(fù)用
4. 可維護(hù)性:一旦頁(yè)面元素修改,則需要相應(yīng)修改所有相關(guān)用例,effort大
基于以上的問題,Python為我們提供了Page模式來管理測(cè)試,它大概是這樣子的:(TestCase中的虛線箭頭應(yīng)該是指向各個(gè)page,家里電腦沒裝修改軟件,就不改了:))
關(guān)于Page模式:
1. 抽象出來一個(gè)BasePage基類,它包含一個(gè)指向Selenium.webdriver的屬性
2. 每一個(gè)webpage都繼承自BasePage基類,通過driver來獲取本頁(yè)面的元素,每個(gè)頁(yè)面的操作都抽象為一個(gè)個(gè)方法
3. TestCase繼承自u(píng)nittest.Testcase類,并依賴相應(yīng)的Page類來實(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]/h4') 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, 那么我們回頭來看,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類中的方法即可,無需修改每個(gè)test case
總結(jié):
Page模式給我們提供了一個(gè)很好的頁(yè)面和用例實(shí)現(xiàn)的分離機(jī)制,降低了耦合,提高了內(nèi)聚,可以使我們?cè)趙eb自動(dòng)化中做到游刃有余。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。