selenium 自動化測試web端


UI  跑業務場景  

接口自動化   

單元自動化   

 

 

Day12-Selenium自動化測試 

1. 什么是自動化測試

讓程序代替人為去驗證程序功能的過程

自動化測試是把以人為驅動的測試行為轉化為機器執行的一種過程

2. 為什么要進行自動化測試

1、解決回歸測試

2、解決壓力測試

3、解決兼容測試

4、提高測試效率,保證產品質量

3. 自動化測試所屬分類

  1. 黑盒測試(功能測試)
  2. 灰盒測試(接口測試)
  3. 白盒測試(單元測試)

注意:Web自動化測試屬於黑盒測試(功能測試)

4. 自動化測試優缺點

4.1. 優點

  1. 以較少時間運行更多的測試用例
  2. 自動化腳本可重復使用
  3. 減少人為的錯誤
  4. 測試數據存儲
  5. 不能取代手工測試
  6. 手工測試比自動化測試發現的缺陷多,實際測試里邊,手工bug 80%,自動化工具 20% (性能和功能)
  7. 測試人員技能要求,要懂編碼

4.2. 缺點

 

 

5. 自動化測試過程

自動化測試與軟件開發過程從本質上來講是一樣的,無非是利用自動化測試工具(相當於軟件開發工具),經過對測試需求的分析(軟件過程中的需求分析),設計出自動化測試用例(軟件過程中的需求規格),從而搭建自動化測試的框架(軟件過程中的概要設計),設計與編寫自動化腳本詳細設計編碼),測試腳本的正確性,從而完成該套測試腳本(即主要功能為測試的應用軟件)。

1) 自動化測試需求分析

當測試項目滿足了自動化的前提條件,並確定在該項目中需要使用自動化測試時,我們便開始進行自動化測試需求分析。此過程需要確定自動化測試的范圍以及相應的測試用例、測試數據,並形成詳細的文檔,以便於自動化測試框架的建立。

2)自動化測試框架的搭建。

所謂自動化測試框架便是像軟件架構一般,定義了在使用該套腳本時需要調用哪些文件、結構,調用的過程,以及文件結構如何划分。

而根據自動化測試用例,我們很容易能夠定位出自動化測試框架的典型要素:

a. 公用的對象

不同的測試用例會有一些相同的對象被重復使用,比如窗口、按鈕、頁面等。這些公用的對象可被抽取出來,在編寫腳本時隨時調用。當這些對象的屬性因為需求的變更而改變時,只需要修改該對象屬性即可,而無需修改所有相關的測試腳本

b. 公用的環境。

測試用例也會用到相同的測試環境,將該測試環境獨立封裝,在各個測試用例中靈活調用,也能增強腳本的可維護性。

c. 公用的方法。

當測試工具沒有需要的方法時,而該方法又會被經常使用,我們便需要自己編寫該方法,以方便腳本的調用。

d. 測試數據。

也許一個測試用例需要執行很多個測試數據,我們便可將測試數據放在一個獨立的文件中,由測試腳本執行到該用例時讀取數據文件,從而達到數據覆蓋的目的。

在該框架中需要將這些典型要素考慮進去,在測試用例中抽取出公用的元素放入已定義的文件,設定好調用的過程。

6. 自動化測試分類

  1. Web—(ui)自動化測試
  2. 接口自動化測試
  3. 移動(app)自動化測試
  4. 單元測試—自動化測試

 

 

7. 什么是Web自動化測試

讓程序代替人為去驗證web項目功能的過程

8. 什么web項目適合自動化測試

1) 需求變動不頻繁

測試腳本的穩定性決定了自動化測試的維護成本。如果軟件需求變動過於頻繁,測試人員需要根據變動的需求來更新測試用例以及相關的測試腳本,而腳本的維護本身就是一個代碼開發的過程,需要修改、調試,必要的時候還要修改自動化測試的框架,如果所花費的成本不低於利用其節省的測試成本,那么自動化測試便是失敗的。

項目中的某些模塊相對穩定,而某些模塊需求變動性很大。我們便可對相對穩定的模塊進行自動化測試,而變動較大的仍是用手工測試

 

2) 項目周期足夠長

 

自動化測試需求的確定、自動化測試框架的設計、測試腳本的編寫與調試均需要相當長的時間來完成,這樣的過程本身就是一個測試軟件的開發過程,需要較長的時間來完成。如果項目的周期比較短,沒有足夠的時間去支持這樣一個過程,那么自動化測試便成為笑談。

 

3) 自動化測試腳本可重復使用(項目需要回歸測試)

如果費盡心思開發了一套近乎完美的自動化測試腳本,但是腳本的重復使用率很低,致使其間所耗費的成本大於所創造的經濟價值,自動化測試便成為了測試人員的練手之作,而並非是真正可產生效益的測試手段了。

另外,在手工測試無法完成,需要投入大量時間與人力時也需要考慮引入自動化測試。比如性能測試配置測試、大數據量輸入測試等。

9. 主流測試工具

Web自動化測試工具:selenium、QTP(全名HP QuickTest Professional software ), Robot Framework功能自動化測試框架

性能自動化測試工具:loadrunner、jmeter。 

接口自動化測試工具:SoapUI、postmanjmeterrestclient

移動(app自動化測試工具:robotiumAndroid自動化測試框架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測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。

它支持Firefoxie等眾多瀏覽器。

它同時支持JAVAC#RubyPythonPHPPerl等眾多的主流語言。

 

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 重現腳本,從而供開發人員容易重現bugIDE 除了錄制回放外還可以導出錄制的腳本,並導出成多種語言,不同版本的Selenium 腳本,供測試人員快速開發腳本。

 

Selenium RCSelenium Remote ControlSelenium 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:表示要進行打開點擊操作所要執行的命令。

          

          1open:顧名思義,打開指定的urlwww.baidu.com

          2clickAndWait:命令,表示進行點擊操作、其中有AndWait表示頁面需要進行刷新、

          3type:設置輸入關鍵字 美女

 

          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

 

 

代碼很多,簡要分析下:

1setup()里面大部分熟悉,不過有些還是第一次見:

self.verificationErrors = []  #腳本運行時,錯誤的信息將被打印到這個列表中。

self.accept_next_alert = True  #是否繼續接受下一下警告

 

2teardown()下的代碼:self.assertEqual([], self.verificationErrors) 是個難點,對前面verificationErrors方法獲得的列表進行比較;如查verificationErrors的列表不為空,輸出列表中的報錯信息。這個東西,也可以將來被你自己更好的調用和使用,根據自己的需要寫入你希望的信息。

14.8. 執行測試

 

 

15. 什么是WebDriver

WebDriver 提供一套更加面向對象,更易於使用的API,同時更容易操作瀏覽器和頁面元素。所以現在我們學習Senlium 時更加推薦學習WebDriver。

 

16. Selenium WebDriver查找頁面元素及元素操作

16.1. 元素常用定位方法

 Id  name  classname  xpath

  1. 通過id定位元素:find_element_by_id("id_vaule")
  2. 通過name定位元素:find_element_by_name("name_vaule")
  3. 通過tag_name定位元素:find_element_by_tag_name("tag_name_vaule")
  4. 通過class_name定位元素:find_element_by_class_name("class_name")
  5. 通過css定位元素:find_element_by_css_selector();css定位是比較靈活的
  6. 通過xpath定位元素:find_element_by_xpath("xpath")
  7. 通過link_text定位driver.find_element_by_link_text("新聞").click()
  8. 通過partial link_text 定位:driver.find_element_by_partial_link_text("").click()
  9. Idnameclass name:為元素屬性定位
  10. tag_name:為元素標簽
  11. link text partial link text:為超鏈接定位(a標簽)
  12. Xpath:為元素路徑
  13. Css :為css元素選擇器定位
  14. Firebugfirefox下的一個擴展,能夠調試所有網站語言,如Html,Css等,但FireBug最吸引人的就是javascript調試功能,使用起來非常方便,而且在各種瀏覽器下都能使用,是一整套完整而強大的 WEB開發工具。
  15. FirePath是一個Firebug擴展,它添加了一個開發工具來編輯、檢查和生成XPath 1.0表達式、CSS 3選擇器和JQuery選擇器。
  16. FirefinderFirebug的一個附加組件,它可以幫助找到匹配選定的CSS選擇器(s)或XPath表達式的HTML元素。你也可以在懸停或通過上下文菜單時自動選擇元素。
    查看結果,然后通過friendfire特性與朋友分享,或者點擊檢查,在FirebugHTML選項卡中找到對應的元素。

16.2. 定位分類總結

16.3. 安裝fireBug和firePath,firefinder

 

打開附加組件,搜索firebugfirefinderfirepath依次安裝

 

 

 

 

 

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_textpartial_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顯示等待和隱式等待的區別
1、selenium的顯示等待
原理:顯示等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那么久跳出Exception
(簡而言之,就是直到元素出現才去操作,如果超時則報異常)

2、selenium的隱式等待
原理:隱式等待,就是在創建driver時,為瀏覽器對象創建一個等待時間,這個方法是得不到某個元素就等待一段時間,直到拿到某個元素為止。

注意:在使用隱式等待的時候,實際上瀏覽器會在你自己設定的時間內部不斷的刷新頁面去尋找我們需要的元素

3、笨方法等待(死等)
使當前線程進入等待,time.sleep();這種等待屬於死等,很容易讓線程掛掉,使程序拋異常,所以要慎用此方法

 

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)

返回當前頁面urlprint(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__':
    suite = unittest.TestSuite()
    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CSDN))
    #  定義生成測試報告的名稱
    filename1=r""+str(time.strftime('%Y%m%d%H%M%S'))+".html"
    fp = open(filename1, 'wb')
    # 定義測試報告的路徑,標題,描述等內容
    runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自動化測試報告',description=u'自動化測試報告')
    runner.run(suite)

 

 

 

 

 

 

 

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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM