當前位置:編程學習大全網 - 源碼下載 - Selenium源代碼

Selenium源代碼

背景

在UI自動化的過程中,妳不可避免的會遇到加載問題,環境不穩定,網速慢。如果什麽都不做,會因為找不到元素而報錯。

還有壹種情況是頁面使用了ajax異步加載機制(現在是resetful,客戶端和服務器是分離的),不知道頁面什麽時候到的。這個時候我們會使用wait,在Selenium中,我們有三種等待,分別是固定等待、隱式等待和顯式等待。

時間.睡眠

固定等待,本質:讓當前線程休眠,本質是線程阻塞,通過等待來實現。

缺點:網絡條件好浪費時間,嚴重影響項目的性能。

好處:可以使用調試腳本。

隱式等待

隱式等待,本質上是:在腳本開始時設置壹個最大等待時間。如果網頁是在指定時間內加載的,則執行下壹步,否則可能會拋出異常。隱式等待是對整個驅動周期起作用的,剛開始的時候設置壹次就可以了,不要把它當成固定等待。

缺點:JavaScript通常加載在我們身體的末端。事實上,頁面的所有元素都已經加載了,但是我們仍然在等待所有頁面的加載。

WebDriverWait

顯式等待,本質:動態等待,判斷壹個元素是否已經出現,比如標題是叫百度還是百度搜索,根據壹些動態條件進行輪詢,它會不斷輪詢檢測條件是成功還是失敗,比如0.5s檢測壹次元素是成功還是失敗,同時設置輪詢的超時。

如果同時設置了顯式等待和隱式等待,就看誰設置的等待時間長,誰的超時等待時間長,誰就執行。

顯式等待

組件

從selenium . web driver . support . wait導入WebDriverWait

WebDriverWait的源代碼

#許可給軟件自由保護協會(SFC)

#或多個貢獻者許可協議。參見通知文件

#隨本書壹起分發,以獲取更多信息

#關於版權歸屬。SFC許可該文件

#根據Apache許可證2.0版(即

#“許可證”);除非符合規定,否則不得使用本文件

#帶著執照。您可以從以下網址獲得許可證的副本

#

# mon.exceptions導入NoSuchElementException

從selenium.common.exceptions導入超時異常

POLL_FREQUENCY = 0.5 #方法調用之間的睡眠時間

IGNORED _ EXCEPTIONS =(NoSuchElementException,)#調用方法時忽略的異常

類WebDriverWait(對象):

def __init__(自身,驅動程序,超時,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None):

" " "構造函數,采用WebDriver實例,超時以秒為單位。

:參數:

-驅動程序WebDriver的實例(即Firefox、Chrome或Remote)

- timeout -超時前的秒數

- poll_frequency -呼叫之間的睡眠間隔

默認情況下,它是0.5秒。

- ignored_exceptions -調用期間忽略的異常類的iterable結構。

默認情況下,它只包含NoSuchElementException。

示例:

從selenium.webdriver.support.ui導入WebDriverWait

element = WebDriverWait(驅動程序,10)。until(lambda x:x . find _ element _ by _ id(" someId "))

is _ impressed = web driver wait(driver,30,1,(ElementNotVisibleException))。

until _ not(lambda x:x . find _ element _ by _ id(" someId ")。is_displayed())

"""

自我。_driver =驅動程序

自我。_timeout =超時

自我。_ poll = poll _頻率

#避開零點

如果自我。_poll == 0:

自我。_ poll = POLL _頻率

異常=列表(IGNORED_EXCEPTIONS)

如果ignored_exceptions不為None:

嘗試:

exceptions . extend(ITER(ignored _ exceptions))

例外類型錯誤:# ignored_exceptions不可叠代

exceptions.append(忽略_異常)

自我。_ignored_exceptions = tuple(異常)

def __repr__(self):

返回“”。格式(

型(自我),自我。_driver.session_id)

def until(self,method,message= ' '):

" " "調用驅動程序提供的方法作為參數,直到

返回值不為假。"""

屏幕=無

stacktrace =無

end_time = time.time() + self。_超時

雖然正確:

嘗試:

價值=方法(自我。_驅動程序)

如果值:

返回值

除了自我。_ ignored _形式的異常:

screen = getattr(exc,' screen ',None)

stacktrace = getattr(exc,' stacktrace ',None)

time.sleep(自我。_poll)

if time . time()& gt;結束時間:

破裂

引發超時異常(消息、屏幕、堆棧跟蹤)

def until_not(self,method,message= ' '):

" " "調用驅動程序提供的方法作為參數,直到

返回值為假。"""

end_time = time.time() + self。_超時

雖然正確:

嘗試:

價值=方法(自我。_驅動程序)

如果不是值:

返回值

除了自我。_忽略_異常:

返回True

time.sleep(自我。_poll)

if time . time()& gt;結束時間:

破裂

引發超時異常(消息)

參數:

三種等待模式的示例

從selenium導入web驅動程序

從時間進入睡眠

從selenium . web driver . support . wait導入WebDriverWait

從selenium.webdriver.support導入預期條件作為EC

#三種等待方法

類測試用例(對象):

def __init__(self):

self.driver = webdriver。鉻合金()

self.driver.get(' ')

睡眠(2)

def test_sleep(自我):

self . driver . find _ element _ by _ id(' kw ')。send_keys("selenium ")

sleep(2) #線程在阻塞等待模式下的實現

self . driver . find _ element _ by _ id(' su ')。單擊()

睡眠(3)

self.driver.quit()

def time_implicitly(自身):

self . driver . implicitly _ wait(10)

self . driver . find _ element _ by _ id(' kw ')。send_keys("webdriver ")

self . driver . find _ element _ by _ id(' su ')。單擊()

#睡眠(2)

self.driver.quit()

定義時間_等待(自身):

wait = WebDriverWait(self.driver,2,0.5)

Wait.until(EC.title_is('百度壹下,妳就知道'))

self . driver . find _ element _ by _ id(' kw ')。send_keys("webdriver ")

self . driver . find _ element _ by _ id(' su ')。單擊()

睡眠(2)

self.driver.quit()

if __name__=="__main__ ":

案例=測試案例()

#案例.測試_睡眠()

# case.time_implicitly()

case.time_wait()

  • 上一篇:專家咨詢源代碼
  • 下一篇:微信跑腿公司如何運作
  • copyright 2024編程學習大全網