python+selenium 判斷元素是否存在,是否可點擊,是否被選中--最全的解釋,一定不要錯過

 

現在的大多數的Web應用程序是使用Ajax技術。當一個頁面被加載到瀏覽器時, 該頁面內的元素可以在不同的時間點被加載。這使得定位元素變得困難, 如果元素不再頁面之中,會拋出 ElementNotVisibleException 異常。 使用 waits, 我們可以解決這個問題。waits提供了一些操作之間的時間間隔- 主要是定位元素或針對該元素的任何其他操作。
Selenium Webdriver 提供兩種類型的waits - 隱式和顯式。 顯式等待會讓WebDriver等待滿足一定的條件以後再進一步的執行。 而隱式等待讓Webdriver等待一定的時間後再纔是查找某元素。

顯式等待:

顯式等待是你在代碼中定義等待一定條件發生後再進一步執行你的代碼。 最糟糕的案例是使用time.sleep(),它將條件設置爲等待一個確切的時間段。 這裏有一些方便的方法讓你只等待需要的時間。WebDriverWait結合ExpectedCondition 是實現的一種方式。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

WebDriverWait(driver, 10)設置了一個10秒上限的等待時間
自動化的Web瀏覽器中一些常用的預期條件,下面列出的是每一個實現, Selenium Python binding都提供了一些方便的方法,這樣你就不用去編寫 expected_condition類或是創建至今的工具包去實現他們。傳入的參數都是元組類型的locator,如(By.ID, 'kw')
expected_conditions as EC後面最最常接的預期條件:


driver.find_element_by_id('kw').is_displayed()   #查看元素是否可見

EC.presence_of_element_located((By.ID,"kw"))   #查看某個元素是否存在

EC.element_to_be_clickable()         #查看元素是否可點擊

EC.element_located_to_be_selected((By.ID,"kw")) #某個預期元素是否被選中

補充:

#frame可見並切換到該frame上
EC.frame_to_be_available_and_switch_to_it
#元素可以點擊,常用於按鍵
EC.element_to_be_clickable
#元素出現,只要一個符合條件的元素加載出來就通過
EC.presence_of_element_located
#元素出現,須所有符合條件的元素都加載出來,這個基本上就是你爬取的最主要內容了
EC.presence_of_all_elements_located
#判斷某段文本是否出現在某元素中,常用於判斷輸入頁數與實際高亮頁數是否一致
EC.text_to_be_present_in_element

By後面常接的選擇方式(未列出全部,全部請dir(By)查看):

By.CLASS_NAME #根據class的名稱
By.ID #根據id的名稱
By.TAG_NAME #根據標籤的名稱

#最最無敵的兩個,直接從開發者工具中就可以無腦用css或xpath方法複製元素的位置
By.CSS_SELECTOR #應用CSS選擇器方法
By.XPATH #應用XPATH選擇器方法

以上一篇文章的登錄QQ空間爲例,我們用顯式等待修改下代碼:

from selenium import webdriver
#爲了增加顯式等待,增加以下三個模塊
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


url = 'http://user.qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)
#設置等待上限10秒
timeout = WebDriverWait(driver, 10)

#切換到登錄框中的frame
timeout.until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'login_frame')))

switcher_plogin = timeout.until(EC.element_to_be_clickable((By.ID, 'switcher_plogin')))
#點擊“帳號密碼登錄”按鈕
switcher_plogin.click()
#定位帳號輸入框
username = timeout.until(EC.presence_of_element_located((By.ID, 'u')))
#username = driver.find_element_by_id('u')
#清空帳號輸入框內容
username.clear()
#填寫帳號
username.send_keys('你的賬號')
password = timeout.until(EC.presence_of_element_located((By.ID, 'p')))
#password = driver.find_element_by_id('p')
password.clear()
password.send_keys('你的密碼')
#點擊“登錄”按鈕
log_in = timeout.until(EC.element_to_be_clickable((By.ID, 'login_button'))).click()
#driver.quit()

還可以用username.text獲得標籤中的文字信息。

隱式等待

如果某些元素不是立即可用的,隱式等待是告訴WebDriver去等待一定的時間後去查找元素。 默認等待時間是0秒,一旦設置該值,隱式等待是設置該WebDriver的實例的生命週期。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")



作者:X_xxieRiemann
鏈接:https://www.jianshu.com/p/acc34c8861ca
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章