Selenium基本用法彙總

用法聲明

# 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

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