Selenium瀏覽器自動化測試框架

介紹

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

功能
  • 框架底層使用JavaScript模擬真實用戶對瀏覽器進行操作。測試腳本執行時,瀏覽器自動按照腳本代碼做出點擊,輸入,打開,驗證等操作,就像真實用戶所做的一樣,從終端用戶的角度測試應用程序。

  • 使瀏覽器兼容性測試自動化成為可能,盡管在不同的瀏覽器上依然有細微的差別。

  • 使用簡單,可使用Java,Python等多種語言編寫用例腳本。

優勢

  Selenium 測試直接在瀏覽器中運行,就像真實用戶所做的一樣。Selenium 測試可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中運行。其他測試工具都不能覆蓋如此多的平臺。使用 Selenium 和在瀏覽器中運行測試還有很多其他好處。

下面是主要的兩大好處:

通過編寫模仿用戶操作的 Selenium 測試腳本,可以從終端用戶的角度來測試應用程序。通過在不同瀏覽器中運行測試,更容易發現瀏覽器的不兼容性。Selenium 的核心,也稱browser bot,是用 JavaScript 編寫的。這使得測試腳本可以在受支持的瀏覽器中運行。browser bot 負責執行從測試腳本接收到的命令,測試腳本要么是用 HTML 的表布局編寫的,要么是使用一種受支持的編程語言編寫的。

官方文檔:7. WebDriver API — Selenium Python Bindings 2 documentation

chromedriver下載:http://chromedriver.storage.googleapis.com/index.html

chromedriver與chrome的對應關系表:selenium使用chrome瀏覽器測試(附chromedriver與chrome的對應關系表)_python_腳本之家

基本使用

安裝: pip install selenium


from selenium import webdriverbrowser = webdriver.Chrome(executable_path='chromedriver.exe')   # 聲明一個瀏覽器對象   指定使用chromedriver.exe路徑browser.get("https://www.baidu.com")  # 打開Chrome
input = browser.find_element_by_id("kw")  # 通過id定位到input框
input.send_keys("python")   # 在輸入框內輸入pythonprint(browser.current_url)    # 打印url
print(browser.get_cookies())  # 打印Cookies
print(browser.page_source)    # 打印網頁源代碼browser.close()               # 關閉瀏覽器

獲取單節點

?from selenium import webdriverbrowser = webdriver.Chrome()browser.get("https://www.taobao.com")
# 找到搜索框
input_id = browser.find_element_by_id("q")  # 通過id找
input_name = browser.find_element_by_name("q")  # 通過name屬性值找
input_css = browser.find_element_by_css_selector("#q") # 根據css選擇器找
input_xpath = browser.find_element_by_xpath('//*[@id="q"]') # 根據xpath找
print(input_id,input_name,input_css,input_xpath)
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")> 
<selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")> 
<selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")> 
<selenium.webdriver.remote.webelement.WebElement (session="1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
"""# 其他獲取單個節點方法
"""
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
"""
# 通過方法
# find_element(By.ID,"q")   # 參數為查找方式和值
?

獲取多節點


from selenium import webdriverbrowser = webdriver.Chrome()browser.get("https://www.taobao.com")lis = browser.find_elements_by_css_selector(".service-bd li")  # 注意是elements多個s
print(lis)  # 輸出為列表"""
[<selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="454d656c-1730-410e-891e-210bfdf0d248")>, <selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="119177aa-014a-48c1-8bea-8ca9a50b446e")>, <selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="974860cf-1218-4ddf-a745-85f86090e188")>, <selenium.webdriver.remote.webelement.WebElement (session="588f61b0d90f7bf199d3f0ede6f9fb99", element="e5877c0c-f4df-4847-9875-1c81d56f21ee")>]
"""# 其他獲取多個節點方法
"""
find_elements_by_id("q")
find_elements_by_name("q")
find_elements_by_css_selector("#q")
find_elements_by_xpath('//*[@id="q"]')
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
"""
# 通過方法
# find_elements(By.CSS_SELECTOR,".service-bd li")   # 參數為查找方式和值

節點交互


import time
from selenium import webdriverbrowser = webdriver.Chrome()browser.get("https://www.taobao.com")"""
selenium可以驅動瀏覽器來執行一些動作:
輸入文字用send_keys()
清空文字用clear()
點擊按鈕用click()
"""input = browser.find_element_by_id("q")
input.send_keys("iPhone")   #在搜索框輸入iPhoneinput.clear()  # 清空搜索框的文字
time.sleep(2)
input.send_keys("iPad")  # 在搜索框輸入iPadbutton = browser.find_element_by_class_name("btn-search")  # 獲取點擊按鈕
button.click()  # 點擊搜索

動作鏈

?from selenium import webdriver
from selenium.webdriver import ActionChains   # 引入動作鏈
browser = webdriver.Chrome()
url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)browser.switch_to.frame("iframeResult")  # 切換到元素所在的frame[框架]
"""
可以傳入id、name、index以及selenium的WebElement對象,index從0開始
"""source = browser.find_element_by_css_selector("#draggable") # 找到被拖拽對象
target = browser.find_element_by_css_selector("#droppable") # 找到目標actions = ActionChains(browser)       # 聲明actions對象
actions.drag_and_drop(source,target)  # 拖拽元素的起點和終點
actions.perform()  # 執行動作action.click_and_hold()    # 點擊且長按,更多方法查看官方文檔
?

執行JavaScript代碼

from selenium import webdriverbrowser = webdriver.Chrome()
url = "https://www.zhihu.com/explore"
browser.get(url)browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 將進度條下拉到最底部
browser.execute_script("alert('hello word')")  # 彈出alert提示窗

獲取節點信息


from selenium import webdriver
browser = webdriver.Chrome()url = "https://www.zhihu.com/explore"browser.get(url)"""
WebElement常用屬性:get_attribute 獲取屬性值text          獲取文本值id            獲取節點idlocation      獲取節點在頁面中的相對位置tag_name      獲取標簽名稱size          獲取節點大小(寬和高)
"""# 獲取屬性
logo = browser.find_element_by_id("zh-top-link-logo")  # 獲取logo節點
print(logo)  # 返回值為WebElement對象logo_class = logo.get_attribute("class")   # 獲取zh-top-link-logo節點的class屬性值
print(logo_class)# 獲取文本值
text_Ele = browser.find_element_by_css_selector(".question_link") # 通過css選擇器獲取文本內容所在的標簽
text = text_Ele.text  # 取出標簽內的文本內容
print(text)# 獲取ID 位置 標簽名和大小
test = browser.find_element_by_class_name("zu-top-add-question")
print(test.id)       # 0bfe7ae6-ebd9-499a-8f4e-35ae34776687
print(test.location) # {'x': 759, 'y': 7}
print(test.tag_name) # button
print(test.size)     # {'height': 32, 'width': 66}

切換frame

?from selenium import webdriverbrowser = webdriver.Chrome()url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"browser.get(url)
"""
網頁中有一種節點叫做iframe,也就是子Frame,相當于頁面的子頁面,
他的結構和外部網頁的結構完全一致。
selenium打開頁面后,他默認是在父級Frame里面操作,
而此時如果頁面中還有子Frame,他是不能獲取到子Frame里面的節點的,
這時候就需要使用switch_to.frame()方法來切換Frame。
"""
browser.switch_to.frame("iframeResult")
logo = browser.find_elements_by_class_name("logo")
print(logo)# [<selenium.webdriver.remote.webelement.WebElement (session="1ccb11403013c749ce9fceda50a00975", element="88e5924e-d655-44c3-a905-8af1947b9d86")>]
?

延時等待


---------------------------隱式等待-------------------------
from selenium import webdriverbrowser = webdriver.Chrome()
# 隱式等待
browser.implicitly_wait(2) # 設定等待時間url = "https://www.zhihu.com/explore"
browser.get(url)
input = browser.find_element_by_class_name("aaa")
print(input)
# 報錯信息
"""raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".aaa"}(Session info: chrome=75.0.3770.142)
""""""
如果selenium沒有在DOM中找到節點,將繼續等待,超出設定事件后,則拋出找不到節點的異常。
當查找節點而節點并沒有立即出現的時候,隱式等待將等待一段時間在查找DOM,默認時間是0
"""--------------------------顯式等待------------------------
# 顯示等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECbrowser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
wait = WebDriverWait(browser,2)input = wait.until(EC.presence_of_element_located((By.ID,"q")))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))
print(input,button)# 等待條件
# EC.presence_of_element_located   節點出現
# EC.element_to_be_clickable       可點擊
# 更多等待條件查看260頁"""
引入WebDriverWait對象指定最長等待時間,調用它的until方法,
傳入要等待的條件expected_conditions,比如這里傳入例如presence_of_element_located
這個條件,代表節點出現的意思,其參數是節點的定位元組,也就是ID為q的搜索框。
這樣可以做到的效果就是,在10秒內如果ID為q的節點(即搜索框)成功加載出來,就返回該節點,
如果10秒還沒有加載出來,就拋出異常。
""""""
異常:
TimeoutException
""""""
指定要查找的節點,然后指定一個最長等待時間,如果在規定時間內加載出來了這個節點,
就返回查找的節點,如果到了規定時間依然沒有加載出該節點,則拋出【超時】異常
"""

前進和后退

?import timefrom selenium import webdriverbrowser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.get("https://www.taobao.com")
browser.get("https://www.jd.com")browser.back()  # 后退
time.sleep(2)
browser.forward() # 前進
browser.close()  # 關閉瀏覽器# 連續訪問三個頁面
?

cookies

?from selenium import webdriverbrowser = webdriver.Chrome()browser.get("https://www.zhihu.com/explore")
cookies = browser.get_cookies()  # 獲取cookies
print(cookies)browser.add_cookie({"name":"name","domain":"www.zhihu.com","vlue":"germey"})browser.delete_all_cookies()  # 刪除所有cookies
?

選項卡管理

?import time
from selenium import webdriverbrowser = webdriver.Chrome()browser.get("https://www.baidu.com")
browser.execute_script("window.open()")
print(browser.window_handles)
# ['CDwindow-7106D94FF002752ADF198B986343E31D', 'CDwindow-B669BA9559DBB78D8D6EC9C5AA699C40']browser.switch_to.window(browser.window_handles[1])
browser.get("https://www.taobao.com")
time.sleep(1)browser.switch_to.window(browser.window_handles[0])
browser.get("https://jd.com")"""
1、打開百度網頁
2、新開一個選項卡,調用execute_script()方法傳入JavaScript語法window.open()
3、切換到新打開的選項卡,調用window_handles屬性獲取當前開啟的所有選項卡,返回的是選項卡的代號列表,
要想切換選項卡只需要調用switch_to.window()方法,這里我們將第二個選項卡代號傳入,
即跳轉到第二個選項卡,在第二個選項卡里打開新頁面https://www.taobao.com,然后切換回第一個選項卡打開jd頁面
"""
?

異常處理

?from selenium import webdriverbrowser = webdriver.Chrome()
browser.get("https://www.baidu.com")
try:browser.find_element_by_id("hello")
except Exception as e:print(e)   # 打印錯誤信息 Exception捕獲所有錯誤信息賦給e
finally:browser.close()"""
在使用selenium的過程中,難免遇到一些異常,例如超時、節點未找到錯誤,
一旦出現此類錯誤,程序便不會在繼續運行了,這里我們使用try except語句來捕獲各種異常
"""
?

選項卡切換

?import timefrom selenium import webdriver
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
browser = webdriver.Chrome(executable_path='D:\chromedriver.exe',options=option)   # 聲明一個瀏覽器對象   option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser.get("https://www.baidu.com")  # 打開Chromeinput = browser.find_element_by_id("kw")  # 通過id定位到input框
input.send_keys("愛奇藝")   # 在輸入框內輸入python
browser.find_element_by_id("su").click()
time.sleep(3)
browser.find_element_by_xpath('//*[@id="1"]/h3').click()
time.sleep(10)
browser.switch_to_window(browser.window_handles[1])  # 切換到新打開的選項卡定位愛奇藝的搜索框search = browser.find_element_by_xpath("//input[@class='search-box-input']").send_keys("青春有你")browser.close()               # 關閉瀏覽器
?

無頭瀏覽器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options# 創建chrome參數對象
opt = Options()
# 把chrome設置成無界面模式,不論windows還是linux都可以,自動適配對應參數
opt.add_argument('--headless')
# 創建chrome無界面對象
driver = webdriver.Chrome(options=opt)
driver.get("http://www.baidu.com")
print(driver.page_source)

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

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

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

相關文章

STM32_3(GPIO)

GPIO簡介 GPIO&#xff08;General Purpose Input Output&#xff09;通用輸入輸出口8種輸入輸出模式輸出模式可控制端口輸出高電平&#xff0c;驅動LED、蜂鳴器、模擬通信協議輸出時許等輸入模式可讀取端口的高低電平或電壓&#xff0c;用于讀取按鍵輸入、外接模塊電平信號輸…

【VRTK】【VR開發】【Unity】8-可交互對象

【概述】 之前我們只是用了一個簡單方塊作為可交互對象。其實可交互對象可以有許多細節設置,包括具體抓握物體的哪個點,指定抓握的方向,指定Secondary Action允許兩手互換抓握,雙手抓握,用兩手改變物體大小等。 【拾取物體】 要讓一個物體能夠被拾取,必須設置它為可互…

mysql解壓版安裝步驟linux

1. MySQL下載就不說了&#xff0c;以5.7版本舉例 2. 解壓安裝包 tar -zxvf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz 3. 重命名目錄 mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql 4. 創建mysql用戶組和用戶 groupadd mysql useradd -r -g mysql mysql …

十多位老鐵在公司搭建好了測試平臺

保守估計&#xff0c;目前有十多位小伙伴在公司搭建好了。 現在稍微詳細的講一下其中測試計劃的使用說明&#xff1a; &#xff08;圖片有點小&#xff0c;可以點擊擴大查看&#xff09; 1、進入測試計劃模塊&#xff0c;點擊“添加”&#xff0c;如下圖5.1&#xff1a; ▲圖 5…

NX二次開發UF_CAM_set_cam_preferences 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_cam_preferences Defined in: uf_cam.h int UF_CAM_set_cam_preferences(UF_CAM_preferences_p_t prefs ) overview 概述 This function sets the current settings of…

PTA-6-44 水果接口-工廠設計模式

用工廠設計模式編寫程序代碼。已知有如下Fruit接口&#xff0c;請編寫其子類Apple類與Orange類&#xff0c;另外再編寫一個Factory工廠類&#xff0c;具體要求如下。 需要編寫Fruit接口的子類&#xff1a; 兩個子類Apple和Orange&#xff0c;實現接口Fruit&#xff0c;并覆寫ea…

若依框架導出下載pdf/excel以及導入打印等

一、打印文件 // 報表打印 handlePdf(row) {wayAPI(row.billcode).then((res) > {var binaryData [];binaryData.push(res);let url window.URL.createObjectURL(new Blob(binaryData, {type: "application/pdf"})); window.open("/static/pdf/web/v…

【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現城市多級聯動Demo(上)

目錄 概述 云數據庫開發 一、創建云數據庫的對象類型。 二、預置數據&#xff08;為對象類型添加數據條目&#xff09;。 三、部署云數據庫 云函數實現業務邏輯 一、創建云函數 二、云函數目錄講解 三、創建resources目錄 四、獲取云端憑據 五、導出之前創建的元數據…

算法設計與分析復習

分支法 算法設計與分析復習–遞歸與分治(一) 算法設計與分析復習–遞歸與分治&#xff08;二&#xff09; 動態規劃 算法設計與分析復習–動態規劃 貪心 算法設計與分析復習–貪心&#xff08;一) 算法設計與分析復習–貪心&#xff08;二&#xff09; 回溯法 算法設計與…

鴻蒙原生應用/元服務開發-AGC分發如何配置版本信息(下)

12.根據《工業和信息化部關于開展移動互聯網應用程序備案工作的通知》&#xff0c;自2023年9月初起&#xff0c;在中國大陸地區提供互聯網信息服務的APP開發者&#xff0c;需要依法履行APP備案手續&#xff0c;并通過APP分發平臺的備案信息核驗。 對于2023年9月7日后在AGC新上…

【C++入門到精通】 Lambda表達式 C++11 [ C++入門 ]

閱讀導航 引言一、C98中的一個例子二、Lambda表達式1. Lambda表達式語法&#xff08;1&#xff09;Lambda表達式各部分說明&#xff08;2&#xff09;捕獲列表說明 三、Lambda表達式的底層原理溫馨提示 引言 當今軟件開發行業的快速發展和日益復雜的需求&#xff0c;要求程序員…

基于openwrt創建應用程序教程

背景 之前在做路由器工作時&#xff0c;搞過一段時間openwrt&#xff0c;最近看到之前寫的筆記。整理一下&#xff0c;希望能幫助一些朋友入坑。 熟悉openwrt openwrt之前并沒有接觸過&#xff0c;其目錄結構和linux也有所不同。先大致了解一下openwrt文件系統中各個目錄的作用…

C運算符與表達式

跟著肯哥&#xff08;不是我&#xff09;學運算符與表達式 運算符 在C語言中&#xff0c;運算符是一種用來執行特定操作的符號或關鍵字。它們用于對變量、常量和表達進行計算、邏輯判斷和位操作等。 定義一般都當耳旁風了 運算符分類 算術運算符 -*/%加減乘除取模&#xff0c;…

浮點數運算精度丟失,如何解決

為什么浮點數運算的時候會有精度丟失的風險&#xff1f; 浮點數運算精度丟失代碼演示&#xff1a; float a 2.0f - 1.9f; float b 1.8f - 1.7f; System.out.println(a);// 0.100000024 System.out.println(b);// 0.099999905 System.out.println(a b);// false為什么會出現…

everything排除目錄

everything默認搜索所有文件&#xff0c;自己把沒啥必要的目錄都屏蔽掉&#xff0c;記錄如下

ChatGPT/GPT4丨編程助手;AI畫圖;數據分析;科研/項目實現;提示詞工程技巧;論文寫作等

ChatGPT 在論文寫作與編程方面也具備強大的能力。無論是進行代碼生成、錯誤調試還是解決編程難題&#xff0c;ChatGPT都能為您提供實用且高質量的建議和指導&#xff0c;提高編程效率和準確性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以為您提供論文寫作的…

【微軟技術棧】使用新的C#功能減少內存分配

本文內容 通過引用傳遞和返回引用安全上下文安全的上下文和 ref 結構統一內存類型通過參考安全提高性能 本節中介紹的技術可提高應用于代碼中的熱路徑時的性能。熱路徑是代碼庫中在正常操作中經常重復執行的部分。將這些技術應用于不經常執行的代碼將產生最小的影響。在進行任何…

[數據結構]-AVL樹

前言 作者&#xff1a;小蝸牛向前沖 名言&#xff1a;我可以接受失敗&#xff0c;但我不能接受放棄 如果覺的博主的文章還不錯的話&#xff0c;還請點贊&#xff0c;收藏&#xff0c;關注&#x1f440;支持博主。如果發現有問題的地方歡迎?大家在評論區指正 目錄 一、AVL樹基…

OpenGL 繪制線(Qt)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 這里同樣對OpenGL中的繪制線操作進行封裝,便于后續的操作,很多形狀也都是基于線來生成的,如圓形等。 二、實現代碼 LineDrawable.h #ifndef LINE_DRAWABLE_H #define LINE_DRAWABLE_H#include

IBM ELM—系統工程全生命周期管理平臺

產品概述 Engineering Lifecycle Management是IBM提供的工程全生命周期管理組合工具&#xff0c;幫助企業降低開發成本&#xff0c;應對開發挑戰并更快地發展其流程和實踐。 隨著產品變得更加復雜且數字化&#xff0c;傳統的工程開發不再能及時且有效地滿足系統工程的復雜度&a…