最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從零開始學(xué)習(xí)Python Selenium瀏覽器元素定位與實(shí)戰(zhàn)技巧

 更新時(shí)間:2026年03月11日 09:03:13   作者:高并發(fā)吃面  
這篇文章主要為大家詳細(xì)介紹了一份Selenium全教程,涵蓋從基礎(chǔ)到進(jìn)階的核心知識(shí)點(diǎn),基于Selenium 4版本(當(dāng)前主流版本),適合新手入門及進(jìn)階學(xué)習(xí),快跟隨小編一起學(xué)習(xí)起來吧

一、Selenium簡(jiǎn)介

1. 什么是Selenium

Selenium是一個(gè)用于Web應(yīng)用程序自動(dòng)化測(cè)試的工具集,支持多瀏覽器(Chrome、Firefox、Edge等)、多語(yǔ)言(Python、Java、C#等),核心功能是模擬人類操作瀏覽器(點(diǎn)擊、輸入、跳轉(zhuǎn)等)。

2. Selenium的組成

  • Selenium WebDriver:核心組件,通過代碼驅(qū)動(dòng)瀏覽器,支持跨語(yǔ)言(本文以Python為例)。
  • Selenium IDE:瀏覽器插件,用于錄制/回放操作(適合快速生成簡(jiǎn)單腳本)。
  • Selenium Grid:用于分布式測(cè)試,可在多臺(tái)機(jī)器/瀏覽器上同時(shí)執(zhí)行用例。

3. 應(yīng)用場(chǎng)景

  • 自動(dòng)化測(cè)試(功能測(cè)試、回歸測(cè)試)。
  • 網(wǎng)頁(yè)數(shù)據(jù)爬?。M登錄、動(dòng)態(tài)內(nèi)容獲?。?。
  • 自動(dòng)化操作(如批量填寫表單、定時(shí)任務(wù))。

二、環(huán)境搭建

1. 安裝Python

Selenium需依賴Python環(huán)境,安裝時(shí)勾選“Add Python to PATH”。

2. 安裝Selenium

打開命令行,執(zhí)行:

pip install selenium  # 安裝最新版Selenium 4

3. 瀏覽器驅(qū)動(dòng)配置

WebDriver需要通過“瀏覽器驅(qū)動(dòng)”與瀏覽器通信,不同瀏覽器需對(duì)應(yīng)驅(qū)動(dòng):

瀏覽器驅(qū)動(dòng)名稱
ChromeChromeDriver
FirefoxGeckoDriver
EdgeEdgeDriver

配置步驟

  • 下載與瀏覽器版本匹配的驅(qū)動(dòng)(如Chrome 114需對(duì)應(yīng)ChromeDriver 114.x)。
  • 將驅(qū)動(dòng)文件(如chromedriver.exe)放在任意目錄,建議放在Python安裝目錄或添加到系統(tǒng)環(huán)境變量PATH

4. 驗(yàn)證環(huán)境

運(yùn)行以下代碼,若能打開Chrome并訪問百度,則配置成功:

三、基礎(chǔ)操作

1. 啟動(dòng)瀏覽器與訪問網(wǎng)頁(yè)

from selenium import webdriver

# 啟動(dòng)瀏覽器(Chrome/Firefox/Edge)
driver = webdriver.Chrome()  # Chrome
# driver = webdriver.Firefox()  # Firefox
# driver = webdriver.Edge()  # Edge

# 訪問網(wǎng)頁(yè)
driver.get("https://www.baidu.com")

# 獲取當(dāng)前頁(yè)面標(biāo)題和URL
print("標(biāo)題:", driver.title)  # 輸出:百度一下,你就知道
print("URL:", driver.current_url)  # 輸出:https://www.baidu.com/

# 關(guān)閉瀏覽器(quit()關(guān)閉所有窗口,close()關(guān)閉當(dāng)前窗口)
driver.quit()

2. 元素定位(核心!)

Selenium提供8種元素定位方式,需結(jié)合網(wǎng)頁(yè)HTML結(jié)構(gòu)使用。推薦使用By類(Selenium 4推薦寫法)。

步驟

  • 打開網(wǎng)頁(yè),按F12打開開發(fā)者工具,通過“元素選擇器”定位元素。
  • 復(fù)制元素屬性(如ID、XPath等)。
定位方式說明示例代碼
ID通過元素id屬性定位(唯一)driver.find_element(By.ID, "kw")
Name通過元素name屬性定位driver.find_element(By.NAME, "wd")
Class Name通過元素class屬性定位driver.find_element(By.CLASS_NAME, "s_ipt")
Tag Name通過標(biāo)簽名定位(如<input>driver.find_element(By.TAG_NAME, "input")
Link Text通過鏈接文本定位(精確匹配)driver.find_element(By.LINK_TEXT, "新聞")
Partial Link Text通過鏈接文本模糊匹配driver.find_element(By.PARTIAL_LINK_TEXT, "新")
XPath基于XML路徑定位(萬能)driver.find_element(By.XPATH, '//input[@id="kw"]')
CSS Selector基于CSS選擇器定位driver.find_element(By.CSS_SELECTOR, "#kw")

示例:定位百度搜索框并輸入內(nèi)容

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 定位搜索框(id為"kw")
search_box = driver.find_element(By.ID, "kw")
# 輸入文本
search_box.send_keys("Selenium教程")
# 定位搜索按鈕(id為"su")并點(diǎn)擊
search_btn = driver.find_element(By.ID, "su")
search_btn.click()

time.sleep(3)
driver.quit()

XPath進(jìn)階:XPath是最靈活的定位方式,支持復(fù)雜場(chǎng)景:

  • 絕對(duì)路徑:/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input(不推薦,易變)。
  • 相對(duì)路徑://input[@name="wd" and @class="s_ipt"](通過多屬性定位)。
  • 文本定位://a[text()="新聞"](精確匹配文本)。
  • 包含文本://a[contains(text(), "新")](模糊匹配)。

3. 操作元素

方法說明
send_keys("文本")輸入文本
click()點(diǎn)擊元素
clear()清空輸入框內(nèi)容
get_attribute("屬性名")獲取元素屬性(如value、href)
text獲取元素文本內(nèi)容
is_displayed()判斷元素是否可見

示例

# 獲取搜索框的value屬性(輸入的內(nèi)容)
print(search_box.get_attribute("value"))  # 輸出:Selenium教程

# 獲取百度logo的文本(實(shí)際為空,logo通常無文本)
logo = driver.find_element(By.CLASS_NAME, "index-logo-src")
print(logo.text)  # 輸出:空字符串

# 判斷搜索按鈕是否可見
print(search_btn.is_displayed())  # 輸出:True

四、等待機(jī)制

網(wǎng)頁(yè)加載存在延遲(如JS渲染、網(wǎng)絡(luò)延遲),直接操作元素可能導(dǎo)致“元素未找到”錯(cuò)誤,需設(shè)置等待。

1. 隱式等待

全局等待,設(shè)置一次后對(duì)所有元素生效,等待元素加載完成(最多等待指定時(shí)間)。

driver.implicitly_wait(10)  # 等待10秒(單位:秒)

2. 顯式等待

針對(duì)特定元素的等待,更靈活,需結(jié)合WebDriverWaitexpected_conditions(預(yù)期條件)。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待搜索結(jié)果加載(最多10秒,每0.5秒檢查一次)
# 條件:id為"content_left"的元素可見
result = WebDriverWait(driver, 10, 0.5).until(
    EC.visibility_of_element_located((By.ID, "content_left"))
)
print("搜索結(jié)果已加載")

常用預(yù)期條件

  • visibility_of_element_located:元素可見。
  • element_to_be_clickable:元素可點(diǎn)擊。
  • text_to_be_present_in_element:元素包含指定文本。

3. 強(qiáng)制等待

直接暫停程序,不推薦(硬編碼等待時(shí)間,效率低):

import time
time.sleep(3)  # 強(qiáng)制等待3秒

五、瀏覽器操作

1. 窗口操作

# 設(shè)置窗口大?。ㄗ畲蠡?指定尺寸)
driver.maximize_window()  # 最大化
driver.set_window_size(1200, 800)  # 寬1200,高800

# 獲取窗口句柄(唯一標(biāo)識(shí))
current_window = driver.current_window_handle  # 當(dāng)前窗口
all_windows = driver.window_handles  # 所有窗口

# 切換窗口(如點(diǎn)擊鏈接打開新窗口后切換)
driver.find_element(By.LINK_TEXT, "新聞").click()  # 打開新窗口
for window in all_windows:
    if window != current_window:
        driver.switch_to.window(window)  # 切換到新窗口

2. 導(dǎo)航操作

driver.get("https://www.baidu.com")
driver.get("https://www.bing.com")  # 訪問必應(yīng)
driver.back()  # 后退到百度
driver.forward()  # 前進(jìn)到必應(yīng)
driver.refresh()  # 刷新頁(yè)面

3. 處理iframe

iframe是嵌套在網(wǎng)頁(yè)中的子頁(yè)面(如登錄框、廣告),需先切換到iframe才能操作內(nèi)部元素。

# 切換到iframe(通過id、name、索引或WebElement)
driver.switch_to.frame("iframe_id")  # 通過id
# driver.switch_to.frame(0)  # 通過索引(第1個(gè)iframe)

# 操作iframe內(nèi)的元素(如輸入用戶名)
driver.find_element(By.ID, "username").send_keys("test")

# 切回主文檔(必須!否則無法操作主頁(yè)面元素)
driver.switch_to.default_content()

六、彈窗處理

網(wǎng)頁(yè)彈窗(Alert、Confirm、Prompt)需通過switch_to.alert處理:

彈窗類型說明操作方法
Alert只有“確定”按鈕alert.accept()(確認(rèn))
Confirm有“確定”和“取消”按鈕alert.accept()(確認(rèn))/ alert.dismiss()(取消)
Prompt可輸入文本的彈窗alert.send_keys("文本") + alert.accept()

示例

# 觸發(fā)彈窗(假設(shè)點(diǎn)擊按鈕后彈出Confirm)
driver.find_element(By.ID, "show_confirm").click()

# 切換到彈窗
alert = driver.switch_to.alert
print("彈窗文本:", alert.text)  # 獲取彈窗文本

# 取消彈窗
alert.dismiss()

七、文件操作

1. 文件上傳

通過定位<input type="file">元素,使用send_keys傳入文件路徑(無需點(diǎn)擊上傳按鈕):

# 定位上傳按鈕(必須是input標(biāo)簽)
upload_btn = driver.find_element(By.ID, "upload")
# 傳入文件絕對(duì)路徑
upload_btn.send_keys("C:/test.txt")

2. 文件下載

需配置瀏覽器默認(rèn)下載路徑(以Chrome為例):

from selenium.webdriver.chrome.options import Options

# 配置Chrome下載路徑
chrome_options = Options()
prefs = {
    "download.default_directory": "C:/downloads",  # 下載路徑
    "download.prompt_for_download": False  # 不彈出下載提示
}
chrome_options.add_experimental_option("prefs", prefs)

# 啟動(dòng)配置后的Chrome
driver = webdriver.Chrome(options=chrome_options)
# 點(diǎn)擊下載鏈接
driver.find_element(By.LINK_TEXT, "下載文件").click()

八、鍵盤與鼠標(biāo)操作

需使用ActionChains類模擬鍵盤和鼠標(biāo)動(dòng)作。

1. 鍵盤操作

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

# 定位搜索框
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium")

# 全選(Ctrl+A)→ 復(fù)制(Ctrl+C)→ 清空 → 粘貼(Ctrl+V)
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()
search_box.clear()
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()

2. 鼠標(biāo)操作

# 定位元素
element = driver.find_element(By.ID, "xxx")

# 右鍵點(diǎn)擊
ActionChains(driver).context_click(element).perform()

# 雙擊
ActionChains(driver).double_click(element).perform()

# 拖拽(從元素A拖到元素B)
source = driver.find_element(By.ID, "source")
target = driver.find_element(By.ID, "target")
ActionChains(driver).drag_and_drop(source, target).perform()

九、測(cè)試框架集成

Selenium常與Python測(cè)試框架(如unittest、pytest)結(jié)合,實(shí)現(xiàn)用例管理和報(bào)告生成。

1. 與unittest結(jié)合

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestBaidu(unittest.TestCase):
    def setUp(self):
        # 前置操作:?jiǎn)?dòng)瀏覽器
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com")

    def test_search(self):
        # 測(cè)試用例:搜索
        self.driver.find_element(By.ID, "kw").send_keys("unittest")
        self.driver.find_element(By.ID, "su").click()
        # 斷言:頁(yè)面標(biāo)題包含"unittest"
        self.assertIn("unittest", self.driver.title)

    def tearDown(self):
        # 后置操作:關(guān)閉瀏覽器
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()

2. 生成測(cè)試報(bào)告

使用HTMLTestRunner生成HTML報(bào)告:

pip install html-testRunner
import HtmlTestRunner

# 運(yùn)行用例并生成報(bào)告
if __name__ == "__main__":
    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(
        output="report",  # 報(bào)告目錄
        report_name="百度搜索測(cè)試報(bào)告"
    ))

十、高級(jí)技巧與最佳實(shí)踐

封裝公共方法:將常用操作(如打開網(wǎng)頁(yè)、定位元素)封裝為工具類,減少重復(fù)代碼。

class BrowserUtils:
    def __init__(self, driver):
        self.driver = driver
    
    def open_url(self, url):
        self.driver.get(url)
    
    def find_element(self, by, value):
        return self.driver.find_element(by, value)

處理動(dòng)態(tài)元素:動(dòng)態(tài)ID(如包含時(shí)間戳)可通過XPath模糊匹配://div[contains(@id, "dynamic_")]

避免硬編碼:將URL、賬號(hào)密碼等配置存入config.ini,通過configparser讀取。

Selenium Grid:分布式執(zhí)行用例,需啟動(dòng)Hub和Node:

# 啟動(dòng)Hub(端口4444)
java -jar selenium-server-4.xx.xx.jar hub
# 啟動(dòng)Node(連接Hub)
java -jar selenium-server-4.xx.xx.jar node --hub http://localhost:4444/grid/register

十一、常見問題與解決方案

問題可能原因解決方案
元素定位不到元素在iframe內(nèi);未加載完成;動(dòng)態(tài)ID切換iframe;增加等待;使用模糊定位
瀏覽器自動(dòng)關(guān)閉代碼執(zhí)行完畢;驅(qū)動(dòng)與瀏覽器版本不匹配檢查代碼是否有quit();更新驅(qū)動(dòng)版本
彈窗切換失敗彈窗未加載;非Alert類型彈窗增加等待;通過元素定位處理非Alert彈窗

通過以上內(nèi)容,可系統(tǒng)掌握Selenium的核心用法。實(shí)際使用中需結(jié)合具體場(chǎng)景靈活調(diào)整,多練習(xí)元素定位和等待機(jī)制是關(guān)鍵!

到此這篇關(guān)于從零開始學(xué)習(xí)Python Selenium瀏覽器元素定位與實(shí)戰(zhàn)技巧的文章就介紹到這了,更多相關(guān)Python Selenium教程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python?PyQt5中窗口數(shù)據(jù)傳遞的示例詳解

    Python?PyQt5中窗口數(shù)據(jù)傳遞的示例詳解

    開發(fā)應(yīng)用程序時(shí),若只有一個(gè)窗口則只需關(guān)心這個(gè)窗口里面的各控件之間如何傳遞數(shù)據(jù)。如果程序有多個(gè)窗口,就要關(guān)心不同的窗口之間是如何傳遞數(shù)據(jù)。本文介紹了PyQt5中三種窗口數(shù)據(jù)傳遞,需要的可以了解一下
    2022-12-12
  • Django基于Token的驗(yàn)證使用的實(shí)現(xiàn)

    Django基于Token的驗(yàn)證使用的實(shí)現(xiàn)

    本文主要介紹了Django基于Token的驗(yàn)證使用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 解決python3 安裝不了PIL的問題

    解決python3 安裝不了PIL的問題

    今天小編就為大家分享一篇解決python3 安裝不了PIL的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python 借助numpy保存數(shù)據(jù)為csv格式的實(shí)現(xiàn)方法

    python 借助numpy保存數(shù)據(jù)為csv格式的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python 借助numpy保存數(shù)據(jù)為csv格式的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python代碼調(diào)試技巧教程詳解

    Python代碼調(diào)試技巧教程詳解

    這篇文章主要為大家介紹了Python代碼的一些方便快捷的調(diào)試技巧,文中含有詳細(xì)新的步驟操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python Pygame實(shí)戰(zhàn)之打地鼠小游戲

    Python Pygame實(shí)戰(zhàn)之打地鼠小游戲

    Pygame庫(kù)是專門為了幫助做出的游戲和其他多媒體應(yīng)用Python編程語(yǔ)言的一個(gè)開放源代碼模塊。本文將利用Pygame模塊制作一個(gè)打地鼠的小游戲,快跟隨小編一起學(xué)習(xí)一下吧
    2022-01-01
  • python 30行代碼實(shí)現(xiàn)螞蟻森林自動(dòng)偷能量

    python 30行代碼實(shí)現(xiàn)螞蟻森林自動(dòng)偷能量

    這篇文章主要介紹了python 30行代碼實(shí)現(xiàn)螞蟻森林自動(dòng)偷能量的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作

    Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作

    這篇文章主要介紹了Python Spyder 調(diào)出縮進(jìn)對(duì)齊線的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本

    Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)利用163郵箱遠(yuǎn)程關(guān)電腦腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 一文搞懂python 中的迭代器和生成器

    一文搞懂python 中的迭代器和生成器

    這篇文章主要介紹了python 中的迭代器和生成器簡(jiǎn)單介紹,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論

沽源县| 宁阳县| 通山县| 延寿县| 都江堰市| 中方县| 徐水县| 临夏县| 秦安县| 平谷区| 和龙市| 雅安市| 大荔县| 南开区| 奇台县| 姚安县| 焦作市| 无为县| 象山县| 固阳县| 敦煌市| 湛江市| 衡东县| 四子王旗| 黎城县| 福贡县| 陇川县| 衡阳市| 喀喇沁旗| 兴仁县| 光山县| 娱乐| 织金县| 三门县| 体育| 丰顺县| 汉阴县| 孟州市| 元谋县| 霍林郭勒市| 江西省|