Selenium介紹及基本使用方法

Selenium是一個開源、免費、簡單、靈活,對Web瀏覽器支持良好的自動化測試工具,在UI自動化、爬蟲等場景下是十分實用的,能夠熟練掌握并使用Selenium工具可以大大的提高效率。

Selenium簡介

Selenium支持多平臺、多瀏覽器、多語言去實現自動化測試,是一個開源和可移植的Web測試框架,支持并行測試執行,從而減少了時間并提高了測試效率。利用它,我們可以編寫相關的自動化程序,讓程序完全像人一樣在瀏覽器里面操作Web界面,比如模擬鼠標點擊、模擬鍵盤輸入等等。不但能夠操作Web界面,還能從Web中獲取信息,并且相對來說,使用Selenium來獲取信息更加簡單,它的基本原理是我們編寫自動化程序之后利用瀏覽器驅動直接對瀏覽器進行操作,只要我們用戶能在瀏覽器上獲得的信息使用Selenium都可以獲得。

環境準備

下載瀏覽器驅動,注意驅動版本與瀏覽器版本要一致

將瀏覽器驅動路徑添加到環境變量path中

安裝Selenium包pip install selenium

快速入門

使用selenium實現控制瀏覽器打開百度首頁,搜索Alipay。

from selenium import webdriver # 導入webdriver
import time
driver = webdriver.Chrome() # 獲取瀏覽器驅動
driver.get(" http://www.baidu.com") # 打開百度首頁
input_box = driver.find_element_by_id('kw') # 獲取首頁輸入框元素
input_box.send_keys('Alipay') # 向輸入框中輸入內容
search_button = driver.find_element_by_id('su') # 獲取首頁搜索按鈕元素
search_button.click() # 點擊搜索按鈕
time.sleep(5)
driver.quit() # 關閉驅動

Selenium-API操作【文末免費分享Selenium自動化測試學習資源】

元素等待

顯示等待

設置一個超時時間,每過一段時間就去檢測一次該元素是否存在,如果存在則執行后續內容,如果超過最大時間(超時時間)則拋出超時異常(TimeoutException)。顯示等待需要使用 WebDriverWait,同時配合 until 或 not until 。

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('Http://www.baidu.com')

# 每隔0.5秒檢測一次元素存不存在,5秒內沒找到拋出異常

element = WebDriverWait(driver, 5, 0.5).until(

expected_conditions.presence_of_element_located((By.ID, 'kd')), message='元素未找到')

隱式等待

隱式等待也是指定一個超時時間,如果超出這個時間指定元素還沒有被加載出來,就會拋出 NoSuchElementException 異常。除了拋出的異常不同外,還有一點,隱式等待是全局性的,即運行過程中,如果元素可以定位到,它不會影響代碼運行,但如果定位不到,則它會以輪詢的方式不斷地訪問元素直到元素被找到,若超過指定時間,則拋出異常。使用 implicitly_wait() 來實現隱式等待,使用難度相對于顯式等待要簡單很多。

driver.implicitly_wait(5)

強制等待

使用 time.sleep() 強制等待,設置固定的休眠時間,等待元素加載,對于代碼的運行效率會有影響。

元素定位

Selenium提供了8種基本元素定位的方法,分別是id,name,class name,tag name,link text,partial link text,xpath,css selector,其中id,name,class name,tag name是根據元素的標簽或元素的屬性來進行定位;link text,partial link text是根據超鏈接的文本來進行定位;xpath為元素路徑定位;css為選擇器定位(樣式定位)。

element = driver.find_element_by_id('kw') # 通過id屬性獲取元素

element = driver.find_element_by_name('wd') # 通過name屬性獲取元素

element = driver.find_element_by_class_name('input') # 通過class屬性獲取元素

element = driver.find_element_by_tag_name('input') # 通過標簽名獲取元素

element = driver.find_element_by_link_text('視頻') # 通過鏈接文本值獲取元素

element = driver.find_element_by_partial_link_text('視')# 通過部分鏈接文本值獲取元素

element = driver.find_element_by_xpath("//*[@id='kw']") # 通過Xpath獲取元素

element = driver.find_element_by_css_selector('#kw') # 通過CSS選擇器獲取元素

元素操作

定位到元素獲取到元素對象之后,就可以對元素進行我們想要的操作了,Selenium提供了許多API供我們操作元素,常用的操作有點擊、輸入、清除、獲取元素坐標值、獲取元素寬高值、元素屬性值、檢查元素是否被選中。

elemnet.click() # 點擊元素

element.send_keys('武漢') # 輸入內容

element.clear() # 清除內容

element.location.get('x') # 獲取元素左上角X軸坐標

element.location.get('y') # 獲取元素左上角Y軸坐標

element.size.get('width') # 獲取元素寬度

element.size.get('height') # 獲取元素高度

element.is_selected() # 元素是否被選中

鼠標操作

常見的鼠標操作有:點擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標操作Selenium都封裝了相應的操作方法

在Selenium中將操作鼠標的方法封裝在ActionChains類中,在ActionChains類中所有提供的鼠標事件方法,在調用的時候所有的行為都存儲在ActionChains對象中,而perform()方法就是真正去執行所有的鼠標事件。

from selenium.webdriver.common.action_chains import ActionChains # 導包

actionChains = ActionChains(driver) # 實例化ActionChains對象

actionChains.move_to_element(element).perform() # 鼠標懸停

actionChains.drag_and_drop(elementA, elementB).perform() # 鼠標拖拽

actionChains.context_click(element).perform() # 鼠標右擊

actionChains.double_click(element).perform() # 鼠標雙擊

鍵盤操作

Selenium中把鍵盤的按鍵都封裝在Keys類中, 模擬鍵盤上一些按鍵或者組合鍵的輸入,使用send_Keys+http://Keys.XXX實現鍵盤上的組合按鍵如:Ctrl+C 、Ctrl+V。

from selenium.webdriver.common.keys import Keys # 導包

element.send_keys(Keys.BACK_SPACE) # 模擬按下退格鍵

element.send_keys(Keys.CONTROL, 'a') # 模擬按下Ctrl+A

element.send_keys(Keys.CONTROL, 'x') # 模擬按下Ctrl+X

element.send_keys(Keys.CONTROL, 'v') # 模擬按下Ctrl+V

瀏覽器操作

selenium同樣提供了相應的API用于針對瀏覽器的操作,常用的有最大化瀏覽器窗口,設置瀏覽器窗口大小,設置瀏覽器的位置,控制瀏覽器前進后退,頁面刷新。

driver.maximize_window() # 瀏覽器窗口最大化

driver.set_window_size(800, 800) # 瀏覽器窗口寬800 高800

driver.set_window_rect(300, 0) # 瀏覽器位置(300,0)

driver.back() # 瀏覽器后退

driver.forward() # 瀏覽器前進

driver.refresh() # 刷新頁面

其他操作

標簽頁

driver.get_screenshot_as_file('./baidu.png') # 頁面截圖

driver.close() # 關閉當前標簽頁

driver.quit() # 關閉所有標簽頁

在某個頁面點擊鏈接打開了一個新的標簽頁,此時selenium是無法定位到新標簽頁的元素。這就涉及到句柄的概念了,句柄就是標簽頁對象的唯一標識,每個標簽頁都有自己的句柄,可以通過句柄來實現標簽頁的切換,從而定位到對應標簽頁的元素。

handles = driver.window_handles # 獲取所有標簽頁的句柄

driver.switch_to.window(handles[1]) # 切換到指定句柄標簽頁

啟動參數

Chrome Options是一個配置chrome啟動時屬性的類,通過這個參數我們可以為Chrome添加啟動參數

設置 chrome 二進制文件位置 (binary_location)

添加啟動參數 (add_argument)

添加擴展應用 (add_extension, add_encoded_extension)

添加實驗性質的設置參數 (add_experimental_option)

設置調試器地址 (debugger_address)

Chrome Options常用的行為一般有以下幾種:

禁止圖片和視頻的加載:提升網頁加載速度。

添加代理:用于FQ訪問某些頁面,或者應對IP訪問頻率限制的反爬技術。

使用移動頭:訪問移動端的站點,一般這種站點的反爬技術比較薄弱。

添加擴展:像正常使用瀏覽器一樣的功能。

設置編碼:應對中文站,防止亂碼。

阻止JavaScript執行

在UI自動化中打開瀏覽器前可以加入對瀏覽器的選項配置,通過設置不同的參數,可以修改瀏覽器的默認行為。

from selenium import webdriver

options = webdriver.ChromeOptions() # 實例化一個啟動參數對象

options.add_argument('--headless') # 設置瀏覽器瀏覽器不提供可視化頁面

options.add_argument('lang=zh_CN.UTF-8') # 設置編碼

options.add_argument('--disable-infobars') # 禁止策略化

options.add_argument('--no-sandbox') # 解決DevToolsActivePort文件不存在的報錯

options.add_argument('window-size=1920x1080') # 指定瀏覽器分辨率

options.add_argument('--disable-gpu') # 谷歌文檔提到需要加上這個屬性來規避bug

options.add_argument('--incognito') # 隱身模式(無痕模式)

options.add_argument('--disable-javascript') # 禁用javascript

options.add_argument('--start-maximized') # 最大化運行(全屏窗口),不設置,取元素會報錯

options.add_argument('--disable-infobars') # 禁用瀏覽器正在被自動化程序控制的提示

options.add_argument('--hide-scrollbars') # 隱藏滾動條, 應對一些特殊頁面

options.add_argument('blink-settings=imagesEnabled=false') # 不加載圖片, 提升速度

options.add_argument('User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36

') # 設置UA請求頭

driver = webdriver.Chrome(chrome_options=options)

執行JS腳本

有些情況下,selenium提供的API無法完成對應的操作或者操作比較麻煩,此時可以借助JS腳本來實現,例如執行滑動滾動條。

js ='window.scrollTo(0,100)' # 要執行的JS腳本語句

driver.execute_script(js) # 執行JS腳本

Frame切換

通常大多數網站頁面都會使用到frame嵌套,這時即使frame嵌套頁面的內容展示出來了,我們依然無法直接定位到frame里的元素,例如像優酷這種登錄窗口

?此時若想操作frame里的元素,需要先切換到frame里再進行定位。

driver.switch_to.frame('alibaba-login-box') # 且換到指定frame

driver.switch_to.default_content() # 切回默認頁面

隱藏指紋特征

使用slenium啟動的瀏覽器,大多數都會被網站通過一些指紋特征監測到,識別到爬蟲行為,就會拒絕selenium的操作,如何避免這種情況,關鍵點在于如何在瀏覽器檢測之前將這些特征進行隱藏,事實上,前人已經為我們鋪好了路,解決這個問題的關鍵,實際就是一個 stealth.min.js 文件,這個文件是給 puppeteer 用的,在 Python 中使用的話需要單獨執行這個文件,該文件獲取方式需要安裝 node.js ,終端執行 npx extract-stealth-evasions下載該文件,并在操作瀏覽器前加上如下代碼。

with open('stealth.min.js') as f:      js = f.read()  driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {'source': js})

結語

本文只是簡單的介紹了selenium+python的安裝使用,以及一些基礎常用的API操作,還有很多高級操作、用法需要更深入的了解學習。實際運用的話可能還需要與其他框架、工具整合使用,這些都是需要經過更深層次的理解與學習。

Python接口自動化測試零基礎入門到精通(2023最新版)

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

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

相關文章

深入理解強化學習——馬爾可夫決策過程:動作價值函數

分類目錄:《深入理解強化學習》總目錄 不同于馬爾可夫獎勵過程,在馬爾可夫決策過程中,由于動作的存在,我們額外定義一個動作價值函數(Action-value Function)。我們用 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)…

線程提交線程到線程池,有幾種方式,哪一種方式是工作中不能使用的,無法捕捉異常,線程池的拒絕策略,線程池的提交方式

線程池的工作原理 JDK中提交線程到線程池,有幾種方式,哪一種方式是工作中不能使用的,無法捕捉異常 兩種提交任務的方法 ExecutorService 提供了兩種提交任務的方法: execute():提交不需要返回值的任務 submit()&a…

【C語言】多組輸入

C系列文章目錄 目錄 C系列文章目錄 一、什么是多組輸入? 二、如何使用多組輸入 2.1,試題舉例講解 2.2,錯誤解法 2.3,我們實現多組輸入的思路 2.4,第一種正確的解法 2.5,第二種正確的解法 2.6&…

Python入門教程 | Python3 字典(dict)

Python3 字典 字典是另一種可變容器模型,且可存儲任意類型對象。 Python3中的字典是一種無序、可變、可迭代的數據結構,它由鍵(key)和對應的值(value)組成。字典在Python中被視為可變對象,這意…

ES ElasticSearch安裝、可視化工具kibana安裝

1、安裝ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1訪問測試: http://域名:9200/ 2、安裝kibana對es進行可視化操作 執行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

如何實現在公網下使用navicat圖形化工具遠程連接本地內網的MariaDB數據庫

公網遠程連接MariaDB數據庫【cpolar內網穿透】 文章目錄 公網遠程連接MariaDB數據庫【cpolar內網穿透】1. 配置MariaDB數據庫1.1 安裝MariaDB數據庫1.2 測試局域網內遠程連接 2. 內網穿透2.1 創建隧道映射2.2 測試隨機地址公網遠程訪問3. 配置固定TCP端口地址3.1 保留一個固定的…

Redis深入理解-Socket連接建立流程以及文件事件處理機制

Redis Server 運行原理圖 Redis 服務器中 Socket 網絡建立以及文件事件模型 一個 redis 單機,可以抗幾百上千的并發,這里的并發指的就是同時可以有幾百個 client 對這個 redis server 發起請求,都需要去建立網絡連接,同時間可能會…

利用 docker 實現JMeter分布式壓測

為什么需要分布式? 在工作中經常需要對一些關鍵接口做高QPS的壓測,JMeter是由Java 語言開發,沒創建一個線程(虛擬用戶),JVM默認會為每個線程分配1M的堆棧內存空間。受限于單臺試壓機的配置很難實現太高的并…

YAML 深入解析:從語法到最佳實踐

什么是YAML YAML(YAML Ain’t Markup Language)是一種人類可讀的數據序列化語言。它的設計目標是使數據在不同編程語言之間交換和共享變得簡單。YAML采用了一種簡潔、直觀的語法,以易于閱讀和編寫的方式表示數據結構。 YAML廣泛應用于配置文…

【OpenCV實現圖像:制作酷炫的動畫效果】

文章目錄 概要生成背景圖添加點動畫添加文本顯示小結 概要 首先,通過導入必要的庫,包括NumPy用于數學運算和Matplotlib庫用于數據可視化。隨后,創建圖形和軸,初始化點的位置,以及編寫初始化函數和更新函數。 初始化函…

C語言歸并排序

以夢為馬,不負韶華 文章目錄 引入:實現原理問題引出:遞歸實現:迭代實現穩定性分析:總結: 引入: 如何將兩個有序數組(假設為升序)合并為一個有序數組? 雙指針…

yolov5/v7修改標簽和檢測框顯示【最全】

《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考,如果對你們有幫助,希望大家可以給個點贊、收藏鼓勵下,非常感謝! 以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示 修改線條粗細、隱藏標簽、隱…

EI論文故障識別程序:DBN深度置信/信念網絡的故障識別Matlab程序,數據由Excel導入,直接運行!

?適用平臺:Matlab2021b版及以上 本程序參考中文EI期刊《基于變分模態分解和改進灰狼算法優化深度置信網絡的自動轉換開關故障識別》中的深度置信網絡(Deep Belief Network,DBN)部分進行故障識別,程序注釋清晰&#x…

Python之學生信息管理系統

目錄 一、基礎界面實現 1、主函數 2、保持循環,獲取用戶需求 二、函數實現模塊功能 1、添加學生信息 2、刪除學生信息 3、修改學生信息 4、查找全部學生信息 5、退出系統 三、整合代碼 1、 完整代碼 2、完整實現過程 實現 打印功能菜單、添加學生信息、刪…

想自學軟件測試?一般人我還是勸你算了吧。。。

📢專注于分享軟件測試干貨內容,歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!📢交流討論:歡迎加入我們一起學習!📢資源分享:耗時200小時精選的「軟件測試」資…

<keep-alive>作用及用法

<keep-alive>是Vue.js的內置組件。它用于緩存具有相同組件樹的組件。當組件使用<keep-alive>包裹時&#xff0c;組件不會被銷毀&#xff0c;而是會緩存到內存中&#xff0c;等到下次再次渲染時&#xff0c;直接使用緩存中的組件實例。 <keep-alive>有以下幾…

【Linux】共享內存

文章目錄 一、共享內存的原理詳談共享內存的實現過程二、共享內存的接口函數1.shmget2. shmatshmdtshmctl 進程間使用共享內存通信三、共享內存的特性 關于代碼 一、共享內存的原理 共享內存是由操作系統維護和管理的一塊內存。 共享內存的本質是內核級的緩沖區。 一個進程向…

C語言精華題目錦集1

第一題 test.c文件中包括如下語句&#xff0c;文件中定義的四個變量中&#xff0c;是指針類型的是&#xff08;&#xff09;【多選】 #define INT_PTR int* typedef int* intptr; INT_PRT a,b; int_ptr c,d;A:a ?B:b ?C:c ?D:d #define是宏定義&#xff0c;此時在程序中IN…

SQLite3 數據庫學習(六):Qt 嵌入式 Web 服務器詳解

參考引用 SQLite 權威指南&#xff08;第二版&#xff09;SQLite3 入門 1. Apache 搭建 cgi 環境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服務器軟件 它可以運行在幾乎所有廣泛使用的計算機平臺上&#xff0c;由于其跨平臺和安全性被廣泛使用 1.2 具體搭建流程…

一、用戶管理

一、后端數據庫初始化 1.1 因為版本問題&#xff0c;始終報錯&#xff0c;按照報錯信息去查詢解決方案&#xff0c;無法解決 靈機一動&#xff1a; 網址&#xff1a; Spring Boot 3.0 升級 實戰踩坑記錄 - 掘金 (juejin.cn) &#xff11;.&#xff12; 個人配置【運行成功…