用法聲明
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
import time
url = 'http://www.baidu.com'
## firefox & chrome webdriver
## chrome webdriver: https://chromedriver.chromium.org/downloads 注意對應chrome版本
driver = webdriver.Firefox()
driver = webdriver.Chrome(driver_path, chrome_options = webdriver.ChromeOptions().add_argument("--incognito")) # 無痕窗口
# driver.minimize_window()
driver.get(url)
三種等待方式
## https://huilansame.github.io/huilansame.github.io/archivers/sleep-implicitlywait-wait
time.sleep(5) # 強制等待:5s
driver.implicitly_wait(5) $ 隱式等待:5s內頁面加載完成後執行後續動作
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'login-name'))) # 顯示等待:5s內直至元素符合條件後執行定位
幾種元素定位方式
ele = driver.find_element_by_xpath('//*[@id="username"]').send_keys(username) # 右鍵檢查/F12 -> 定位標籤 -> 右鍵copy -> copy xpath
ele = driver.find_element_by_id('element_id') # 注意AJAX下id可能會變動, 相應的xpath也可能變動
ele = driver.find_element_by_css_selector('.class1.class2.class3') # 靈活
ele = driver.find_element_by_class_name('classname') # 方便,但可能定位不唯一
ele = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'login-name')))
ele = WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.CLASS_NAME, 'classname')))
ele = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="login_form"]/div/div[3]/button')))
ele = WebDriverWait(driver, 5).until_not(EC.presence_of_element_located((By.CSS_SELECTOR, '.class.hide')))
## AJAX下元素定位可能一直爲真,但也許是語義錯誤,此時需要time.sleep()
元素操作
ele.click() # 按鈕點擊
ele.sendkey('username') # 輸入框傳值
ele.get_attribute('para_name') # 'para_name' in ('class', 'innerText', 'textContent', 'innerHTML') # 獲取文本
基本異常
try:
ele = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH , xpath)))
except TimeoutException:
print ("xpath: Loading took too much time!")
pass # 忽略
參考
https://stackoverflow.com/questions/49775502/webdriverwait-not-working-as-expected/49775808#49775808
https://stackoverflow.com/questions/57262217/how-do-you-use-ec-presence-of-element-locatedby-id-mydynamicelement-excep