Selenium 攻略:從元素操作到 WebDriver 實戰

在自動化測試、網頁數據爬取、批量操作網頁等場景中,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()

    六、注意事項

    1. 定位策略選擇:優先使用 id/name(效率最高),其次 css selector,復雜場景用 xpath。
    1. 反爬與合規:自動化操作可能觸發網站反爬機制,爬取數據需遵守網站 robots 協議和法律法規。
    1. 版本匹配:瀏覽器驅動版本必須與瀏覽器版本一致(如 ChromeDriver 114 對應 Chrome 114.x)。
    1. 無頭模式:無需顯示瀏覽器窗口時,可啟用無頭模式提高效率(以 Chrome 為例):
    
    options = webdriver.ChromeOptions()options.add_argument("--headless=new") # 啟用無頭模式driver = webdriver.Chrome(options=options)

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/diannao/92068.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/diannao/92068.shtml
    英文地址,請注明出處:http://en.pswp.cn/diannao/92068.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    【算法訓練營Day14】二叉樹part4

    文章目錄找樹左下角的值路徑總和總結&#xff1a;遞歸函數的返回值路徑總和 II總結&#xff1a;二叉樹遞歸的思考從中序與后序遍歷序列構造二叉樹找樹左下角的值 題目鏈接&#xff1a;513. 找樹左下角的值 解題邏輯&#xff1a; 使用層序遍歷&#xff0c;將最后一層的第一個元…

    工資系統如何計算工資

    工資系統計算工資是一個集成數據收集、規則應用、自動核算和合規審核的自動化過程&#xff0c;以下是其核心原理和步驟&#xff0c;結合技術實現與法規要求進行說明&#xff1a;?? 一、工資系統的基本框架與數據準備系統初始化與規則配置企業信息設置&#xff1a;錄入公司名稱…

    車載通信架構 --- DoIP協議通信

    我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

    基于Event Sourcing和CQRS的微服務架構設計與實戰

    基于Event Sourcing和CQRS的微服務架構設計與實戰 業務場景描述 在電商系統中&#xff0c;訂單的高并發寫入與復雜的狀態流轉&#xff08;下單、支付、發貨、退貨等&#xff09;給傳統的CRUD模型帶來了挑戰&#xff1a; 數據一致性難保證&#xff1a;跨服務事務處理復雜&#x…

    初級安全課第二次作業

    &#xff08;一&#xff09;xss-labs 1~8關 1、前期準備 &#xff08;1&#xff09;打開小皮面板&#xff0c;并啟動Apache和MySQL&#xff08;2&#xff09;將 xss-labs放到 phpstudy_pro 的 WWW 目錄下&#xff08;3&#xff09;訪問連接&#xff1a;http://localhost/xss-la…

    從零搭建智能搜索代理:LangGraph + 實時搜索 + PDF導出完整項目實戰

    傳統的AI聊天系統往往局限于預訓練數據的知識范圍&#xff0c;無法獲取實時信息。本文將詳細闡述如何構建一個基于LangGraph的智能代理系統&#xff0c;該系統能夠智能判斷何時需要進行網絡搜索、有效維護對話上下文&#xff0c;并具備將對話內容導出為PDF文檔的功能。 本系統…

    C語言分支和循環語句——猜數字游戲

    分支語句的語法形式1. if(表達式)語句;2. if(表達式)語句1;else語句2;3. Switch(表達式){ case 1: break;case 2: break;case 3: break; default: break; }循環語句的語法形式1. while(表達式)語句 ;2. for&#xff08;表達…

    Python設計模式深度解析:原型模式(Prototype Pattern)完全指南

    Python設計模式深度解析&#xff1a;原型模式&#xff08;Prototype Pattern&#xff09;完全指南前言什么是原型模式&#xff1f;模式的核心組成實際案例&#xff1a;游泳比賽管理系統游泳者數據結構原型模式的實現深拷貝 vs 淺拷貝&#xff1a;核心概念解析淺拷貝&#xff08…

    SAP-ABAP:SAP萬能長度計算:DYNAMIC_OUTPUT_LENGTH 深度解析

    &#x1f4cf; SAP ABAP 萬能長度計算&#xff1a;DYNAMIC_OUTPUT_LENGTH 深度解析核心作用&#xff1a;智能計算數據對象在列表/ALV中的實際顯示寬度 | 關鍵優勢&#xff1a;多字節字符處理 | 格式感知 | 動態適配&#x1f50d; 一、核心功能與技術特性 &#x1f4ca; 數據類型…

    20250720-2-Kubernetes 調度-資源限制對Pod調度的影響(1)_筆記

    一、創建一個Pod的工作流程&#xfeff;1. k8s架構解析&#xfeff;組件交互模式: Kubernetes采用list-watch機制的控制器架構&#xff0c;實現組件間交互的解耦。各組件通過監控自己負責的資源&#xff0c;當資源發生變化時由kube-apiserver通知相關組件。類比說明: 類似小賣鋪…

    mobaxteam x11傳輸界面避坑

    mobaxteam x11傳輸界面避坑 文章目錄mobaxteam x11傳輸界面避坑1 windows系統必須下載xing2 配置1 windows系統必須下載xing 因為windows系統本身沒有x服務。 2 配置 如圖

    flink sql如何對hive string類型的時間戳進行排序

    在 Flink SQL 中對 Hive 表的 STRING 類型時間戳進行排序&#xff0c;需要先將字符串轉換為時間類型&#xff0c;再基于時間類型排序。以下是具體方法和示例&#xff1a; 一、核心解決方案 1. 字符串轉 TIMESTAMP 后排序 若 Hive 中的時間戳格式為 yyyy-MM-dd HH:mm:ss&#xf…

    Linux:線程控制

    線程概念線程&#xff08;Thread&#xff09;是進程&#xff08;Process&#xff09; 中的一個執行單元&#xff0c;是操作系統能夠進行運算調度的最小單位。線程也被稱為“輕量級進程”&#xff08;Lightweight Process, LWP&#xff09;。一個進程可以包含多個線程&#xff0…

    React 學習(4)

    核心API———createRoot、render方法1.createRoot 方法是創建react的根容器&#xff0c;就是react元素的插入位置&#xff0c;插入的dom會被轉化成react元素&#xff0c;根容器內的內容都會被react管理&#xff0c;原有dom都會被刪除。react17 根容器創建、渲染方式&#xff0…

    ASP .NET Core 8集成Swagger全攻略

    Swagger (現在稱為 OpenAPI) 是一個用于描述 RESTful API 的規范&#xff0c;ASP.NET Core 內置支持通過 Swashbuckle 庫生成 Swagger 文檔。以下是在 ASP.NET Core 8 中實現 Swagger 的完整步驟。1、添加Swagger NuGet 包dotnet add package Swashbuckle.AspNetCore2、添加Swa…

    【iOS】源碼閱讀(六)——方法交換

    文章目錄方法交換什么是Method-Swizzling方法交換核心API**1. 獲取方法對象****2. 添加/替換方法實現****3. 交換方法實現****4. 獲取方法信息****5. 修改方法實現****使用示例&#xff1a;完整的 Method-Swizzling 流程****注意事項**使用方法交換注意事項線程安全方法交換的影…

    mysql運維問題解決:MySQL主從延遲(鎖阻塞與讀寫分離)

    小亦平臺會持續給大家科普一些運維過程中常見的問題解決案例&#xff0c;運維朋友們可以在常見問題及解決方案專欄查看更多案例 問題概述 告警事件&#xff1a; 2023-07-28 03:31:39.571 首次觸發主從延遲告警&#xff08;延遲1515秒&#xff09;2023-07-28 07:41:37 告警解除…

    SSH 密鑰

    什么是 SSH 密鑰 SSH 密鑰就像是你電腦的“身份證”和“鑰匙”&#xff0c; 用來安全登錄另一臺電腦&#xff08;服務器&#xff09;&#xff0c;而不需要每次輸入密碼。SSH 密鑰是一種安全登錄遠程服務器的方式&#xff0c;由一對加密的“鑰匙”組成&#xff1a;一個公鑰 一個…

    st-Gcn訓練跳繩識別模型一:數據標注工具和標注流程

    目錄 工具展示和使用說明 工具標注后文件展示說明 json轉換成單個npy文件 數據獲取補充 工具展示和使用說明 文件名labelV.py集于PySide6實現&#xff1a; 通過選擇視頻來選擇你要標注的視頻&#xff0c;然后選擇保存路徑&#xff1a; 然后視頻兩個類別。當你看見視頻中的人…

    springboot跨域問題 和 401

    springboot跨域問題 和 401 1.跨域import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…