Selenium自動化Page模式(Python)

Selenium是當前主流的web自動化工具,提供了多種瀏覽器的支持(Chrome,Firefox, IE等等),固然你們也能夠用本身喜歡的語言(Java,C#,Python等)來寫用例,很容易上手。當你們寫完第一個自動化用例的時候確定感受」哇...好牛x「,可是你們用餘光掃了一下代碼後,心裏也許是崩潰的,由於太亂了!像這樣:html

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

從幾點來分析下上邊的代碼:web

1. 易讀性:很是難理解。這麼多find element?這難道也是test case?chrome

2. 可擴展性:都是一個個孤立的test case,無擴展性可言瀏覽器

3. 可複用性:無公共方法,很難提到複用ide

4. 可維護性:一旦頁面元素修改,則須要相應修改全部相關用例,effort大工具

基於以上的問題,Python爲咱們提供了Page模式來管理測試,它大概是這樣子的:(TestCase中的虛線箭頭應該是指向各個page,家裏電腦沒裝修改軟件,就不改了:))測試

 

關於Page模式:url

1. 抽象出來一個BasePage基類,它包含一個指向Selenium.webdriver的屬性spa

2. 每個webpage都繼承自BasePage基類,經過driver來獲取本頁面的元素,每一個頁面的操做都抽象爲一個個方法code

3. TestCase繼承自unittest.Testcase類,並依賴相應的Page類來實現相應的test case步驟

 

利用Page模式實現上邊的用例,代碼以下:

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, 那麼咱們回頭來看,Page模式是否解決了上邊的四個方面的問題:

1. 易讀性: 如今單看test_login方法,確實有點test case的樣子了,每一步都很明瞭

2. 可擴展性:因爲把每一個page的元素操做都集成到一個page類中,因此增刪改查都和方便

3. 可複用性: page的基本操做都變成了一個個的方法,在不一樣的test case中能夠重複使用

4. 可維護性:若是頁面修改,只需修改相應page類中的方法便可,無需修改每一個test case

 

總結:

Page模式給咱們提供了一個很好的頁面和用例實現的分離機制,下降了耦合,提升了內聚,可使咱們在web自動化中作到遊刃有餘。

相關文章
相關標籤/搜索