標籤:water 一個個 none 移動 driver als import stc cap
頁面物件模型Page Object Modal是一種指令碼設計模型,將頁面元素,業務操作分割,當實際頁面發生變化的時候,只需要修改頁面元素檔案,業務操作不需要修改。
具體實現需要先寫一個頁面公用類,裡面寫公用的方法,比如把元素定位,元素操作等方法重新封裝。之後所有頁面類繼承頁面公用類,頁面類中唯寫該頁面需要定位的元素,並把對應元素的操作封裝成一個個方法。最後測試類別調用這些方法組成一個業務測試案例。
還是以百度搜尋為例子
?
framework包下面放一些公用類
pageobject包下面放需要測試的頁面類
testsuites包下面放對應頁面的測試類別
class BasePage(object): def __init__(self,driver): self.driver = driver def find_element(self,selector): by = selector[0] value = selector[1] element = None if by ==‘id‘ or by ==‘name‘ or by == ‘class‘ or by == ‘tag‘ or by ==‘link‘ or by ==‘plink‘ or by ==‘css‘ or by == ‘xpath‘: if by == ‘id‘: element = self.driver.find_element_by_id(value) elif by == ‘name‘: element = self.driver.find_element_by_name(value) elif by == ‘class‘: element = self.driver.find_element_by_class_name(value) elif by == ‘tag‘: element = self.driver.find_element_by_tag_name(value) elif by == ‘link‘: element = self.driver.find_element_by_link_text(value) elif by == ‘plink‘: element = self.driver.find_element_by_partial_link_text(value) elif by == ‘css‘: element = self.driver.find_element_by_css_selector(value) elif by == ‘xpath‘: element = self.driver.find_element_by_xpath(value) else: print(‘沒有找到元素‘) return element else: print(‘輸入的元素定位方式錯誤‘) def send(self,selector,value): element=self.find_element(selector)#調用封裝的定位元素方法 try: element.send_keys(value) print(‘輸入的內容%s‘ % value) except BaseException: print(‘error‘) def click(self,selector): element = self.find_element(selector) element.click()
這是封裝的公用方法。封裝的元素定位方法需要傳一個數組,數組下標第一個是定位方式,第二個是具體的值。元素定位寫在封裝的元素操作裡面,不寫在後面頁面類裡是因為方便在頁面類裡面重複使用元素。
from framework.base_page import BasePageclass baidu(BasePage): kw = [‘id‘,‘kw‘]#定位搜尋輸入框 su = [‘id‘,‘su‘]#搜尋按鈕 def kw_send(self,value):#搜尋方塊輸入內容 self.send(self.kw,value) def su_click(self):#點擊搜尋按鈕 self.click(self.su)
這是百度搜尋網頁面的頁面類。定位的元素單獨拿出來,這樣就可以重複使用。然後元素的操作也封裝成一個方法。就比如上面這個搜尋方塊輸入內容。value這個值在後面測試類別的時候,可以根據輸入的不同,組裝成不同的測試案例。
from selenium import webdriverfrom pageobject.BaiduPage import baiduimport unittestclass BaiduSerch(unittest.TestCase): def test_baidu(self): dr = webdriver.Firefox() dr.get(‘https://www.baidu.com‘) bai = baidu(dr) bai.kw_send(‘selenium‘) bai.su_click()if __name__ ==‘__main__‘: unittest.main()
最後就是測試類別的,這裡使用了unittest單元測試架構。bai = baidu(dr)每個頁面都需要把driver傳進去。使用WebDriver有一個要注意的就是 指令碼啟動並執行時候要保持只有一個driver。
python3+selenium架構設計01-Page Object