2017-02-11 40 views
2

我在Python中有一個Selenium腳本。我正在嘗試訪問的網頁將具有以下兩種可能結果之一:硒等待2個條件中的任一個出現

  1. 要麼它沒有所需的數據,在這種情況下,它將打印出某個文本(例如,「數據不是找到「)
  2. 或者,它會具有所需的數據,並將其加載到我可以通過ID訪問一個元素(比如,‘數據ID’)

我需要等待這些條件是真正。如果滿足這些條件中的任何一個,我將簡單地提取頁面源並退出。

我可以單獨等待這些條件如下:

element1 = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.ID, "nodataID"), "data not found")) 
if element1: 
    content = driver.page_source.encode('utf-8') 
    driver.quit() 

element2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dataID"))) 
if element2: 
    content = driver.page_source.encode('utf-8') 
    driver.quit() 

這意味着,硒會先等待,看看網頁沒有所需要的數據。在這種情況下,它將獲得頁面源並退出。但是如果這個條件沒有得到滿足,那麼它將繼續等待另外10秒來查看是否滿足第二個條件。

這種方法的問題是,我不確定第一個條件,如果是真的,將在10秒內得到滿足。也就是說,我可能會等待10秒,如果第一個條件沒有滿足,那麼我將移動一個來尋找第二個條件。但第一個條件實際上可能是真實的,並在第十一秒就實現了。在這種情況下,我的腳本永遠不會知道第一個條件已經實現。如果我切換兩個等待語句的順序,那麼問題仍然存在,因爲現在我還不確定要等待新的第一個條件成立多久。

這種方法的另一個問題是,即使在2-3秒內實際滿足第二個條件,它也會等待10秒才能滿足第一個條件。所以,當網頁的第二個條件成立時,浪費了等待時間。

所以,我需要能夠寫一個等待這兩個條件之一是真的等待。

我回顧了幾個其他的Stackoverflow問題,並試圖想出一個解決方案,但我無法解決它。我嘗試將這兩個條件與逗號(,)或||結合起來或OR關鍵字。但這些都不能解決問題。

有人可以請指出我在正確的方向嗎?

+0

有沒有魔術關鍵字,但我發現[這](http://stackoverflow.com/a/16464305/4280359)。 –

回答

1

您可以使用CSS_SELECTORor等待條件

WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#nodataID, #dataID"))) 
content = driver.page_source.encode('utf-8') 
driver.quit() 

你也不需要if element檢查之一。如果預期的情況會失敗,它會拋出TimeoutException