selenium(WEB自動化工具)

定義解釋

Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試應用程序看是否能夠很好地工作在不同瀏覽器和操作系統之上。測試系統功能——創建回歸測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成.Net、Java、Perl等不同語言的測試腳本。

selenium 運行效果

chrome 瀏覽器的運行效果

安裝好 selenium 模塊后,運行下面代碼

from selenium import webdriver
driver = webdriver.Chrome()
#向一個url發起請求
driver.get("http://www.python.org")
#打印頁面標題
print(driver.title)
#退出模擬器   不退出會殘留進程
driver.quit()

在這里插入圖片描述

在這里插入圖片描述

selenium的作用和工作原理

利用瀏覽器原生的 API,封裝成一套更加面向對象的 Selenium web Driver API,直接操作瀏覽器頁面里的元素,甚至操作瀏覽器本生(截屏、窗口大小、關閉、安裝插件、配置證書等)

在這里插入圖片描述

selenium 的簡單使用

from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
#控制瀏覽器訪問url地址
driver.get("http://www.baidu.com")
#在百度中搜索python
driver.find_element(By.ID, "kw").send_keys("python")
#點擊百度搜索
driver.find_element(By.ID, "su").click()
print(driver.current_url)
#退出瀏覽器
driver.quit()

運行打印出當前 url:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&fenlei=256&rsv_pq=0xe86c7938000744b9&rsv_t=2ebfD821B8kkLpalpk%2B8V8BJXURm5E5QmGKnhK5amkSt2VBud92sYJFn9Xkt&rqlang=en&rsv_enter=0&rsv_dl=tb&rsv_sug3=6&rsv_sug1=1&rsv_sug7=100&rsv_btype=i&inputT=422&rsv_sug4=422

webdriver.Chrome(executable_path=‘./chromedriver’)中executable參數指定的是下載好的chromedriver文件的路徑

driver.find_element(By.ID, “kw”).send_keys(“python”)定位id屬性值是’kw’的標簽,并向其中輸入字符串’python’

driver.find_element(By.ID, “su”).click()定位id屬性值是su的標簽,并點擊

click函數作用是:觸發標簽的js的click事件

selenium 提取數據

driver 對象的常用屬性和方法
  1. driver.page_source 當前標簽頁瀏覽器渲染之后的網頁源代碼
  2. driver.current_url 當前標簽頁的url
  3. driver.close() 關閉當前標簽頁,如果只有一個標簽頁則關閉整個瀏覽器
  4. driver.quit() 關閉瀏覽器
  5. driver.forward() 頁面前進
  6. driver.back() 頁面后退
  7. driver.screen_shot(img_name) 頁面截圖
driver對象定位標簽元素獲取標簽對象的方法
  1. find_element(By.TAG_NAME, “tag_name”) 通過元素的標簽名定位(如
    、 等)
  2. find_element(By.CSS_SELECTOR, “css_selector”) 通過 CSS 選擇器定位元素
  3. find_element(By.NAME, “name_value”) 通過元素的 name 屬性定位
  4. find_element(By.CLASS_NAME, “class_name”) 通過元素的 class 屬性定位
  5. find_element(By.TAG_NAME, “tag_name”) 通過元素的標簽名定位(如
    、 等)
  6. find_element(By.XPATH, “xpath_expression”) 通過 XPath 表達式定位元素
  7. find_element(By.LINK_TEXT, “link_text”) 通過鏈接的文本內容定位(適用于 標簽)
  8. find_element(By.PARTIAL_LINK_TEXT, “partial_link_text”) 通過鏈接的部分文本內容定位

注意:

  • find_element和find_elements的區別:
    • 多了個s就返回列表,沒有s就返回匹配到的第一個標簽對象
    • find_element匹配不到就拋出異常,find_elements匹配不到就返回空列表
  • by_link_text和by_partial_link_tex的區別:全部文本和包含某個文本
  • 以上函數的使用方法
    • driver.find_element_by_id(‘id_str’)
標簽對象提取文本內容和屬性值

在這里插入圖片描述在這里插入圖片描述

selenium 鼠標和鍵盤操作

鼠標操作

在這里插入圖片描述

鍵盤操作

#### 常用鍵盤鍵值
在這里插入圖片描述

selenium 的其他使用方法

selenium 標簽頁的切換

當 selenium 控制瀏覽器打開多個標簽頁時,如何控制瀏覽器在多個標簽頁之間進行切換?分兩步處理

  • 獲取所有標簽頁的窗口權柄
  • 利用窗口權柄字切換到權柄指向標簽頁對象的標識
    • 這里的窗口權柄是指:標簽頁對象的標識
#1、獲取當前所有的標簽頁的權柄構成的列表
current_windows = driver.window_handles
#2、根據標簽頁權柄列表索引下標進行切換
driver.switch_to.window(current_windows[0])

測試示例

import time
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("http://www.baidu.com")time.sleep(1)
driver.find_element(By.ID, "kw").send_keys("python")
time.sleep(1)
driver.find_element(By.ID, "su").click()
time.sleep(1)#通過執行js來新開一個標簽頁
js = 'window.open("http://www.sougou.com");'
driver.execute_script(js)
time.sleep(1)#獲取當前全部窗口
current_windows = driver.window_handles
time.sleep(2)#根據窗口索引進行切換
driver.switch_to.window(current_windows[0])
time.sleep(2)
driver.switch_to.window(current_windows[1])time.sleep(6)
driver.quit()
switch_to 切換 frame 標簽

iframe 是嵌入在網頁中的另一個網頁。Selenium 提供了 <font style="color:rgb(51, 51, 51);background-color:rgb(250, 252, 253);">switch_to.frame()</font> 方法來切換到 iframe。

import time
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
url = 'https://wx.mail.qq.com/?cancel_login=true&from=get_ticket_fail'
driver.get(url)login_frame = driver.find_element(By.ID,'iframe_wx')
driver.switch_to.frame(login_frame)
print(driver.title)
"""操作frame外邊的元素需要切換出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])content = driver.find_element(By.CLASS_NAME,'login_pictures_title').text
print(content)driver.quit()
  • 總結:
    • 切換到定位的frame標簽嵌套的頁面中
      • driver.switch_to.frame(通過find_element_by函數定位的frame、iframe標簽對象)
    • 利用切換標簽頁的方式切出frame標簽

windows = driver.window_handles

driver.switch_to.window(windows[0])

selnium 對 cookie 的處理

Selenium 提供了get_cookies()、add_cookie()、delete_cookie()等方法來操作瀏覽器的 Cookies。

獲取 cookie

driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,還有domain等cookie其他維度的信息。所以如果想要把獲取的cookie信息和requests模塊配合使用的話,需要轉換為name、value作為鍵值對的cookie字典

#獲取當前標簽頁的全部cookie信息
print(driver.get_cookies())
#把cookie轉化為字典
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
添加 cookie
# 添加 Cookie
driver.add_cookie({"name": "test", "value": "123"})# 獲取所有 Cookies
cookies = driver.get_cookies()
刪除 cookie
#刪除一條cookie
driver.delete_cookie("CookieName")# 刪除所有的cookie
driver.delete_all_cookies()
執行 js 代碼

Selenium 提供了 `execute_script()方法來執行 JavaScript 代碼。

import time
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://www.python.org")
time.sleep(1)js = 'window.scrollTo(0, document.body.scrollHeight);'
driver.execute_script(js)time.sleep(5)
driver.quit()
頁面等待

在 Selenium 中,等待機制是確保頁面元素加載完成后再進行操作的關鍵。

由于網頁加載速度受網絡、服務器性能等因素影響,直接操作未加載完成的元素會導致腳本失敗。

Selenium 提供了多種等待機制來解決這一問題。

  1. 隱式等待
  2. 顯示等待
  3. 固定等待
  4. fluent wait
隱式等待

隱式等待是一種全局性的等待機制,它會在查找元素時等待一定的時間。如果在指定的時間內找到了元素,Selenium 會立即繼續執行后續操作;如果超時仍未找到元素,則會拋出 NoSuchElementException異常。

import time
from selenium import webdriverdriver = webdriver.Chrome()
#設置隱式等待時間為10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
  • 優點:
    • 簡單易用,只需設置一次即可應用于所有元素的查找操作
    • 適用于大多數簡單的場景
  • 缺點:
    • 全局性等待,可能會導致不必要的等待時間
    • 無法處理某些負責的等待條件,例如等待元素變為可點擊狀態。
顯示等待

顯式等待是一種更為靈活的等待機制,它允許你為特定的操作設置等待條件。顯式等待通常與WebDriverWait類和expected_conditions模塊一起使用。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#設置顯示等待,最多等待10秒,直到元素出現
element = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located(By.TAG_NAME,'a'))
driver.quit()
常用的 expected_conditions

expected_conditions 模塊提供了多種預定義的等待條件,以下是一些常用的條件:

presence_of_element_located:等待元素出現在 DOM 中。
visibility_of_element_located:等待元素出現在 DOM 中并且可見。
element_to_be_clickable:等待元素可點擊。
text_to_be_present_in_element:等待元素的文本包含指定的文本。

優點:

  • 靈活性高,可以為不同的操作設置不同的等待條件。
  • 可以處理復雜的等待場景。

缺點:

  • 代碼相對復雜,需要更多的代碼量。
  • 需要為每個操作單獨設置等待條件。
固定等待

固定等待是一種最簡單的等待機制,它通過time.sleep()方法讓腳本暫停執行指定的時間。無論頁面是否加載完成,腳本都會等待指定的時間后再繼續執行。

import time
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#固定等待5秒
time.sleep(5)
print(driver.title)
driver.quit()

優點:

  • 簡單易用,適用于簡單的測試場景。

缺點:

  • 效率低下,可能會導致不必要的等待時間。
  • 無法根據頁面加載情況動態調整等待時間。
Fluent Wait

作用:動態設置等待條件,可以自定義輪詢頻率和忽略特定異常。

方法:WebDriverWait 結合 polling_every 和 ignoring

特點:更靈活,適用于需要動態調整等待時間的場景。

import time
from selenium import webdriver
from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#設置fluent wait
wait = WebDriverWait(driver, timeout=10,poll_frequency=1,ignored_exceptions=[TimeoutException]).until(expected_conditions.presence_of_element_located(By.ID, "username")
)
driver.quit()
總結
  • 隱式等待:適用于簡單的場景,全局性等待,但可能會導致不必要的等待時間。
  • 顯式等待:適用于復雜的場景,靈活性高,但代碼相對復雜。
  • 固定等待:簡單易用,但效率低下,不推薦在復雜的測試場景中使用。
  • Fluent Wait::適用于需要動態調整等待時間的場景。
selenium 開啟無界面模式

絕大多數服務器是沒有界面的,selenium控制谷歌瀏覽器也是存在無界面模式的。

  • 開啟無界面模式的方法
    • 實例化配置對象
      • options = webdriver.ChromeOptions()
    • 配置對象添加開啟無界面模式的命令
      • options.add_argument("--headless")
    • 配置對象添加禁用gpu的命令
      • options.add_argument("--disable-gpu")
    • 實例化帶有配置對象的driver對象
      • driver = webdriver.Chrome(chrome_options=options)
import time
from selenium import webdriver
options = webdriver.ChromeOptions()  #創建一個配置對象
options.add_argument('--headless')   #開啟無界面模式
options.add_argument('--disable-gpu') # 禁用gpu
# options.set_headles() # 無界面模式的另外一種開啟方式
driver = webdriver.Chrome(options) #實例化帶有配置的driver對象
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
selenium 使用代理 IP

selenium控制瀏覽器也是可以使用代理ip的!

  • 使用代理ip的方法
    • 實例化配置對象
      • options = webdriver.ChromeOptions()
    • 配置對象添加使用代理ip的命令
      • options.add_argument('--proxy-server=http://202.20.16.82:9527')
    • 實例化帶有配置對象的driver對象
      • driver = webdriver.Chrome('./chromedriver', chrome_options=options)
import time
from selenium import webdriver
options = webdriver.ChromeOptions()  #創建一個配置對象
options.add_argument('--proxy-server=http://172.16.31.10:3128')   #使用待遇ip
driver = webdriver.Chrome(options) #實例化帶有配置的driver對象
driver.get("http://www.baidu.com")
print(driver.title)
driver.quit()
selenium 替換 user-agent

selenium控制谷歌瀏覽器時,User-Agent默認是谷歌瀏覽器的,但是這個值是可以修改的。

  • 替換user-agent的方法
    • 實例化配置對象
      • options = webdriver.ChromeOptions()
    • 配置對象添加替換UA的命令
      • options.add_argument('--user-agent=Mozilla/5.0 HAHA')
    • 實例化帶有配置對象的driver對象
      • driver = webdriver.Chrome('./chromedriver', chrome_options=options)
import time
from selenium import webdriver
options = webdriver.ChromeOptions()  #創建一個配置對象
options.add_argument('--user-agent=Mozilla/5.0')   #替換User-agent
driver = webdriver.Chrome(options) #實例化帶有配置的driver對象
driver.get("http://www.itcast.cn")
print(driver.title)
driver.quit()

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

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

相關文章

windows本地使用conda部署Open-webui

前提條件 Open-webui使用python3.11.9 步驟 conda操作也可以參考 安裝python torch、transformer、記錄 1、conda環境 # 創建環境 conda create --name openwebui python3.11.9# 激活環境 conda activate openwebui# 升級pip版本 pip install --upgrade pip# pip安裝openwe…

【Unity筆記04】數據持久化

&#x1f31f; 方案核心思想遵循以下設計原則&#xff1a;數據安全第一&#xff1a;絕不使用明文存儲&#xff0c;采用AES加密算法保護數據。性能優化&#xff1a;使用異步I/O操作&#xff0c;避免阻塞主線程導致游戲卡頓。結構清晰&#xff1a;模塊化設計&#xff0c;職責分離…

深入理解 HTML5 Web Workers:提升網頁性能的關鍵技術解析

深入理解 HTML5 Web Workers&#xff1a;提升網頁性能的關鍵技術解析引言1. 什么是 Web Workers&#xff1f;Web Workers 的特點&#xff1a;2. Web Workers 的使用方式2.1 創建一個 Web Worker步驟 1&#xff1a;創建 Worker 文件步驟 2&#xff1a;在主線程中調用 Worker3. W…

會議室預定系統核心技術:如何用一行SQL解決時間沖突檢測難題

文章目錄 一、為什么時間沖突檢測是預定系統的核心挑戰? 二、黃金法則:兩行線段重疊檢測法 三、四大沖突場景實戰解析(同一會議室) 四、生產環境完整解決方案 1. 基礎沖突檢測函數 2. 預定API處理流程 3. 高級邊界處理技巧 五、性能優化關鍵策略 六、不同數據庫的適配方案 …

13.正則表達式:文本處理的瑞士軍刀

正則表達式&#xff1a;文本處理的瑞士軍刀 &#x1f3af; 前言&#xff1a;當文本遇上神奇的密碼 想象一下&#xff0c;你是一個圖書管理員&#xff0c;面對著一堆亂七八糟的書籍信息&#xff1a; “聯系電話&#xff1a;138-1234-5678”“郵箱地址&#xff1a;zhang.sangm…

linux下c語言訪問mysql數據庫

一、連接數據庫基礎1. 頭文件與庫文件連接 MySQL 需包含的頭文件&#xff1a;#include <mysql/mysql.h> // 部分環境也可用 #include <mysql.h> 編譯鏈接時&#xff0c;Linux 平臺需指定庫名&#xff1a;-lmysqlclient &#xff0c;用于鏈接 MySQL 客戶端函數庫。2…

6. 傳輸層協議 UDP

傳輸層負責數據能夠從發送端傳輸接收端.1. 再談端口號端口號(Port)標識了一個主機上進行通信的不同的應用程序在 TCP/IP 協議中, 用 "源 IP", "源端口號", "目的 IP", "目的端口號", "協議號" 這樣一個五元組來標識一個通信…

vue 開發總結:從安裝到第一個交互頁面-與數據庫API

vue 總結 1、安裝vue&#xff1a; WinR 輸入&#xff1a;cnpm install -g vue/cli 驗證是否安裝成功&#xff1a;vue --version 2、新建Vue工程 在對應文件夾下右擊打開集成終端 輸入 vue create query_system&#xff08;新建項目名字&#xff09;名稱不能存在大寫&#x…

運維筆記:HTTP 性能優化

一、HTTP 協議特性與性能瓶頸1.1 HTTP 協議發展歷程HTTP 協議的演進直接影響著 Web 性能&#xff0c;各版本關鍵特性對比&#xff1a;協議版本發布時間核心特性性能優勢局限性HTTP/1.01996 年無狀態、短連接簡單易實現每次請求需建立 TCP 連接HTTP/1.11999 年長連接、管道化減少…

ubuntu:運行gcfsd-admin守護進程需要認證,解決方法

這里有個鎖子&#xff0c;每次進入都要輸入密碼&#xff0c;怎么解決&#xff1f; 重新掛載 /data 磁盤 sudo umount /data sudo ntfsfix /dev/sda1 sudo mount -o rw /dev/sda1 /data

1.DRF 環境安裝與配置

文章目錄一. Django Rest_Framework二、環境安裝與配置2.1 安裝 DRF2.2 創建Django項目2.3 添加 rest_framework 應用三、啟動項目一. Django Rest_Framework 核心思想&#xff1a;大量縮減編寫 api 接口的代碼 Django REST framework 是一個建立在 Django 基礎之上的 Web 應…

設計模式(十九)行為型:備忘錄模式詳解

設計模式&#xff08;十九&#xff09;行為型&#xff1a;備忘錄模式詳解備忘錄模式&#xff08;Memento Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于在不破壞封裝性的前提下&#xff0c;捕獲并外部化一個對象的內部狀態&#xff0c…

Qt/C++開發監控GB28181系統/錄像回放/切換播放進度立即跳轉/支持8倍速播放/倍速和跳轉進度無縫切換

一、前言說明 在國標監控系統中&#xff0c;錄像回放過程中&#xff0c;需要切換播放進度&#xff0c;對比過很過國標系統&#xff0c;絕大部分尤其是網頁版的監控系統&#xff0c;在切換進度過程中都會黑屏&#xff0c;這個體驗就很不友好了&#xff0c;明明gb28181協議中就有…

【11】大恒相機SDK C++開發 ——原圖像數據IFrameData內存中上下顛倒,怎么裁剪ROI 實時顯示在pictureBox中

文章目錄3 當內存中的 圖像數據是垂直翻轉的時候怎么截取ROI 并顯示3.1 對ROI在原圖中的位置做轉換3.2 將ROI的最后一行當做開始位置&#xff0c;從底部向上復制數據3.3 完整代碼3.4 圖像數據在內存中上下顛倒的情況3.5 調用驗證4 unsafe代碼 解釋及注意事項 看我另一篇文章5 C…

小架構step系列29:校驗注解的組合

1 概述如果遇到某些屬性需要多種校驗&#xff0c;比如需要非空、符合某正則表達式、長度不能超過某值等&#xff0c;如果這種屬性只有有限幾個&#xff0c;那么手工把對應的校驗注解都加上即可。但如果這種屬性比較多&#xff0c;那么重復加這些校驗注解&#xff0c;也是一種代…

網絡基礎19:OSPF多區域實驗

一、拓撲結構1. 網絡拓撲&#xff1a;骨干區域&#xff08;Area 0&#xff09;&#xff1a;連接核心設備&#xff08;AR1、AR2、AR3、AR4、AR5、AR6&#xff09;。非骨干區域&#xff1a;Area 1&#xff1a;AR5 ? AR9Area 2&#xff1a;AR5 ? AR10Area 3&#xff1a;AR6 ? A…

goland編寫go語言導入自定義包出現: package xxx is not in GOROOT (/xxx/xxx) 的解決方案

問題 寫了個自定義的包 calc.go&#xff0c;在路徑 $GOPATH/go_project/src/demo_51_package/com/目錄下&#xff0c;其中main.go 是main方法的入口代碼 main.go 代碼如下 package main import "demo_51_package/com" func main() {add : calc.Add(1, 2)println(add)…

HLS視頻切片音頻中斷問題分析與解決方案

HLS視頻切片音頻中斷問題分析與解決方案 問題背景 在使用FFmpeg進行HLS視頻切片并通過hls.js前端播放時&#xff0c;開發者經常遇到一個典型問題&#xff1a;第一個視頻切片播放正常且有聲音&#xff0c;但后續切片卻突然失去音頻。這種現象在直播和點播場景中均有出現&#xf…

【Linux網絡編程】網絡層協議 - IP

目錄 背景補充 協議頭格式 IP報文的分片與組裝 網段劃分 網段劃分是什么&#xff1f;為什么要進行網段劃分&#xff1f; 怎么進行網段劃分&#xff1f; 路由 路由表生成算法 背景補充 假設現在主機B要給主機C發送消息。在我們前面的學習中&#xff0c;一直都是將數據拷…

從“救火”到“先知”:潤建曲尺運維大模型如何重構網絡運維價值鏈

“7月18號&#xff0c;北京&#xff0c;晴&#xff0c;最高溫度38攝氏度。”天氣預報緩緩播報&#xff0c;商場、地鐵、辦公樓無不歌頌著威利斯開利的貢獻&#xff0c;但這份涼爽的背后&#xff0c;離不開 “電” 的無聲托舉。5G毫秒級下載、絲滑的移動支付、智能電表、智能家居…