Selenium 全面指南

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_elementfind_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 常用定位器
定位器用法示例
IDdriver.find_element(By.ID, "element_id")
Namedriver.find_element(By.NAME, "name")
Classdriver.find_element(By.CLASS_NAME, "class")
Tagdriver.find_element(By.TAG_NAME, "tag")
CSSdriver.find_element(By.CSS_SELECTOR, ".class")
XPathdriver.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. 常見問題和解決方案

  1. 元素未找到

    • 使用顯式等待。
    • 檢查選擇器是否正確。
  2. 元素不可交互

    • 檢查是否需要滾動或切換到 iframe。
    • 確保元素可見。
  3. 動態加載內容

    • 使用 WebDriverWait 處理延遲加載的內容。

5. 總結

Selenium 提供了豐富的 API,涵蓋了瀏覽器操作、頁面元素交互、動態等待等場景。熟練掌握這些 API,可以幫助我們輕松應對;爬蟲、 Web 自動化測試的各種挑戰。

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

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

相關文章

Go框架比較:goframe、beego、iris和gin

由于工作需要,這些年來也接觸了不少的開發框架,Golang的開發框架比較多,不過基本都是Web"框架"為主。這里稍微打了個引號,因為大部分"框架"從設計和功能定位上來講,充其量都只能算是一個組件&…

【華為OD-E卷-木板 100分(python、java、c++、js、c)】

【華為OD-E卷-木板 100分(python、java、c、js、c)】 題目 小明有 n 塊木板,第 i ( 1 ≤ i ≤ n ) 塊木板長度為 ai。 小明買了一塊長度為 m 的木料,這塊木料可以切割成任意塊,拼接到已有的木板上,用來加…

sqlserver臨時表來做表聯查復雜查詢

使用臨時表,先查詢出結果,在用于后面表的子查詢或者聯查 -- 刪除表1if EXISTS ( SELECT 1 FROM tempdb.sys.objects where name like #temp_PublishRecord% ) beginDROP TABLE #temp_PublishRecordprint 已刪除臨時表 #temp_PublishRecordend--創…

OMG DDS 規范漫談:分布式數據交互的演進之路

一、由來與起源脈絡 OMG DDS(Object Management Group Data Distribution Service)的發展是計算機科學和技術進步的一個縮影,它反映了對高效、可靠的數據共享需求的響應。DDS 的概念萌生于20世紀90年代末,當時分布式計算已經從理…

1.使用 Couchbase 數倉和 Temporal(一個分布式任務調度和編排框架)實現每 5 分鐘的增量任務

在使用 Couchbase 數倉和 Temporal(一個分布式任務調度和編排框架)實現每 5 分鐘的增量任務時,可以按照以下步驟實現,同時需要注意關鍵點。 實現方案 1. 數據層設計(Couchbase 增量存儲與標記) 在 Couchb…

Spring源碼分析之AOP-@EnableAspectJAutoProxy

前言 這篇文章之前我們說了Springboot的啟動流程,Bean對象怎么實現從無到有的一個過程還有一些接口的拓展的實現等等那么從這一篇文章開始的話我們就會開始說一說我們的常用的AOP它的底層實現原理所以大家一起加油加油!!! AOP: 1.簡介: AOP的…

Linux(Centos 7.6)基本信息查看

1.服務器硬件信息查看 1.1.服務器廠商、產品名稱查看 dmidecode -s system-manufacturer:查看服務器廠商信息 dmidecode -s system-product-name:查看服務器產品名稱信息 1.Windows使用VMware安裝的Linux(Centos 7.6)后,服務器廠商、產品名…

多個圖片轉換為PDF文件

將多個圖片轉換為PDF文件在Python中可以通過多個庫來實現,其中最常用的庫之一是Pillow(用于圖像處理)和reportlab(用于生成PDF)。不過,對于直接圖片轉PDF的操作,更推薦使用Pillow配合PyMuPDF&am…

小程序app封裝公用頂部篩選區uv-drop-down

參考ui:DropDown 下拉篩選 | 我的資料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生態框架 樣式示例&#xff1a; 封裝公用文件代碼 dropDownTemplete <template><!-- 頂部下拉篩選區封裝公用組件 --><view><uv-drop-down ref&…

LeetCode:101. 對稱二叉樹

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode&#xff1a;101. 對稱二叉樹 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸…

Docker-如何啟動docker

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。希望大家多多關注作者&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。 我們在上一章&#xff0c;講了虛擬化&#xff0c;虛擬化是把硬件虛擬化&#xff0c;然后創建出來的虛擬機完全隔離&#xff…

COMSOL with Matlab

文章目錄 基本介紹COMSOL with MatlabCOMSOL主Matlab輔Matlab為主Comsol為輔 操作步驟常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 實例教學自動另存新檔**把語法套用到邊界條件**把語法套用到另存新檔 函數及其微分…

游戲關卡設計方法的雜感

1、正規思路是&#xff1a;先寫設計文檔&#xff0c;畫平面圖&#xff0c;再做白模關卡&#xff0c;再做正規模型的關卡。 一步步擴大。 當然是有道理的&#xff0c;從小到大&#xff0c; 但實際上這需要很強的想象力&#xff0c;很多細節靠腦補&#xff0c;初學者很難做好。…

JVM系列(十二) -常用調優命令匯總

最近對 JVM 技術知識進行了重新整理&#xff0c;再次獻上 JVM系列文章合集索引&#xff0c;感興趣的小伙伴可以直接點擊如下地址快速閱讀。 JVM系列(一) -什么是虛擬機JVM系列(二) -類的加載過程JVM系列(三) -內存布局詳解JVM系列(四) -對象的創建過程JVM系列(五) -對象的內存分…

bmp390l傳感器的IIC命令通信(學習匯總)

參考鏈接&#xff1a; BMP390高精度壓力傳感器數據讀取與處理&#xff08;基于STM32&#xff09;-CSDN博客 https://blog.csdn.net/qq_43862401/article/details/106502397 利用usb轉iic模塊測試bmp390l傳感器采集當前環境的溫度和氣壓數據&#xff0c;下圖中reserved表示…

C/C++基礎知識復習(43)

1) 什么是運算符重載&#xff1f;如何在 C 中進行運算符重載&#xff1f; 運算符重載是指在 C 中為現有的運算符定義新的行為&#xff0c;使得它們能夠用于用戶定義的數據類型&#xff08;如類或結構體&#xff09;。通過運算符重載&#xff0c;可以讓自定義類型像內置數據類型…

Windows11 家庭版安裝配置 Docker

1. 安裝WSL WSL 是什么&#xff1a; WSL 是一個在 Windows 上運行 Linux 環境的輕量級工具&#xff0c;它可以讓用戶在 Windows 系統中運行 Linux 工具和應用程序。Docker 為什么需要 WSL&#xff1a; Docker 依賴 Linux 內核功能&#xff0c;WSL 2 提供了一個高性能、輕量級的…

2025系統架構師(一考就過):案例題之一:嵌入式架構、大數據架構、ISA

一、嵌入式系統架構 軟件脆弱性是軟件中存在的弱點(或缺陷)&#xff0c;利用它可以危害系統安全策略&#xff0c;導致信息丟失、系統價值和可用性降低。嵌入式系統軟件架構通常采用分層架構&#xff0c;它可以將問題分解為一系列相對獨立的子問題&#xff0c;局部化在每一層中…

新手SEO指南如何快速入門與提升網站排名

內容概要 搜索引擎優化&#xff08;SEO&#xff09;是提高網站可見度和排名的重要手段&#xff0c;尤其對新手來說&#xff0c;掌握其基本概念和實用技巧至關重要。本文將針對新手提供一系列的指導&#xff0c;幫助你快速入門并逐步提升網站排名。 首先&#xff0c;了解SEO的…

Oracle下載安裝(保姆級教學)

方法1 1. 官網下載安裝包 對于 Oracle 軟件的下載&#xff0c;建議通過官網免費下載&#xff0c;安全且有保證。 下載地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 通過下載頁面可以選擇安裝壓縮包&#xff08; WIND…