關於PYTHON+SELENIUM中顯示等待WEBDRIVERWAIT的用法


轉載:https://www.cnblogs.com/Test-Log/p/11970140.html

關於PYTHON+SELENIUM中顯示等待WEBDRIVERWAIT的用法

最近學習selenium自動化, 由於代碼執行速度過快,導致元素還沒被加載出來,代碼就去定位,導致報錯,由於我一直使用的
是time.sleep強制等待,雖然不好用,但勝在簡單嘛, 但是有時設置的睡眠時間過長,大家懂的,干等是很浪費效率的,所以
打算學習一些顯式等待,但是在網上看了很多博主的文章,關於顯示等待的until(method)到底傳入什么參數,我至今不解。
所以記錄下來,以供有需要的人觀看。

首先先說明一下 具體使用的參數 :

WebDriverWait(driver,timeout=程序等待時間,poll_frequency=每隔幾秒執行until中的方法).until(method='具體來做什么事情')

第一個driver是固定的參數,就是 webdriver.Chrome()的實例化對象,其他參數我在上面都有寫,在這里就不描述了。

下面我們來說until中具體需要放什么東西,一開始我的設想是直接放入driver.find_element_by_xpath去定位,后來發現是不行的,然后又定義了一個函數,將driver.find_element_by_xpath放在函數中去執行,也不行,在網上借鑒了各路大神的文章。說要使用expected_conditions as EC這個東西,然后我又去借鑒EC是個什么,發現EC下面的方法可以判斷當前頁面是否有你所需要的元素,然后EC.text_to_be_present_in_element()里面又需要傳一個什么By之類的參數,我又得去查,發現By其實也是一種定位方式,只怪我知識淺薄,之前還不知道,反正看來看去,浪費了大量的時間,覺得有點不值得,去特么的EC,BY :

 

其實在until中最簡單的方式就是傳入 匿名函數,until( lambda x:x.find_element_by_xpath() ) ,x后面接定位策略,並不一定是xpath,都可以使用, 只要傳入匿名函數,until就可以直接去執行這個函數,但是我之前也是使用了def 函數 為什么不行呢 :

 

  我查看了until中的源代碼,其實使用def定義函數也是可以使用的,那么到底應該如何去使用呢 :

 

  首先你定義函數的時候需要設置不定長默認參數 *args。因為在源碼中,會將driver對象傳入到我們的函數中,其次需要將定位策略return 出來,不然源碼接受不到參數,會一直去定位它,然后定義好func之后將func索引傳入給until,以下就是我寫的代碼,供大家參考,也不知道講沒講清楚,有興趣的朋友可以看一下:

 

def func(*args) :
  return args[0].find_element_by_xpath("//*[text()='任務大廳']")


WebDriverWait(driver,30,1).until(func)

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

while True:
try:
value = method(self._driver)
if value:
return value
通過這段源碼可以看出,當我們將func的索引傳入until后,即method=func, 在Try下面,until調用了method,並且傳入了driver對象,所以實際上是我們定義的函數func(driver),所以我說我們定義的函數需要接受一個參數,然后這個函數需要有一個返回值給value,如果接受不到這個返回值,就會一直去重復執行method函數,直至我們設置的時間結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM