做財經(jīng)直播網(wǎng)站商業(yè)軟文案例
文檔說明
Selenium是一個用于Web應(yīng)用程序自動化測試的工具。Selenium測試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。
Selenium測試的主要功能包括:
測試與瀏覽器的兼容性:測試應(yīng)用程序是否能很好的工作在不同的瀏覽器和操作系統(tǒng)之上。
測試系統(tǒng)功能:創(chuàng)建回歸測試,檢驗(yàn)軟件功能和用戶需求。
本文以Python語言為例,主要系統(tǒng)介紹Selenium3.0自動化測試框架的使用中的各種基礎(chǔ)、常規(guī)操作。
通過學(xué)習(xí)和實(shí)踐,達(dá)到能夠在Python + Selenium的技術(shù)架構(gòu)下進(jìn)行Web自動化入門測試的目的。
Web自動化測試的技術(shù)選型
Web自動化測試工具種類繁多,選擇標(biāo)準(zhǔn)應(yīng)該從以下幾個方面重點(diǎn)考慮:
開源免費(fèi)
業(yè)界主流,發(fā)展趨勢穩(wěn)定上升
支持主流的瀏覽器(Chrome、 Firefox、IE等)
支持主流編程語言(Python、Java等)
Selenium的特點(diǎn)
開源免費(fèi)
多瀏覽器支持:Chrome、Firefox、IE、Edge、Opera、Safari
多平臺支持:Windows、Linux、Mac
多語言支持:Python、Java、Ruby、JavaScript、C#、C++
支持錄制、回放和腳本生成(使用Selenium IDE)
支持分布式測試(使用Selenium Grid)
Selenium三劍客
通常所說的Selenium是對Selenium的總稱,其中包含三個項目:
Selenium WebDriver,Selenium IDE,Selenium Grid
Selenium WebDriver是客戶端API接口,測試人員通過調(diào)用這些接口,來訪問瀏覽器驅(qū)動,瀏覽器驅(qū)動再訪問瀏覽器。
Selenium IDE是一個瀏覽器插件,支持Chrome和Firefox瀏覽器,可以將手動測試過程記錄下來生成自動化測試腳本,可以回放。對于初學(xué)者的學(xué)習(xí)腳本和回歸測試很有幫助。
Selenium Grid適合分布式測試,例如電商平臺的618、雙11這種高并發(fā)的測試??梢栽俣嗯_計算機(jī)上進(jìn)行分布式擴(kuò)容,并從一個中心點(diǎn)管理多個環(huán)境,從而輕松的多多種瀏覽器/OS的組合運(yùn)行測試。
Selenium的前世今生
Selenium的命名
Selenium官網(wǎng):www.seleniumhq.org
Selenium的命名比較有意思,ThoughtWorks的Jason Huggins在2004年發(fā)起了Selenium項目,當(dāng)時的QTP mercury是主流的商業(yè)自化工具,是化學(xué)元素汞(俗稱水銀),而Selenium是開源自動化工具,是化學(xué)元素硒,硒可以對抗汞。
Selenium 1.0
用簡單的公式:
Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC
Selenium IDE
Selenium IDE是嵌入到Firefox瀏覽器中的一個插件,實(shí)現(xiàn)簡單的瀏覽器操作的錄制與回放功能。
Selenium Grid
Selenium Grid是一種自動化的測試輔助工具,Grid通過利用現(xiàn)有的計算機(jī)基礎(chǔ)設(shè)施,能加快Web-App的功能測試。利用Grid可以很方便地實(shí)現(xiàn)在多臺機(jī)器上和異構(gòu)環(huán)境中運(yùn)行測試用例。
Selenium RC
Selenium RC(Remote Control)是Selenium家族的核心部分。Selenium RC 支持多種不同語言編寫的自動化測試腳本,通過Selenium RC的服務(wù)器作為代理服務(wù)器去訪問應(yīng)用,從而達(dá)到測試的目的。
Selenium RC分為Client Libraries和Selenium Server。Client Libraries庫主要用于編寫測試腳本,用來控制Selenium Server的庫。Selenium Server負(fù)責(zé)控制瀏覽器行為。
Selenium1.0的核心是RC,它的工作原理是這樣的:
在2006年的時候,Google的工程師Simon Stewart發(fā)起了WebDriver的項目;因?yàn)殚L期以來Google一直是Selenium的重度用戶,但卻被限制在有限的操作范圍內(nèi)。
Selenium RC 是在瀏覽器中運(yùn)行JavaScript應(yīng)用,使用瀏覽器內(nèi)置的JavaScript翻譯器來翻譯和執(zhí)行selenese命令(selenese是Selenium命令集合)。
WebDriver是通過原生瀏覽器支持或者瀏覽器擴(kuò)展來直接控制瀏覽器。WebDriver針對各個瀏覽器而開發(fā),取代了嵌入到被測Web應(yīng)用中的JavaScript,與瀏覽器緊密集成,因此支持創(chuàng)建更高級的測試,避免了JavaScript安全模型導(dǎo)致的限制。除了來自瀏覽器廠商的支持之外,WebDriver還利用操作系統(tǒng)級的調(diào)用,模擬用戶輸入。
Selenium與WebDriver原是屬于兩個不同的項目,WebDriver的創(chuàng)建者Simon Stewart早在2009年8月的一份郵件中解釋了項目合并的原因。
Selenium與WebDriver合并原因:為何把兩個項目合并?部分原因是WebDriver解決了Selenium存在的缺點(diǎn)(例如能夠繞過JavaScript沙箱,我們有出色的API),部分原因是Selenium解決了WebDriver存在的問題(例如支持廣泛的瀏覽器),部分原因是因?yàn)镾elenium的主要貢獻(xiàn)者和我都覺得合并項目是為用戶提供最優(yōu)秀框架的最佳途徑。
Selenium 2.0
因?yàn)镾elenium和Webdriver的合并,所以,Selenium 2.0由此誕生。
簡單用公式表示為:Selenium 2.0 = Selenium 1.0 + WebDriver
需要強(qiáng)調(diào)的是,在Selenium 2.0中主推的是WebDriver,可以將其看作Selenium RC的替代品。因?yàn)镾elenium為了保持向下的兼容性,所以在Selenium 2.0中并沒有徹底地拋棄Selenium RC。
Selenium2.0的核心是WebDriver。
Selenium 3.0
Selenium 3.0 = Selenium 2.0 - Selenium RC(Remote Control)
? ? ? ? ? ? ? ? ? ? ? =?Selenium IDE?+ Selenium Grid + WebDriver (Selenium三劍客)
Selenium 2.0 = Selenium 1.0 + WebDriver
Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC
Selenium 3.0做了如下的更新:
1,去掉了RC
2,Selenium3.0只支持Java8版本以上。
3,Selenium3.0中的Firefox瀏覽器驅(qū)動獨(dú)立了,以前裝完selenium2就可以驅(qū)動Firefox瀏覽器了,現(xiàn)在和Chrome一樣,必須下載和設(shè)置瀏覽器驅(qū)動。
4,MAC OS 集成Safari的瀏覽器驅(qū)動。默認(rèn)在/usr/bin/safaridriver 目錄下。
5,只支持IE 9.0版本以上。
Selenium 4.0
目前已經(jīng)更新到4.X版本了,有新的特性以及更新了一些方法的使用。本文以3.0作為說明。
安裝Selenium
先安裝Python,再安裝Selenium。
通過pip命令來安裝Selenium:
瀏覽器驅(qū)動
為什么要下載瀏覽器驅(qū)動
Selenium升級到3.0之后,對不同的瀏覽器驅(qū)動進(jìn)行了規(guī)范。如果想使用selenium驅(qū)動不同的瀏覽器,必須單獨(dú)下載并設(shè)置不同的瀏覽器驅(qū)動。
常用瀏覽器驅(qū)動的官方下載地址:
selenium · PyPI
設(shè)置瀏覽器驅(qū)動
瀏覽器的驅(qū)動要下載和瀏覽器配套的版本。
將下載的瀏覽器驅(qū)動放到Python的安裝目錄下,并且配置系統(tǒng)環(huán)境變量:
配置系統(tǒng)環(huán)境變量路徑:此電腦-->屬性-->高級系統(tǒng)設(shè)置-->環(huán)境變量-->系統(tǒng)變量-->Path,將“C:\Python379”目錄添加到Path的值中
測試瀏覽器驅(qū)動是否正常
IDE以Pycharm為例,創(chuàng)建 baidu.py文件,輸入以下內(nèi)容:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
print(driver.title)
driver.quit()
若不報錯,成功打印百度主頁的title,說明瀏覽器驅(qū)動設(shè)置成功,可以繼續(xù)進(jìn)行接下來的操作了。
如報錯,請根據(jù)報錯提示檢查和修復(fù)。
元素定位
Selenium定位方法
Selenium提供了8種定位方式。
id
name
class name
tag name
link text
partial link text
xpath
css selector
這8種定位方式在Python selenium中所對應(yīng)的方法為:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
定位方法的用法
假如我們有一個Web頁面,通過前端工具(如:Firebug 官網(wǎng):https://getfirebug.com)查看到一個元素的屬性是如下這樣的:
<html>
<head>
<body link="#0000cc">
<a id="result_logo" href="/" οnmοusedοwn="return c({'fm':'tab','tab':'logo'})">
<form id="form" class="fm" name="f" action="/s">
<span class="soutu-btn"></span>
<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
如果我們的目的是要定位input標(biāo)簽的輸入框。
通過id定位:
dr.find_element_by_id("kw")
通過name定位:
dr.find_element_by_name("wd")
通過class name定位:
dr.find_element_by_class_name("s_ipt")
通過tag name定位:
dr.find_element_by_tag_name("input")
通過xpath定位,xpath定位有N種寫法,這里列幾個常用寫法:
dr.find_element_by_xpath("//*[@id='kw']")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@class='soutu-btn']/input")
dr.find_element_by_xpath("//form[@id='form']/span/input")
dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")
通過css定位,css定位有N種寫法,這里列幾個常用寫法:
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")
頁面上有一組文本鏈接:
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
通過link text定位:
dr.find_element_by_link_text("新聞")
dr.find_element_by_link_text("hao123")
通過link text定位:
dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")
關(guān)于xpah和css的定位比較復(fù)雜,需要用到時可以單獨(dú)學(xué)習(xí),本文不展開:
XPath 語法
CSS 選擇器參考手冊
控制瀏覽器操作
控制瀏覽器窗口大小
有時候我們希望能以某種瀏覽器尺寸打開,讓訪問的頁面在這種尺寸下運(yùn)行。例如可以將瀏覽器設(shè)置成移動端大小(480* 800),然后訪問移動站點(diǎn),對其樣式進(jìn)行評估;WebDriver提供了set_window_size()方法來設(shè)置瀏覽器的大小。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://m.baidu.com")
# 參數(shù)數(shù)字為像素點(diǎn)
print("設(shè)置瀏覽器寬480、高800顯示")
driver.set_window_size(480, 800)
time.sleep(10)
driver.quit()
在PC端執(zhí)行自動化測試腳本大多的情況下是希望瀏覽器在全屏幕模式下執(zhí)行,可以使用maximize_window()方法使打開的瀏覽器全屏顯示,其用法與set_window_size() 相同,它不需要參數(shù)。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 設(shè)置瀏覽器寬全屏顯示,不需要參數(shù)
print("設(shè)置瀏覽器寬全屏顯示")
driver.maximize_window()
time.sleep(10)
driver.quit()
控制瀏覽器后退、前進(jìn)
在使用瀏覽器瀏覽網(wǎng)頁時,瀏覽器提供了后退和前進(jìn)按鈕,可以方便地在瀏覽過的網(wǎng)頁之間切換,WebDriver也提供了對應(yīng)的back()和forward()方法來模擬后退和前進(jìn)按鈕。下面通過例子來演示這兩個方法的使用。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 訪問百度首頁
first_url = 'http://www.baidu.com'
print("now access %s" %(first_url))
driver.get(first_url)
print(driver.title)
# 訪問新聞頁面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
driver.get(second_url)
print(driver.title)
# 返回(后退)到百度首頁
print("back to %s "%(first_url))
driver.back()
print(driver.title)
# 前進(jìn)到新聞頁
print("forward to %s"%(second_url))
driver.forward()
print(driver.title)
driver.quit()
為了看清腳本的執(zhí)行過程,下面每操作一步都通過print()來打印當(dāng)前的URL地址。
刷新頁面
有時候需要手動刷新(F5) 頁面,使用方法driver.refresh() ,刷新當(dāng)前頁面
WebDriver常用方法
點(diǎn)擊和輸入
定位元素只是第一步, 定位之后需要對這個元素進(jìn)行操作, 或單擊(按鈕) 或輸入(輸入框) , 下面認(rèn)識 WebDriver 中最常用的幾個方法:
clear(): 清除文本。
send_keys (value): 模擬按鍵輸入。
click(): 單擊元素。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
driver.quit()
提交
submit()
submit()方法用于提交表單。 例如, 在搜索框輸入關(guān)鍵字之后的“回車” 操作, 就可以通過該方法模擬。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
search_text = driver.find_element_by_id('kw')
search_text.send_keys('selenium')
search_text.submit()
driver.quit()
有時候 submit()可以與 click()方法互換來使用, submit()同樣可以提交一個按鈕, 但 submit()的應(yīng)用范圍遠(yuǎn)不及 click()廣泛。
其他常用方法
size: 返回元素的尺寸。
text: 獲取元素的文本。
get_attribute(name): 獲得屬性值。
is_displayed(): 設(shè)置該元素是否用戶可見。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 獲得輸入框的尺寸
size = driver.find_element_by_id('kw').size
print(size)
# 返回百度頁面底部備案信息
text = driver.find_element_by_class_name('s-bottom-layer-content').text
print(text)
# 返回元素的屬性值, 可以是 id、 name、 type 或其他任意屬性
attribute = driver.find_element_by_id("kw").get_attribute('type')
print(attribute)
# 返回元素的結(jié)果是否可見, 返回結(jié)果為 True 或 False
result = driver.find_element_by_id("kw").is_displayed()
print(result)
time.sleep(10)
driver.quit()
輸出結(jié)果:
{'height': 44, 'width': 548}
設(shè)為首頁關(guān)于百度About Baidu百度營銷使用百度前必讀意見反饋幫助中心京公網(wǎng)安備11000002000001號京ICP證030173號?2021 Baidu (京)-經(jīng)營性-2017-0020
text
True
執(zhí)行上面的程序并查看結(jié)果: size 方法用于獲取百度輸入框的寬、 高, text 方法用于獲得百度底部的備案信息, get_attribute()用于獲得百度輸入的 type 屬性的值, is_displayed()用于返回一個元素是否可見, 如果可見則返回 True, 否則返回 False。
鼠標(biāo)事件
在 WebDriver 中, 將這些關(guān)于鼠標(biāo)操作的方法封裝在 ActionChains 類中提供。
ActionChains 類提供了鼠標(biāo)操作的常用方法:
perform(): 執(zhí)行所有 ActionChains 中存儲的行為;
context_click(): 右擊;
double_click(): 雙擊;
drag_and_drop(): 拖動;
move_to_element(): 鼠標(biāo)懸停。
鼠標(biāo)懸停操作
from selenium import webdriver
# 引入 ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 定位到要懸停的元素
above = driver.find_element_by_link_text("更多")
# 對定位到的元素執(zhí)行鼠標(biāo)懸停操作
ActionChains(driver).move_to_element(above).perform()
說明:
from selenium.webdriver import ActionChains
導(dǎo)入提供鼠標(biāo)操作的 ActionChains 類。
ActionChains(driver)
調(diào)用 ActionChains()類, 將瀏覽器驅(qū)動 driver 作為參數(shù)傳入。
move_to_element(above)
context_click()方法用于模擬鼠標(biāo)右鍵操作, 在調(diào)用時需要指定元素定位。
perform()
執(zhí)行所有 ActionChains 中存儲的行為, 可以理解成是對整個操作的提交動作。
鍵盤事件
Keys()類提供了鍵盤上幾乎所有按鍵的方法。 前面了解到, send_keys()方法可以用來模擬鍵盤輸入, 除此 之外, 我們還可以用它來輸入鍵盤上的按鍵, 甚至是組合鍵, 如 Ctrl+A、 Ctrl+C 等。
from selenium import webdriver
# 引入 Keys 模塊
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 輸入框輸入內(nèi)容
driver.find_element_by_id("kw").send_keys("seleniumm")
time.sleep(2)
# 刪除多輸入的一個 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(2)
# 輸入空格鍵+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
time.sleep(2)
driver.find_element_by_id("kw").send_keys("教程")
time.sleep(2)
# ctrl+a 全選輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
time.sleep(2)
# ctrl+x 剪切輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
time.sleep(2)
# ctrl+v 粘貼內(nèi)容到輸入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
time.sleep(2)
# 通過回車鍵來代替單擊操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
time.sleep(10)
driver.quit()
演示代碼為了能看清楚執(zhí)行過程,可以加入sleep(2),正式測試代碼不能加sleep等待方法。
上面的演示代碼沒有實(shí)際意義, 僅展示模擬鍵盤各種按鍵與組合鍵的用法。
說明:
from selenium.webdriver.common.keys import Keys
在使用鍵盤按鍵方法前需要先導(dǎo)入 keys 類。
以下為常用的鍵盤操作:
send_keys(Keys.BACK_SPACE) 刪除鍵(BackSpace)
send_keys(Keys.SPACE) 空格鍵(Space)
send_keys(Keys.TAB) 制表鍵(Tab)
send_keys(Keys.ESCAPE) 回退鍵(Esc)
send_keys(Keys.ENTER) 回車鍵(Enter)
send_keys(Keys.CONTROL,'a') 全選(Ctrl+A)
send_keys(Keys.CONTROL,'c') 復(fù)制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘貼(Ctrl+V)
send_keys(Keys.F1) 鍵盤 F1
……
send_keys(Keys.F12) 鍵盤 F12
斷言
不管是在做功能測試還是自動化測試,最后一步需要拿實(shí)際結(jié)果與預(yù)期進(jìn)行比較。這個比較的稱之為斷言。
通??梢酝ㄟ^獲取title 、URL和text等信息進(jìn)行斷言。text方法在前面已經(jīng)講過,它用于獲取標(biāo)簽對之間的文本信息。 下面同樣以百度為例,介紹如何獲取這些信息。
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
print('Before search================')
# 打印當(dāng)前頁面title
title = driver.title
print(title)
# 打印當(dāng)前頁面URL
now_url = driver.current_url
print(now_url)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
print('After search================')
# 再次打印當(dāng)前頁面title
title = driver.title
print(title)
# 打印當(dāng)前頁面URL
now_url = driver.current_url
print(now_url)
# 獲取結(jié)果數(shù)目
sleep(3)
user = driver.find_element_by_class_name('nums').text
print(user)
sleep(10)
driver.quit()
腳本運(yùn)行結(jié)果如下:
Before search================
百度一下,你就知道
https://www.baidu.com/
After search================
selenium_百度搜索
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=selenium&fenlei=256&rsv_pq=f58b739f00005ced&rsv_t=dfc6adhvTMwlLK0URN0HpQmDI5YhaCf%2F%2ByTAk9xmtH9V8Vutx%2FSGErJI3DU&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=8&rsv_btype=i&inputT=194&rsv_sug4=194
搜索工具
百度為您找到相關(guān)結(jié)果約75,500,000個
說明:
title:用于獲得當(dāng)前頁面的標(biāo)題。
current_url:用戶獲得當(dāng)前頁面的URL。
text:獲取搜索條目的文本信息。
設(shè)置元素等待
WebDriver提供了兩種類型的等待:顯式等待和隱式等待。
顯式等待
顯式等待使WebDriver等待某個條件成立時繼續(xù)執(zhí)行,否則在達(dá)到最大時長時拋出超時異常(TimeoutException)。
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 EC
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
driver.quit()
WebDriverWait類是由WebDirver 提供的等待方法。在設(shè)置時間內(nèi),默認(rèn)每隔一段時間檢測一次當(dāng)前頁面元素是否存在,如果超過設(shè)置時間檢測不到則拋出異常。具體格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver :瀏覽器驅(qū)動。
timeout :最長超時時間,默認(rèn)以秒為單位。
poll_frequency :檢測的間隔(步長)時間,默認(rèn)為0.5S。
ignored_exceptions :超時后的異常信息,默認(rèn)情況下拋NoSuchElementException異常。
WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的說明。
until(method, message=‘’)
調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為True。
until_not(method, message=‘’)
調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為False。
在本例中,通過as關(guān)鍵字將expected_conditions 重命名為EC,并調(diào)用presence_of_element_located()方法判斷元素是否存在。
隱式等待
WebDriver提供了implicitly_wait()方法來實(shí)現(xiàn)隱式等待,默認(rèn)設(shè)置為0。它的用法相對來說要簡單得多。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime
driver = webdriver.Firefox()
# 設(shè)置隱式等待為10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
print(ctime())
driver.find_element_by_id("kw22").send_keys('selenium')
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
implicitly_wait() 默認(rèn)參數(shù)的單位為秒,本例中設(shè)置等待時長為10秒。首先這10秒并非一個固定的等待時間,它并不影響腳本的執(zhí)行速度。其次,它并不針對頁面上的某一元素進(jìn)行等待。當(dāng)腳本執(zhí)行到某個元素定位時,如果元素可以定位,則繼續(xù)執(zhí)行;如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設(shè)在第6秒定位到了元素則繼續(xù)執(zhí)行,若直到超出設(shè)置時長(10秒)還沒有定位到元素,則拋出異常。
定位一組元素
WebDriver提供了8種用于定位一組元素的方法。
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
定位一組元素的方法與定位單個元素的方法類似,唯一的區(qū)別是在單詞element后面多了一個s表示復(fù)數(shù)。
接下來通過例子演示定位一組元素的使用:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
# 定位一組元素
texts = driver.find_elements_by_xpath('//div/h3/a')
# 循環(huán)遍歷出每一條搜索結(jié)果的標(biāo)題
for t in texts:
print(t.text)
sleep(10)
driver.quit()
程序運(yùn)行結(jié)果:
MeterSphere - 開源自動化測試平臺
Selenium automates browsers. That's it!
Selenium(WEB自動化工具) - 百度百科
selenium中文網(wǎng) | selenium安裝、selenium使用、selenium...
Python+Selenium詳解(超全)
Selenium Python 測試教程網(wǎng)
Python Selenium庫的使用_凱耐的博客-CSDN博客_selenium
功能自動化測試工具——Selenium篇
selenium - 百度翻譯
Selenium環(huán)境安裝配置 - 環(huán)境配置 - 測試人社區(qū)
多表單切換
在Web應(yīng)用中經(jīng)常會遇到frame/iframe表單嵌套頁面的應(yīng)用,WebDriver只能在一個頁面上對元素識別與定位,對于frame/iframe表單內(nèi)嵌頁面上的元素?zé)o法直接定位。需要通過switch_to.frame()方法將當(dāng)前定位的主體切換為frame/iframe表單的內(nèi)嵌頁面中。
"""多表單切換"""
from selenium import webdriver
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://sahitest.com/demo/framesTest.htm')
def test1(self):
top = self.driver.find_element_by_name('top')
self.driver.switch_to.frame(top)
self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[1]').click()
self.driver.switch_to.default_content()
sleep(3)
second = self.driver.find_element_by_xpath('/html/frameset/frame[2]')
self.driver.switch_to.frame(second)
self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[2]').click()
sleep(5)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test1()
switch_to.frame(reference) :切換frame,reference是傳入的參數(shù),用來定位frame,可以傳入id、name、index以及selenium的WebElement對象
switch_to_default_content() :返回主文檔
switch_to_parent_frame() :返回父文檔
多窗口切換
頁面操作過程中有時候點(diǎn)擊某個鏈接會彈出新的窗口,這時就需要主機(jī)切換到新打開的窗口上進(jìn)行操作。WebDriver提# 多窗口切換
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 獲得百度搜索窗口句柄
search_windows = driver.current_window_handle
driver.find_element_by_link_text('登錄').click()
driver.find_element_by_link_text("立即注冊").click()
# 獲得當(dāng)前所有打開的窗口的句柄
all_handles = driver.window_handles
# 進(jìn)入注冊窗口
for handle in all_handles:
if handle != search_windows:
driver.switch_to.window(handle)
print('歡迎注冊!')
sleep(3)
pass
driver.quit()供了switch_to.window()方法,可以實(shí)現(xiàn)在不同的窗口之間切換。
說明:
current_window_handle:獲得當(dāng)前窗口句柄。
window_handles:返回所有窗口的句柄到當(dāng)前會話。
switch_to.window():用于切換到相應(yīng)的窗口,與上一節(jié)的switch_to.frame()類似,前者用于不同窗口的切換,后者用于不同表單之間的切換。
警告框處理
WebDriver中處理JavaScript所生成的alert、confirm、prompt的具體做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法進(jìn)行操作。
說明:
text:返回 alert/confirm/prompt 中的文字信息。
accept():接受現(xiàn)有警告框。
dismiss():解散現(xiàn)有警告框。
send_keys(keysToSend):發(fā)送文本至警告框。keysToSend:將文本發(fā)送至警告框。
例如,百度搜索設(shè)置彈出的窗口是不能通過前端工具對其進(jìn)行定位的,這個時候就可以通過switch_to_alert()方法接受這個彈窗。
# 警告框處理
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
driver.maximize_window()
# 鼠標(biāo)懸停至“設(shè)置”鏈接
link = driver.find_element_by_xpath('//span[@id="s-usersetting-top"]')
ActionChains(driver).move_to_element(link).perform()
# 打開搜索設(shè)置
sleep(2)
driver.find_element_by_xpath('//div[@class="s-user-setting-pfmenu"]/a[@class="setpref"]').click()
# 保存設(shè)置
driver.find_element_by_xpath('//div[@id="se-setting-7"]/a[@class="prefpanelgo setting-btn c-btn c-btn-primary"]').click()
sleep(2)
# 接受警告框
driver.switch_to.alert.accept()
driver.quit()通過switch_to_alert()方法獲取當(dāng)前頁面上的警告框,并使用accept()方法接受警告框。
下拉框選擇
WebDriver提供了Select工具類來處理下拉框:
"""下拉框選擇"""
from selenium import webdriver
from time import sleep
import os
from selenium.webdriver.support.select import Select
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
path = os.path.dirname(os.path.abspath(__file__))
file_path = 'file:///' + path + '/form.html'
self.driver.get(file_path)
def test_select(self):
se = self.driver.find_element_by_id('province')
select = Select(se)
select.select_by_index(0)
sleep(2)
select.select_by_value('sh')
sleep(2)
select.select_by_visible_text('西安')
sleep(2)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_select()
代碼中的form表單的form.html代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="javascript:alert('test')">
provide:
<select name="province" id="province">
<option value="bj">北京</option>
<option value="xa">西安</option>
<option value="sh">上海</option>
</select>
</form>
</body>
</html>
說明:
Select類用于定位select標(biāo)簽。
Select_by_index() 根據(jù)索引選擇。
select_by_value() 根據(jù)值選擇。
select_by_visible_text()根據(jù)文本選擇。
文件上傳
對于通過input標(biāo)簽實(shí)現(xiàn)的上傳功能,可以將其看作是一個輸入框,即通過send_keys()指定本地文件路徑的方式實(shí)現(xiàn)文件上傳。
首先在Python工程同目錄下創(chuàng)建upfile.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload_file</title>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h1>upload_file</h1>
<input type="file" name="file" />
</div>
</div>
</body>
</html>
通過瀏覽器打開upfile.html文件,功能如下:
接著通過send_keys()方法來實(shí)現(xiàn)文件上傳。
"""文件上傳"""
from selenium import webdriver
from time import sleep
import os
driver = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
# 定位上傳按鈕,添加本地文件
driver.find_element_by_name('file').send_keys('C:\\Users\\pc\\PycharmProjects\\pythonProject1\\upload_file.txt')
sleep(3)
driver.quit()
cookie操作
因?yàn)榛谡鎸?shí)cookie的測試是無法通過白盒和集成測試進(jìn)行的。有時候我們需要驗(yàn)證瀏覽器中cookie是否正確,WebDriver提供了操作Cookie的相關(guān)方法,可以讀取、添加和刪除cookie信息。
WebDriver操作cookie的方法:
get_cookies(): 獲得所有cookie信息。
get_cookie(name): 返回字典的key為“name”的cookie信息。
add_cookie(cookie_dict) : 添加cookie?!癱ookie_dict”指字典對象,必須有name 和value 值。
delete_cookie(name,optionsString):刪除cookie信息?!皀ame”是要刪除的cookie的名稱,“optionsString”是該cookie的選項,目前支持的選項包括“路徑”,“域”。
delete_all_cookies(): 刪除所有cookie信息。
舉例:通過get_cookies()來獲取當(dāng)前瀏覽器的cookie信息。
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.youdao.com")
# 獲得cookie信息
cookie= driver.get_cookies()
# 將獲得cookie的信息打印
print(cookie)
driver.quit()
從執(zhí)行結(jié)果可以看出,cookie數(shù)據(jù)是以字典的形式進(jìn)行存放的:
[{'domain': '.baidu.com', 'expiry': 1614657905, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'secure': False, 'value': '8t8k212h0ga500cg2h1g3rar10q'},
{'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '33515_33272_31660_33595_33570_33601_26350_22159'},
{'domain': 'www.baidu.com', 'expiry': 1614654305, 'httpOnly': False, 'name': 'BD_LAST_QID', 'path': '/', 'secure': False, 'value': '9538733699940937218'},
{'domain': '.baidu.com', 'expiry': 1646190304, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '7663FBCB3A34639C54E8F25076262EF7:FG=1'},
{'domain': '.baidu.com', 'expiry': 3762137951, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '7663FBCB3A34639CA4A078B880E2933D'},
{'domain': '.baidu.com', 'expiry': 3762137951, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1614654304'},
{'domain': 'www.baidu.com', 'expiry': 1615518305, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'},
{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}
]
知道了cookie的存放形式,就可以按照這種形式向?yàn)g覽器中寫入cookie信息。
"""向?yàn)g覽器添加cookie"""
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 向cookie的name 和value中添加會話信息
driver.add_cookie({'name': 'AAAAA', 'value': 'BBBBB'})
# 遍歷cookies中的name 和value信息并打印,當(dāng)然還有上面添加的信息
for cookie in driver.get_cookies():
print("%s -> %s" % (cookie['name'], cookie['value']))
driver.quit()
輸出結(jié)果:
C:\Python379\python.exe C:/Users/pc/PycharmProjects/pythonProject1/add_cookie.py
AAAAA -> BBBBB
BA_HECTOR -> 0t8100052l802l6l281g3rbbn0r
H_PS_PSSID -> 33516_33638_33273_31254_33570
BD_LAST_QID -> 15048048474274682553
BAIDUID -> 3D16A792E75CDD10BFF718B4812751EE:FG=1
BIDUPSID -> 3D16A792E75CDD10F3EFD20DBFC21C54
PSTM -> 1614654838
BD_UPN -> 12314753
BD_HOME -> 1
Process finished with exit code 0從執(zhí)行結(jié)果可以看到,第一條cookie信息是在腳本執(zhí)行過程中通過add_cookie()方法添加的。通過遍歷得到所有的cookie信息,從而找到key為“name”和“value”的特定cookie的value。
調(diào)用JavaScript代碼
雖然WebDriver提供了操作瀏覽器的前進(jìn)和后退方法,但對于瀏覽器滾動條并沒有提供相應(yīng)的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動條。WebDriver提供了execute_script()方法來執(zhí)行JavaScript代碼。
"""調(diào)用js代碼"""
from selenium import webdriver
from time import sleep
# 訪問百度
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 搜索
driver.find_element_by_id("kw").send_keys("測試")
driver.find_element_by_id('su').send_keys(Keys.ENTER)
sleep(2)
# 設(shè)置瀏覽器窗口大小
driver.set_window_size(500, 500)
# 通過javascript設(shè)置瀏覽器窗口的滾動條位置
js = "window.scrollTo(100,450);"
driver.execute_script(js)
sleep(10)
driver.quit()
通過Chrome瀏覽器打開百度進(jìn)行搜索,并且提前通過set_window_size()方法將瀏覽器窗口設(shè)置為固定寬高顯示,目的是讓窗口出現(xiàn)水平和垂直滾動條。然后通過execute_script()方法執(zhí)行JavaScripts代碼來移動滾動條的位置。
窗口截圖
自動化用例是由程序去執(zhí)行的,因此有時候打印的錯誤信息并不十分明確。如果在腳本執(zhí)行出錯的時候能對當(dāng)前窗口截圖保存,那么通過圖片就可以非常直觀地看出出錯的原因。WebDriver提供了截圖函數(shù)get_screenshot_as_file()來截取當(dāng)前窗口。
"""窗口截圖"""
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').send_keys(Keys.ENTER)
sleep(2)
# 截取當(dāng)前窗口,并指定截圖圖片的保存位置
driver.get_screenshot_as_file("C:\\Users\\pc\\PycharmProjects\\pythonProject1\\baidu_img.png")
driver.quit()
腳本運(yùn)行完成后打設(shè)置的截圖保存的路徑,就可以找到baidu_img.png圖片文件了。
關(guān)閉瀏覽器
在前面的例子中我們一直使用quit()方法,其含義為退出相關(guān)的驅(qū)動程序和關(guān)閉所有窗口。除此之外,WebDriver還提供了close()方法,用來關(guān)閉當(dāng)前窗口。多窗口的處理,在用例執(zhí)行的過程中打開了多個窗口,我們想要關(guān)閉其中的某個窗口,這時就要用到close()方法進(jìn)行關(guān)閉了。
close() 關(guān)閉單個窗口
quit() 關(guān)閉所有窗口
?這是我整理的《2024最新Python自動化測試全套教程》,以及配套的接口文檔/項目實(shí)戰(zhàn)【網(wǎng)盤資源】,需要的朋友可以下方視頻的置頂評論獲取。肯定會給你帶來幫助和方向。
【已更新】B站講的最詳細(xì)的Python接口自動化測試實(shí)戰(zhàn)教程全集(實(shí)戰(zhàn)最新版)