显示等待WebDriverWait常用写法解析
在網(wǎng)絡(luò)上各種selenium自動化測試框架搭建的過程中,對于selenium顯示等待有好幾種寫法,包含但不限于以下幾種:
寫法1:
+++
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
self.driver = webdriver.Chrome()
WebDriverWait(self.driver).until(lambda x:x.find_element(*loc))
+++
寫法2:
+++
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
self.driver = webdriver.Chrome()
WebDriverWait(self.driver).until(EC.presence_of_element_located(loc))
+++
寫法3:
+++
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
self.driver = webdriver.Chrome()
EC.presence_of_element_located(loc)(self.driver)
+++
新手看著可能有些暈乎乎的,我曾經(jīng)也是看著也挺暈的。接下來我就要來說說這幾種寫法是怎么運行的。
寫法1
先來簡單看看寫法,在WebDriverWait初始化時傳入了driver參數(shù),然后調(diào)用until方法,傳入了一個lambda匿名函數(shù)
WebDriverWait(self.driver).until(lambda x:x.find_element(loc))
為了看清運行原委我們得去看看源碼(如果你創(chuàng)建了虛擬環(huán)境的話,路徑會如下所示):
venvLibsite-packagesseleniumwebdriversupportwait.py
可以看到driver參數(shù)傳進來之后被賦值給了WebDriverWait類變量_driver,那么他在哪里使用了呢,我們接著往下看:
在WebDriverWait類的until函數(shù)中使用了。
先看一下until的函數(shù)注釋(翻譯):調(diào)用驅(qū)動程序提供的方法作為參數(shù),直到返回值不是False。
結(jié)合上文,我們傳入的method是lambda x:x.find_element(*loc)是一個匿名函數(shù)。
結(jié)合官方文檔的說明,f(0)可以實現(xiàn)給lambda傳入?yún)?shù)。lambda可以引用所在域的變量,x引用的域變量就是WebDriverWait的self._driver類變量 ,lambda x:x.find_element(loc)表達式就被替換成為了self.driver.find_element就可以正常的使用driver使用一樣
? 寫法1的運行大致就是這樣了。
寫法2
寫法2我們必須關(guān)聯(lián)以下expected_conditions模塊才能看清楚
venvLibsite-packagesseleniumwebdriversupportexpected_conditions.py
可以看到EC中的都是類,函數(shù)只有兩個,后面介紹
第二種寫法里面我們先看until里面的部分,locator的參數(shù)就是我們傳入的loc,loc是什么呢,就是(By.ID,'#su')這種。
然后下面實現(xiàn)了一個__call__方法,里面?zhèn)魅氲膮?shù)就是driver,這個方法是什么意思呢,請看下面的小提示。
小提示:重載運算符(魔法方法),python中的可調(diào)用對象包括
自定義的函數(shù)、python內(nèi)置函數(shù),類的實例化對象,method() =method.__call__()函數(shù)。
這個方法還是通過method(self._driver)方式傳入了driver的實例對象。
然后第64行把這兩個參數(shù)傳給了_find_element方法,EC模塊中的兩個函數(shù)這個就是其中之一:
這個函數(shù)返回了什么呢,第411行,返回了driver.find_element()方法,通過__call__方法返回了self.driver.find_element。
由此我們可以推斷出寫法1和寫法2是完全一樣的,包括解包的時機。
寫法3
讀完了寫法1和寫法2,寫法3會顯得更簡單
presence_of_element_located(傳入的參數(shù))(傳入的driver),在前面小提示已經(jīng)說過,第二個括號中的正是通過__call__方法來實現(xiàn)的重載運算()調(diào)用。
然后兩個參數(shù)傳入進去后,presence_of_element_located函數(shù)返回driver.find_element。
和寫法1和寫法2不同的是外層沒有包含顯示等待的類。所以寫法3不支持顯示等待,只是返回了一個普通的driver方法或基于driver方法實現(xiàn)的結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的显示等待WebDriverWait常用写法解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Resource接口,及资源
- 下一篇: R语言系列—区间估计