1. 程式人生 > 其它 >selenium-web自動化(po模型)

selenium-web自動化(po模型)

什麼是po模型呢?簡單理解就是:把每個頁面當成一個物件,給這些頁面當成一個類,主要就是完成元素定位和業務操作;把它和測試指令碼區分開來,需要什麼取這些頁面類去呼叫即可。這樣的好處在於頁面元素髮生變化時,只需要去維護頁面類即可,其他部分就不用管。


PO:指測試頁面和測試指令碼分離,即頁面封裝成類,供測試指令碼進行呼叫

專案架構如下:

base基類(所有頁面公共方法的二次封裝)

'''
所有頁面公共方法的二次封裝
在指令碼中加入太多的sleep後會影響指令碼的執行速度
driver:返回瀏覽器的一個例項
timeout:超時的總時長
poll_frequency:迴圈去查詢的間隙時間,預設0.5s

'''
from selenium.webdriver.support.wait import WebDriverWait


class BaseAction():
    '''
    基類
    '''
    def __init__(self,driver):
        self.driver = driver

    def find_element(self,feature,timeout=10,poll=2):
        '''方法內部去呼叫系統的定位元素'''
        return WebDriverWait(self.driver, timeout, poll).until(lambda x: x.find_element(*feature))

    def send_keyword(self,feature,text,timeout=10,poll=2):
        '''輸入內容'''
        self.find_element(feature,timeout,poll).send_keys(text)

    def get_text(self,feature,timeout=10,poll=2):
        '''獲取元素的文字內容'''
        return self.find_element(feature,timeout,poll).text

    def click_element(self,feature,timeout=10,poll=2):
        '''點選元素'''
        self.find_element(feature,timeout,poll).click()

    def clear_element(self,feature,timeout=10,poll=2):
        '''清空元素'''
        self.find_element(feature,timeout,poll).clear()

    def get_element(self,feature,timeout,poll):
        '''返回定位到的元素'''
        return self.find_element(feature,timeout,poll)

頁面元素查詢類 page

'''
By是selenium中內建的一個class,在這個class中有各種方法來定位元素

'''
from selenium.webdriver.common.by import By
from base.base_action import BaseAction

class AssignworkPage(BaseAction):
    #一個def是一個動作我們在case中呼叫這個方法即可對頁面進行操作

    #點選作業中心
    center_work = By.LINK_TEXT,'作業中心'
    #點選佈置作業
    bz_work = By.XPATH,'//*[@id="app"]/main/div/div[2]/div[1]/div[1]/div/button[1]'
    def click_centerwork(self):
        self.click_element(self.center_work)

    def work_bz(self):
        self.click_element(self.bz_work)

測試case類

import unittest,json
from time import sleep
from selenium import webdriver
from page.assign_homeorkpage import AssignworkPage
from selenium.webdriver.common.action_chains import ActionChains

class Work_Build(unittest.TestCase):
    def setUp(self):
        str = ''
        with open('../common/bk.json', 'r', encoding='utf-8') as f:
            listCookies = json.loads(f.read())
        cookie = [item["name"] + "=" + item["value"] for item in listCookies]
        cookiestr = '; '.join(item for item in cookie)
        # print(listCookies)
        self.driver = webdriver.Chrome('../common/chromedriver.exe')
        self.driver.get('url')
        # driver.get('https://hte.hexfuture.net/#/inCourse/hte/')
        for cookie in listCookies:
            if 'expiry' in cookie:
                del cookie['expiry']
            self.driver.add_cookie(cookie)
        self.driver.get('url')

        self.assign_Homeworkpage = AssignworkPage(self.driver)


    def tearDown(self):
        sleep(3)
        self.driver.quit()


    def test_successbuildwork(self):
        '''佈置作業主流程'''
        #點選作業中心
        self.assign_Homeworkpage.click_centerwork()



       
        # assert self.indexPage.get_start_go_to_class_text() == "開始上課"

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


base資料夾下存放著最基礎的頁面元素方法,例如get_element,send_keys,clear,click等頁面操作事件
page資料夾則存放著在我們需要操作頁面的操作的xpath事件,一個def是一個事件。例如點選作業中心
scripts下則只存放測試用例