UI 跑業務場景
接口自動化
單元自動化
Day12-Selenium自動化測試
1. 什么是自動化測試
讓程序代替人為去驗證程序功能的過程
自動化測試是把以人為驅動的測試行為轉化為機器執行的一種過程。
2. 為什么要進行自動化測試
1、解決回歸測試
2、解決壓力測試
3、解決兼容測試
4、提高測試效率,保證產品質量
3. 自動化測試所屬分類
- 黑盒測試(功能測試)
- 灰盒測試(接口測試)
- 白盒測試(單元測試)
注意:Web自動化測試屬於黑盒測試(功能測試)
4. 自動化測試優缺點
4.1. 優點
- 以較少時間運行更多的測試用例
- 自動化腳本可重復使用
- 減少人為的錯誤
- 測試數據存儲
- 不能取代手工測試
- 手工測試比自動化測試發現的缺陷多,實際測試里邊,手工bug 80%,自動化工具 20% (性能和功能)
- 測試人員技能要求,要懂編碼
4.2. 缺點
5. 自動化測試過程
自動化測試與軟件開發過程從本質上來講是一樣的,無非是利用自動化測試工具(相當於軟件開發工具),經過對測試需求的分析(軟件過程中的需求分析),設計出自動化測試用例(軟件過程中的需求規格),從而搭建自動化測試的框架(軟件過程中的概要設計),設計與編寫自動化腳本(詳細設計與編碼),測試腳本的正確性,從而完成該套測試腳本(即主要功能為測試的應用軟件)。
1) 自動化測試需求分析。
當測試項目滿足了自動化的前提條件,並確定在該項目中需要使用自動化測試時,我們便開始進行自動化測試需求分析。此過程需要確定自動化測試的范圍以及相應的測試用例、測試數據,並形成詳細的文檔,以便於自動化測試框架的建立。
2)自動化測試框架的搭建。
所謂自動化測試框架便是像軟件架構一般,定義了在使用該套腳本時需要調用哪些文件、結構,調用的過程,以及文件結構如何划分。
而根據自動化測試用例,我們很容易能夠定位出自動化測試框架的典型要素:
a. 公用的對象。
不同的測試用例會有一些相同的對象被重復使用,比如窗口、按鈕、頁面等。這些公用的對象可被抽取出來,在編寫腳本時隨時調用。當這些對象的屬性因為需求的變更而改變時,只需要修改該對象屬性即可,而無需修改所有相關的測試腳本。
b. 公用的環境。
各測試用例也會用到相同的測試環境,將該測試環境獨立封裝,在各個測試用例中靈活調用,也能增強腳本的可維護性。
c. 公用的方法。
當測試工具沒有需要的方法時,而該方法又會被經常使用,我們便需要自己編寫該方法,以方便腳本的調用。
d. 測試數據。
也許一個測試用例需要執行很多個測試數據,我們便可將測試數據放在一個獨立的文件中,由測試腳本執行到該用例時讀取數據文件,從而達到數據覆蓋的目的。
在該框架中需要將這些典型要素考慮進去,在測試用例中抽取出公用的元素放入已定義的文件,設定好調用的過程。
6. 自動化測試分類
- Web—(ui)自動化測試
- 接口自動化測試
- 移動(app)自動化測試
- 單元測試—自動化測試
7. 什么是Web自動化測試
讓程序代替人為去驗證web項目功能的過程
8. 什么web項目適合自動化測試
1) 需求變動不頻繁
測試腳本的穩定性決定了自動化測試的維護成本。如果軟件需求變動過於頻繁,測試人員需要根據變動的需求來更新測試用例以及相關的測試腳本,而腳本的維護本身就是一個代碼開發的過程,需要修改、調試,必要的時候還要修改自動化測試的框架,如果所花費的成本不低於利用其節省的測試成本,那么自動化測試便是失敗的。
項目中的某些模塊相對穩定,而某些模塊需求變動性很大。我們便可對相對穩定的模塊進行自動化測試,而變動較大的仍是用手工測試
2) 項目周期足夠長
自動化測試需求的確定、自動化測試框架的設計、測試腳本的編寫與調試均需要相當長的時間來完成,這樣的過程本身就是一個測試軟件的開發過程,需要較長的時間來完成。如果項目的周期比較短,沒有足夠的時間去支持這樣一個過程,那么自動化測試便成為笑談。
3) 自動化測試腳本可重復使用(項目需要回歸測試)
如果費盡心思開發了一套近乎完美的自動化測試腳本,但是腳本的重復使用率很低,致使其間所耗費的成本大於所創造的經濟價值,自動化測試便成為了測試人員的練手之作,而並非是真正可產生效益的測試手段了。
另外,在手工測試無法完成,需要投入大量時間與人力時也需要考慮引入自動化測試。比如性能測試、配置測試、大數據量輸入測試等。
9. 主流測試工具
Web自動化測試工具:selenium、QTP(全名HP QuickTest Professional software ), Robot Framework功能自動化測試框架
性能自動化測試工具:loadrunner、jmeter。
接口自動化測試工具:SoapUI、postman,jmeter,restclient
移動(app)自動化測試工具:robotium(Android自動化測試框架)、appium。monkey(壓力測試,隨機測試工具)、monkeyrunner
雲測平台:testin
10. 功能測試工具Selenium簡介
10.1. Selenium是什么
***** python中核心庫有哪些說出常用的5個:
https://blog.csdn.net/alice_tl/article/details/89815949?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-1-89815949.nonecase&utm_term=python%E5%B8%B8%E7%94%A8%E5%BA%93%E6%9C%89%E5%93%AA%E4%BA%9B&spm=1000.2123.3001.4430
Selenium是一款基於web應用程序的開源測試工具。
Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。
它支持Firefox、ie等眾多瀏覽器。
它同時支持JAVA、C#、Ruby、Python、PHP、Perl等眾多的主流語言。
Java+selenium
Python+selenium
Selenium原理/機制
https://blog.csdn.net/lemo_ice/article/details/102852147
https://blog.csdn.net/p312011150/article/details/80672703
10.2. Selenium特點
開源、跨平台,運行在瀏覽器中
簡單靈活、支持很多種語言
11. Selenium 核心組件
Selenium Core:支持DHTML 的測試案例(效果類似數據驅動測試),它是Selenium IDE 和Selenium RC的引擎
Selenium IDE 是一個Firefox 瀏覽器的一個插件,可以實現對瀏覽器的簡單操作的錄制與回放功能。一般用於測試人員在測試過程中發現bug,通過Selenium IDE 將重測試驟錄制下來,快速創建了bug 重現腳本,從而供開發人員容易重現bug。IDE 除了錄制回放外還可以導出錄制的腳本,並導出成多種語言,不同版本的Selenium 腳本,供測試人員快速開發腳本。
Selenium RC:Selenium Remote Control。Selenium RC 使用的是javascript注入的方式跟瀏覽器打交道。這樣 Selenium RC 需要啟動一個Server,然后將操作頁面元素的API 轉成javascript腳本,再把這段腳本注入到瀏覽器中去執行。而通過這種javascript注入的方式一來太依賴翻譯成javascript質量的好壞,二來javascript存在同源問題。這使測試變得不那么容易。
Selenium Grid:允許同時並行地、在不同的環境上運行多個測試任務,極大地加快Web 應用的功能測試。
12. Selenium 腳本環境配置
12.1. 安裝最新版本的火狐瀏覽器到c盤
12.2. 配置火狐瀏覽器的系統環境變量到path
12.3. 將geckodriver放到火狐(最新版本)下邊
12.4. 在python的Scripts文件夾下邊,在線下載selenium的庫
1、python中pip是用來安裝python第三方庫的工具。
2、安裝 pip install -U selenium
3、卸載 pip unstall selenium
4、查看 pip show selenium
12.5. 打開PyCharm,查看selenium是否安裝成功
13. Selenium IDE安裝配置
13.1. 安裝Firefox 瀏覽器
傻瓜式安裝
13.2. 安裝Selenium
打開火狐組件
選擇本地安裝文件
13.3. 顯示菜單欄
13.4. 查看工具欄-如果安裝不上,請多試幾次
13.5. 安裝成功
command:表示要進行打開點擊操作所要執行的命令。
1、open:顧名思義,打開指定的url、 www.baidu.com
2、clickAndWait:命令,表示進行點擊操作、其中有AndWait表示頁面需要進行刷新、
3、type:設置輸入關鍵字 美女
target:執行命令的對象。需要找到link才可以執行 clickAndWait操作。
其中target:是按照css或者Xpath的語法在頁面尋找到對應元素。
1、指的是你當前錄制時的開始連接地址。
2、這里就是你的測試用例,剛開始錄制好之后都是沒有命名的。
3、腳本命令內容,command:方法關鍵字;Target:元素定位;Value:參數。
4、新建和修改腳本的地方。
5、日志輸出。
6、右上角的紅色圓,空心的時候表示的正在錄制,實心表示錄制結束。
五、錄制第一個腳本,打開www.baidu.com,再輸入框輸入Selenium,點擊百度一下按鈕。我們只需要打開seleniumIDE,然后在Firefox中操作以上步驟,之后打開seleniumIDE關閉錄制按鈕,生成腳本。
14. Selenium執行流程演示
14.1. 錄制過程
14.2. 將資料中ptest拷貝到tomcat下的webapp下,啟動tomcat
如果tomcat啟動不成功,9成是jdk出問題
環境變量重新配置
JAVA_HOME C:\java
%JAVA_HOME%\bin;
14.3. 在PyCharm中創建測試項目
14.4. 使用selenium IDE進行錄制
火狐瀏覽器打開:http://localhost:8081/ptest/regist.jsp
錄制結束,停止
打開某一個,看參數變量,變量值
Target目標,value值,
14.5. 導出測試用例
14.6. 導出測試用例文件
14.7. 導入到pyCharm中
復制loginTest1.py文件,粘貼到python中
代碼很多,簡要分析下:
1、setup()里面大部分熟悉,不過有些還是第一次見:
self.verificationErrors = [] #腳本運行時,錯誤的信息將被打印到這個列表中。
self.accept_next_alert = True #是否繼續接受下一下警告
2、teardown()下的代碼:self.assertEqual([], self.verificationErrors) 是個難點,對前面verificationErrors方法獲得的列表進行比較;如查verificationErrors的列表不為空,輸出列表中的報錯信息。這個東西,也可以將來被你自己更好的調用和使用,根據自己的需要寫入你希望的信息。
14.8. 執行測試
15. 什么是WebDriver
WebDriver 提供一套更加面向對象,更易於使用的API,同時更容易操作瀏覽器和頁面元素。所以現在我們學習Senlium 時更加推薦學習WebDriver。
16. Selenium WebDriver查找頁面元素及元素操作
16.1. 元素常用定位方法
Id name classname xpath
- 通過id定位元素:find_element_by_id("id_vaule")
- 通過name定位元素:find_element_by_name("name_vaule")
- 通過tag_name定位元素:find_element_by_tag_name("tag_name_vaule")
- 通過class_name定位元素:find_element_by_class_name("class_name")
- 通過css定位元素:find_element_by_css_selector();用css定位是比較靈活的
- 通過xpath定位元素:find_element_by_xpath("xpath")
- 通過link_text定位:driver.find_element_by_link_text("新聞").click()
- 通過partial link_text 定位:driver.find_element_by_partial_link_text("聞").click()
- Id,name,class name:為元素屬性定位
- tag_name:為元素標簽
- link text 、partial link text:為超鏈接定位(a標簽)
- Xpath:為元素路徑
- Css :為css元素選擇器定位
- Firebug是firefox下的一個擴展,能夠調試所有網站語言,如Html,Css等,但FireBug最吸引人的就是javascript調試功能,使用起來非常方便,而且在各種瀏覽器下都能使用,是一整套完整而強大的 WEB開發工具。
- FirePath是一個Firebug擴展,它添加了一個開發工具來編輯、檢查和生成XPath 1.0表達式、CSS 3選擇器和JQuery選擇器。
- Firefinder是Firebug的一個附加組件,它可以幫助找到匹配選定的CSS選擇器(s)或XPath表達式的HTML元素。你也可以在懸停或通過上下文菜單時自動選擇元素。
查看結果,然后通過friendfire特性與朋友分享,或者點擊檢查,在Firebug的HTML選項卡中找到對應的元素。
16.2. 定位分類總結
16.3. 安裝fireBug和firePath,firefinder
打開附加組件,搜索firebug,firefinder,firepath依次安裝
16.4. 定位元素
下面是百度輸入框的html代碼,可以通過firebug或者谷歌的審查元素得:
<input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
16.4.1. 通過id定位:
則百度的輸入框即可表示為:find_element_by_id(“kw1”)
16.4.2. 通過name定位:
則可以表示為:find_element_by_name(“wd”)
16.4.3. 通過class_name定位元素:
driver.find_element_by_class_name("s_ipt")
16.4.4. 通過tag_name定位:
input其實就是tag_name(標簽名),
同樣也可以表示成:find_element_by_tag_name("input")
返回:符合條件的第一個標簽
可見僅僅通過標簽名去定位時,一般一種標簽在一個頁面里面會出現不止一次甚至大量出現,這種定位方式的作用不是很大,所以用的也就比較少
16.4.5. 通過css定位元素:
Id>類選擇器>標簽選擇器
cssSelector這種元素定位方式跟xpath比較類似,但執行速度較快,而且各種瀏覽器對它的支持都相當到位
一般class是用.標記,id是用#標記,標簽名直接寫具體標簽名就好
find_element_by_css_selector("#su")
find_element_by_css_selector(".s_ipt")
find_element_by_css_selector("[name=wd]")
16.4.6. 通過xpath定位元素:
XPath是一種在XML文檔中定位元素的語言。因為HTML可以看做XML的一種實現,所以selenium用戶可是使用這種強大語言在web應用中定位元素。
XPATH的值可以通過firebug或者谷歌的審查元素中:
右鍵功能:復制XPATH即可獲得。
例子:
driver.find_element_by_xpath(".//input[@id='kw']")
driver.find_element_by_xpath(".//*[@id='kw']")
其中的標簽名input也可以用*來代替,而且只要是在該標簽內,任意屬性都可以
16.4.7. 通過link_text、partial_link_text定位:
這兩種定位方式是專門用於定位超鏈接的,也就是對應html頁面中的<a>標簽,括號里傳的值就是a標簽中的超鏈接文字,兩者的區別在於一個是完整的超鏈接文字,一個是可以只寫部分超鏈接文字。
比如點擊百度首頁中右上角的新聞超鏈接,可以這樣去定位:
driver.find_element_by_link_text("新聞").click()
driver.find_element_by_partial_link_text("聞").click()
鼠標事件和鍵盤事件
https://www.cnblogs.com/mashuqi/p/10442150.html
16.5. elements復數定位
在上面的例舉的八中基本定位方式種,都有對應的復數形式,分別是下面:
id復數定位find_elements_by_id()
name復數定位find_elements_by_name()
這些復數定位方式每次取到的都是具有相同類型屬性的一組元素,所以返回的是一個list隊列,我們也可以利用這個去定位單個的元素。比如百度首頁種,右上角有新聞、視頻、地圖、貼吧等一些鏈接,我們通過f12查看源碼可以發現,這些鏈接都有共同的class, class="mnav"。
舉個例子,比如定位排在第六個的學術,可以這樣定位:driver.find_elements_by_class_name("mnav")[5].click()
總結
1. 當頁面元素有id屬性時,最好盡量用id來定位。但由於現實項目中很多程序員其實寫的代碼並不規范,會缺少很多標准屬性,這時就只有選擇其他定位方法。
2. xpath很強悍,但定位性能不是很好,所以還是盡量少用。如果確實少數元素不好定位,可以選擇xpath或cssSelector。
3. 當要定位一組元素相同元素時,可以考慮用tagName或name。
4. 當有鏈接需要定位時,可以考慮linkText或partialLinkText方式。
16.6. 簡單元素操作
clear()清除文本
send_keys(*value) 模擬按鍵輸入
click()單擊元素
size 返回元素的尺寸
text 獲取元素的文本
get_attribute(name)獲取屬性值
is_displayed()設置該元素是否可見 判斷元素是否可見 是否可用 is_enable() 了解
selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <a class="mnav" href="http://news.baidu.com" name="tj_trnews"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed
17. 鍵盤事件---(了解)
send_keys()模擬鍵盤輸入 from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE) 刪除鍵 * 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') 復制(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 |
18. 設置元素等待
Selenium顯示等待和隱式等待的區別 |
18.1. 顯式等待
element=WebDriverWait(driver,timeout, poll_frequency=0.5,ignored_exceptions=None).until( EC.presence_of_element_located((By.ID, "kw")) ) driver 瀏覽器驅動 timeout 最長超時時間 默認以秒為單位 poll_frequency=0.5 步長 ignored_exceptions 超時后的異常信息 默認拋noSuchElementException EC.presence_of_element_located((By.ID, "kw")) 判斷元素是否被加載在dom樹中,不代表他一定可見。 |
18.2. 隱式等待
含義:通過一定時長等待,如果超出設置的時長元素還沒有被加載,拋出NosuchException. # 設置隱式等待為 10 秒 driver.implicitly_wait(10) |
18.3. sleep休眠方法
Time.sleep(1) |
19. 瀏覽器的基本操作
選擇瀏覽器: driver = webdriver.Firefox()
打開url: driver.get(self.base_url + " www.baidu.com")
前進/后退: driver.forward()/driver.back()
刷新: driver.refresh()
最大化:browser.maximize_window()
返回當前頁面標題:print(driver.title)
返回當前頁面url:print(driver.current_url)
返回當前瀏覽器的所有窗口:driver.window_handles
返回當前瀏覽器的窗口句柄:driver.current_window_handle
選擇窗口: driver.switch_to_window(“window_name”)
對話框操作: driver.switch_to_alert() #選擇窗口對象
#瀏覽器最大化
driver.maximize_window()
#設置瀏覽區寬高
driver.set_window_size(480, 800)
截取當前頁面: driver.get_screenshot_as_file("C:/Users/Administrator/Desktop/selenium/baidu.png")
關閉瀏覽器: driver.quit()/driver.close()
19.1. 生成HTML測試報告
19.1.1. 拷貝HTMLTestRunner.py到當前項目
19.2. 新建一個py類
if __name__ == '__main__':
|
19.3. 將生成報告通過郵件發送到指定人員郵箱
19.3.1. 開啟郵箱的授權密碼
導入工具類,執行代碼
注意:
1、關於導包,在方法體中 alt+enter實現導包
2、密碼是 授權密碼
3、關於路徑,不要復制粘貼,注意\\
4、可以設置多個接收郵箱地址
5、注意書寫過程,中英文字符不要出錯
20. 注冊登錄優化
def test_loginn(self):
login = open("csv.txt", "r", encoding="gbk")
for lo in login.readlines():
name = lo.split(",")
login.close()
driver = self.driver
driver.get(self.base_url + "/ptest/regist.jsp")
driver.find_element_by_id("username").clear()
driver.find_element_by_id("username").send_keys(name[0])
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys(name[1])
# driver.find_element_by_name("phone").clear()
# driver.find_element_by_name("phone").send_keys("123")
# driver.find_element_by_name("phone").clear()
# driver.find_element_by_name("phone").send_keys("123789")
# driver.find_element_by_id("email").clear()
# driver.find_element_by_id("email").send_keys("1234567@qq.com")
driver.find_element_by_xpath(".//*[@id='email']").clear()
driver.find_element_by_xpath(".//*[@id='email']").send_keys(name[3])
driver.find_element_by_css_selector("input[type=\"submit\"]").click()
p = driver.find_element_by_xpath("html/body/p").text
try:
self.assertEqual(p,"注冊成功")
except:
print("注冊失敗了")
else:
driver.find_element_by_link_text(u"登錄").click()
driver.find_element_by_id("username").clear()
driver.find_element_by_id("username").send_keys("zhangsan")
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("123")
driver.find_element_by_css_selector("input[type=\"submit\"]").click()