Selenium 是一個強大的 Web 自動化工具,支持多種瀏覽器和語言綁定。
1. Selenium 的基本概念
- WebDriver:Selenium 提供的核心接口,用于控制瀏覽器操作。
- 顯式等待:等待特定條件滿足后再執行操作。
- 隱式等待:全局設置一個等待時間,針對所有操作生效。
- 定位器(Locators):用于定位頁面元素的方法,如 ID、XPath、CSS 選擇器等。
2. Selenium 的主要模塊及 API
2.1 WebDriver
WebDriver
是 Selenium 的核心,用于與瀏覽器進行交互。
2.1.1 初始化瀏覽器
from selenium import webdriver# 啟動 Chrome 瀏覽器
driver = webdriver.Chrome()# 打開指定網址
driver.get("https://www.example.com")# 最大化窗口
driver.maximize_window()# 關閉瀏覽器
driver.quit()
2.1.2 瀏覽器導航
driver.get("https://www.example.com") # 打開網址
driver.back() # 后退
driver.forward() # 前進
driver.refresh() # 刷新頁面
2.2 定位元素
Selenium 提供多種方法來定位網頁中的元素:
2.2.1 使用 find_element
和 find_elements
from selenium.webdriver.common.by import By# 定位單個元素
element = driver.find_element(By.ID, "element_id")# 定位多個元素
elements = driver.find_elements(By.CLASS_NAME, "class_name")
2.2.2 常用定位器
定位器 | 用法示例 |
---|---|
ID | driver.find_element(By.ID, "element_id") |
Name | driver.find_element(By.NAME, "name") |
Class | driver.find_element(By.CLASS_NAME, "class") |
Tag | driver.find_element(By.TAG_NAME, "tag") |
CSS | driver.find_element(By.CSS_SELECTOR, ".class") |
XPath | driver.find_element(By.XPATH, "//tag[@attr='value']") |
2.3 操作頁面元素
2.3.1 輸入內容
element = driver.find_element(By.ID, "username")
element.send_keys("test_user")
2.3.2 點擊按鈕
button = driver.find_element(By.ID, "submit_button")
button.click()
2.3.3 清空輸入框
input_field = driver.find_element(By.ID, "input_field")
input_field.clear()
2.3.4 獲取元素屬性
element = driver.find_element(By.ID, "logo")
print(element.get_attribute("src"))
2.3.5 獲取元素文本
element = driver.find_element(By.ID, "welcome_message")
print(element.text)
2.4 等待
Selenium 提供顯式等待和隱式等待來處理動態加載頁面。
2.4.1 隱式等待
隱式等待是全局設置,等待元素加載完成。
driver.implicitly_wait(10) # 全局等待 10 秒
2.4.2 顯式等待
顯式等待針對特定元素或條件設置。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素可見
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "element_id"))
)
2.4.3 常用條件
條件 | 描述 |
---|---|
presence_of_element_located | 元素出現在 DOM 中,但不一定可見。 |
visibility_of_element_located | 元素出現在 DOM 且可見。 |
element_to_be_clickable | 元素可點擊。 |
url_changes | 頁面 URL 發生變化。 |
alert_is_present | 彈窗出現。 |
2.5 頁面操作
2.5.1 窗口操作
# 獲取當前窗口句柄
current_window = driver.current_window_handle# 獲取所有窗口句柄
all_windows = driver.window_handles# 切換到新窗口
driver.switch_to.window(all_windows[1])
2.5.2 iframe 切換
# 切換到 iframe
driver.switch_to.frame("iframe_name")# 返回主頁面
driver.switch_to.default_content()
2.5.3 滾動頁面
# 滾動到頁面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
2.6 Cookie 和 JavaScript
2.6.1 操作 Cookie
# 獲取所有 Cookies
print(driver.get_cookies())# 添加 Cookie
driver.add_cookie({"name": "test", "value": "123"})# 刪除 Cookie
driver.delete_cookie("test")
2.6.2 執行 JavaScript
driver.execute_script("alert('Hello, Selenium!')")
2.7 處理彈窗
# 等待彈窗出現
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())# 獲取彈窗文本
print(alert.text)# 接受彈窗
alert.accept()
3. 進階技巧
3.1 動態 XPath
動態頁面的元素屬性可能變化,可以使用包含或正則表達式的 XPath:
element = driver.find_element(By.XPATH, "//button[contains(@class, 'submit')]")
?3.2 驗證頁面加載完成
WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete"
)
4. 常見問題和解決方案
-
元素未找到
- 使用顯式等待。
- 檢查選擇器是否正確。
-
元素不可交互
- 檢查是否需要滾動或切換到 iframe。
- 確保元素可見。
-
動態加載內容
- 使用
WebDriverWait
處理延遲加載的內容。
- 使用
5. 總結
Selenium 提供了豐富的 API,涵蓋了瀏覽器操作、頁面元素交互、動態等待等場景。熟練掌握這些 API,可以幫助我們輕松應對;爬蟲、 Web 自動化測試的各種挑戰。