在自動化測試、網頁數據爬取、批量操作網頁等場景中,Selenium 無疑是最受歡迎的工具之一。作為一款強大的 Web 自動化工具,它能模擬人類操作瀏覽器的行為,實現點擊、輸入、跳轉等一系列動作。本文將從基礎到進階,全面解析 Selenium 的核心用法,幫你快速掌握這一工具的精髓。
一、元素定位:找到網頁的 "積木"
操作網頁的前提是準確定位元素。Selenium 提供了 8 種定位方式,覆蓋絕大多數場景:
定位方式 | 方法 | 適用場景 |
id | find_element(By.ID, value) | 元素有唯一 id 屬性(推薦優先使用) |
name | find_element(By.NAME, value) | 元素有 name 屬性,且值較唯一 |
class name | find_element(By.CLASS_NAME) | 元素 class 屬性(注意多 class 需取單個) |
tag name | find_element(By.TAG_NAME) | 通過標簽名定位(如<input>),適合批量查找 |
link text | find_element(By.LINK_TEXT) | 精準匹配鏈接文本(如<a>標簽完整文字) |
partial link text | find_element(By.PARTIAL_LINK_TEXT) | 模糊匹配鏈接文本 |
xpath | find_element(By.XPATH, value) | 復雜結構或無明顯屬性時(萬能定位) |
css selector | find_element(By.CSS_SELECTOR) | 簡潔高效,適合有 CSS 基礎的用戶 |
示例代碼:
from selenium.webdriver.common.by import By# 通過id定位用戶名輸入框username = driver.find_element(By.ID, "username")# 通過xpath定位密碼輸入框password = driver.find_element(By.XPATH, '//input[@type="password"]')# 通過css selector定位登錄按鈕login_btn = driver.find_element(By.CSS_SELECTOR, ".login-form .submit-btn")
二、元素操作:讓網頁 "動" 起來
定位元素后,即可通過 Selenium 提供的方法進行交互,常用操作如下:
1. 基礎操作
- 點擊:element.click()(按鈕、鏈接等)
- 輸入文本:element.send_keys("內容")(輸入框)
- 清除內容:element.clear()(清空輸入框)
- 獲取文本:element.text(獲取元素可見文本)
- 獲取屬性:element.get_attribute("href")(獲取鏈接 href 屬性)
2. 特殊元素處理
- 下拉框:使用Select類(需導入from selenium.webdriver.support.ui import Select)
select = Select(driver.find_element(By.ID, "city"))select.select_by_visible_text("北京") # 按文本選擇select.select_by_value("shanghai") # 按value屬性選擇復選框 / 單選按鈕:通過click()切換狀態,結合is_selected
()判斷是否選中
checkbox = driver.find_element(By.NAME, "agree")if not checkbox.is_selected():checkbox.click() # 勾選未選中的復選框
- 文件上傳:通過send_keys傳入文件路徑(無需點擊上傳按鈕)
upload_btn = driver.find_element(By.ID, "file-upload")upload_btn.send_keys("D:/data.csv") # 傳入本地文件路徑
- 彈窗處理:通過driver.switch_to.alert切換到彈窗
alert = driver.switch_to.alertprint(alert.text) # 獲取彈窗文本alert.accept() # 確認彈窗# alert.dismiss() # 取消彈窗
三、WebDriver 核心方法:掌控瀏覽器
WebDriver 提供了大量控制瀏覽器的方法,覆蓋導航、窗口、信息獲取等場景:
1. 瀏覽器窗口控制
driver.maximize_window() # 最大化窗口driver.set_window_size(1200, 800) # 設置窗口大小driver.get_window_size() # 獲取窗口大小
2. 導航操作
driver.get("https://www.baidu.com") # 打開網頁driver.back() # 后退driver.forward() # 前進driver.refresh() # 刷新頁面
3. 頁面信息獲取
print(driver.title) # 獲取頁面標題print(driver.current_url) # 獲取當前URLprint(driver.page_source) # 獲取頁面源碼(用于調試)
4. 等待機制(關鍵!)
由于網頁加載存在延遲,直接操作元素可能導致 "元素未找到" 錯誤,需通過等待機制解決:
- 隱式等待:全局設置,等待所有元素加載(不推薦單獨使用)
driver.implicitly_wait(10) # 等待10秒,超時則報錯
- 顯式等待:針對特定元素設置等待條件(推薦)
from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 等待10秒,直到id為"submit"的元素可點擊submit_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "submit")))submit_btn.click()
- 強制等待:time.sleep(2)(僅調試用,不建議實際場景使用)
四、進階技巧:應對復雜場景
1. 多窗口 /iframe 切換
- 多窗口切換:通過窗口句柄(handle)切換
# 獲取所有窗口句柄handles = driver.window_handles# 切換到新窗口driver.switch_to.window(handles[-1])
- iframe 切換:網頁中嵌套 iframe 時,需先切換到 iframe 才能操作內部元素
# 通過id切換到iframedriver.switch_to.frame("iframe-id")# 操作iframe內元素...# 切回主文檔driver.switch_to.default_content()
2. 執行 JavaScript
對于 Selenium 難以直接操作的元素(如滾動、隱藏元素),可通過執行 JS 實現:
# 滾動到頁面底部driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")# 點擊隱藏元素hidden_btn = driver.find_element(By.ID, "hidden-btn")driver.execute_script("arguments[0].click();", hidden_btn)
3. 截圖與調試
# 截取當前頁面并保存driver.get_screenshot_as_file("error.png")
五、實戰案例:自動登錄示例
結合上述知識點,實現一個自動登錄某網站的流程:
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport time# 初始化瀏覽器driver = webdriver.Chrome()driver.maximize_window()try:# 打開登錄頁driver.get("https://example.com/login")# 顯式等待并輸入用戶名username = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username.send_keys("test_user")# 輸入密碼password = driver.find_element(By.ID, "password")password.send_keys("test_pass123")# 點擊登錄按鈕login_btn = driver.find_element(By.CSS_SELECTOR, ".login-btn")login_btn.click()# 驗證登錄成功(等待歡迎信息出現)welcome_msg = WebDriverWait(driver, 15).until(EC.text_to_be_present_in_element((By.CLASS_NAME, "welcome"), "歡迎回來"))print("登錄成功!")time.sleep(2) # 停留2秒查看結果finally:# 關閉瀏覽器driver.quit()
六、注意事項
- 定位策略選擇:優先使用 id/name(效率最高),其次 css selector,復雜場景用 xpath。
- 反爬與合規:自動化操作可能觸發網站反爬機制,爬取數據需遵守網站 robots 協議和法律法規。
- 版本匹配:瀏覽器驅動版本必須與瀏覽器版本一致(如 ChromeDriver 114 對應 Chrome 114.x)。
- 無頭模式:無需顯示瀏覽器窗口時,可啟用無頭模式提高效率(以 Chrome 為例):
options = webdriver.ChromeOptions()options.add_argument("--headless=new") # 啟用無頭模式driver = webdriver.Chrome(options=options)