sleep后會影響腳本的執(zhí)行速度,雖然implicitly_wait()這種方法隱式等待方法一定程度上節(jié)省了很多時間谓着。
但是一旦頁面上某些js無法加載出來(其實界面元素經(jīng)出來了)珠移,左上角那個圖標一直轉(zhuǎn)圈,這時候會一直等待的贴汪。
一播赁、參數(shù)解釋
1.這里主要有三個參數(shù):
class WebDriverWait(object):driver, timeout, poll_frequency
2.driver:返回瀏覽器的一個實例拟枚,這個不用多說
3.timeout:超時的總時長
4.poll_frequency:循環(huán)去查詢的間隙時間薪铜,默認0.5秒
以下是源碼的解釋文檔(案例一個是元素出現(xiàn),一個是元素消失)
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
"""Constructor, takes a WebDriver instance and timeout in seconds.
:Args:
- driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
- timeout - Number of seconds before timing out
- poll_frequency - sleep interval between calls
By default, it is 0.5 second.
- ignored_exceptions - iterable structure of exception classes ignored during calls.
By default, it contains NoSuchElementException only.
Example:
from selenium.webdriver.support.ui import WebDriverWait \n
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \n
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \n
until_not(lambda x: x.find_element_by_id("someId").is_displayed())
"""
二恩溅,例子
1隔箍,元素出現(xiàn)until()例子:
from seleniumimport webdriver
from selenium.webdriver.support.uiimport WebDriverWait
path ="D:\\XXX\\chromedriver.exe"
driver = webdriver.Chrome(path)
driver.maximize_window()
driver.get("http://www.baidu.com")
WebDriverWait(driver,10).until(lambda x:x.find_element_by_id("kw")).send_keys("yoyo")
2,元素消失:until_not()例子
is_disappeared = WebDriverWait(driver, 10,1).until_not(lambda x:x.find_element_by_id("kw").is_displayed())
print(is_disappeared)
運行后因為頁面元素“kw”并未消失脚乡,所以報錯蜒滩,如下:
Python 中,lambda 函數(shù)是用一個語句表達的匿名函數(shù)奶稠「┘瑁可以用它來代替小的函數(shù)。
首先锌订,舉一個使用普通函數(shù)的例子竹握。定義函數(shù)edit_story(),參數(shù)列表如下所示:
? words——單詞列表
? func——遍歷列表中單詞的函數(shù)
>>> def edit_story(words, func):
... for word in words:
... print(func(word))
現(xiàn)在辆飘,需要一個單詞列表和一個遍歷單詞的函數(shù)啦辐。對于單詞谓传,可以選擇我的貓從某一臺階
上掉下時發(fā)出的聲音:
>>> stairs = ['thud', 'meow', 'thud', 'hiss']
對于函數(shù),它要將每個單詞的首字母變?yōu)榇髮懬酃兀缓笤谀┪布由细袊@號 , 用作貓畫報的標
題非常完美:
>>> def enliven(word): # 讓這些單詞更有情感
... return word.capitalize() + '!'
混合這些“配料”:
>>> edit_story(stairs, enliven)
Thud!
Meow!
Thud!
Hiss!
最后续挟,到了lambda。enliven() 函數(shù)可以簡潔地用下面的一個lambda 代替:
>>>
>>> edit_story(stairs, lambda word: word.capitalize() + '!')
Thud!
Meow!
Thud!
Hiss!
>>>
lambda 函數(shù)接收一個參數(shù)word侥衬。在冒號和末尾圓括號之間的部分為函數(shù)的定義诗祸。
通常,使用實際的函數(shù)(例如enliven())會比使用lambda 更清晰明了轴总。但是直颅,當需要定
義很多小的函數(shù)以及記住它們的名字時,lambda 會非常有用肘习。尤其是在圖形用戶界面中际乘,
可以使用lambda 來定義回調(diào)函數(shù)坡倔。
顯示等待WebDriverWait