1. 程式人生 > >python+selenium2學習筆記POM設計模式-02project

python+selenium2學習筆記POM設計模式-02project

Project:基礎類BasePage,封裝所有頁面都公用的方法,
定義open函式,重定義find_element,switch_frame,send_keys等函式。
在初始化方法中定義驅動driver,基本url,title
WebDriverWait提供了顯式等待方式。

新建一個BasePage檔案

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class BasePage(object):
    """
       BasePage封裝所有頁面都公用的方法,例如driver, url ,FindElement等
    """
    # 初始化driver、url、pagetitle等
    # 例項化BasePage類時,最先執行的就是__init__方法,該方法的入參,其實就是BasePage類的入參。
    # __init__方法不能有返回值,只能返回None
    # self只例項本身,相較於類Page而言。
    def __init__(self,selenium_driver,base_url,pagetitle):
        self.driver = selenium_driver
        self.base_url = base_url
        self.pagetitle = pagetitle
    # 通過title斷言進入的頁面是否正確。
    # 使用title獲取當前視窗title,檢查輸入的title是否在當前title中,返回比較結果(True 或 False)
    def on_page(self,pagetitle):
        return pagetitle in self.driver.title
    # 開啟頁面,並校驗頁面連結是否載入正確
    # 以單下劃線_開頭或__(雙下劃線)的方法,在使用import *時,該方法不會被匯入,保證該方法為類私有的。
    def _open(self,url,pagetitle):
        self.driver.get(url)
        self.driver.maximize_window()
        # 使用assert進行校驗,開啟的視窗title是否與配置的title一致。呼叫on_page()方法
        assert self.on_page(pagetitle),u'開啟頁面失敗%s'(url)
    #定義open方法 呼叫_open方法開啟連結
    def open(self):
        self._open(self.base_url,self.pagetitle)
        #basepage是類,open是這個類裡的方法,想要呼叫方法,需先建立類的例項,這個過程就是例項化
        #在定義方法的時候,一定要傳遞一個例項方法的引數self,這個self相當於例項本身
        #因為方法是例項的方法,所以如果不把例項當做引數傳遞過來的話,是沒辦法呼叫這個方法的
    #重寫元素定位
    def find_element(self,*loc):
        try:
            # 確保元素是可見的。
            # 注意:以下入參為元組的元素,需要加*。Python存在這種特性,就是將入參放在元組裡。
          # WebDriverWait(self.driver,10).until(lambda driver: driver.find_element(*loc).is_displayed())
            # 注意:以下入參本身是元組,不需要加*
            WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
            return self.driver.find_element(*loc)
        except:
            print(u'%s頁面未能找到%s元素'(self,loc))
    #重寫switch_frame
    def switch_frame(self,loc):
        return self.driver.switch_to_frame(loc)
    #定義script方法,用於執行js
    def script(self,src):
        self.driver.execute_script(src)
    #重寫定義send_keys方法
    def send_keys(self,loc,value,clear_first=True,click_firt=True):
        try:
            loc = getattr(self,'_%s'% loc) #getattr相當於實現self.loc
            if click_firt:
                self.find_element(*loc).click()
            if clear_first:
                self.find_element(*loc).clear()
                self.find_element(*loc).send_keys(value)
        except AttributeError:
            print(u'%s頁面未能找到%s元素'(self, loc))

程式碼中有具體的註釋