1.你是如何搭建ui自動(dòng)化框架的?
在搭建ui自動(dòng)化框架,使用的是po設(shè)計(jì)模式,也就是把每一個(gè)頁(yè)面所需要
操作的元素和步驟都封裝成一個(gè)頁(yè)面類中。然后使用selenium+unittest搭建
四層框架實(shí)現(xiàn)數(shù)據(jù)、腳本、業(yè)務(wù)邏輯分離(關(guān)鍵字驅(qū)動(dòng))。其中四層框架包括
基礎(chǔ)層(BasePage)、業(yè)務(wù)邏輯層(Pages)、數(shù)據(jù)層(Data)、測(cè)試用例層(Testcase)
1.基礎(chǔ)層(BasePage)
設(shè)計(jì)一個(gè)基本的Page類,所有頁(yè)面皆繼承該類。提供一個(gè)頁(yè)面需要實(shí)現(xiàn)的基本功能及公共方法。
2. 業(yè)務(wù)邏輯層(Pages)
按照PO設(shè)計(jì)模式,將每個(gè)頁(yè)面抽象為一個(gè)類,放在Pages包里面,每個(gè)頁(yè)面繼承Basepage,可調(diào)用Data層數(shù)據(jù),包括頁(yè)面所有的操作對(duì)象屬性和實(shí)現(xiàn)的功能
3.數(shù)據(jù)層(Data)
該層存放相關(guān)數(shù)據(jù),例如:用戶數(shù)據(jù)和密碼。在測(cè)試用例可通過調(diào)用數(shù)層的數(shù)據(jù)來進(jìn)行操作。
4. 測(cè)試用例層(Testcases)
每一個(gè)測(cè)試用例testcase都對(duì)應(yīng)Pages里面的一個(gè)頁(yè)面,繼承unnitest.TestCase類
通過調(diào)用對(duì)應(yīng)頁(yè)面類的方法,數(shù)據(jù)層的數(shù)據(jù)、增加斷言(assert)來驗(yàn)證功能的正確性。
此外通過Jenkins自動(dòng)執(zhí)行測(cè)試、代碼質(zhì)量檢測(cè)和部署到測(cè)試服務(wù)器、部署到生產(chǎn)服務(wù)器上
2.UI自動(dòng)化測(cè)試中定位方式有哪些,哪些是你常用的?
By ID
By Class Name
By Tag Name
By Name
By Link Text
By Partial Link Textzhi
By CSS Seletor
By XPath
3.UI自動(dòng)化測(cè)試有哪些缺點(diǎn)?如何改進(jìn)?
不穩(wěn)定,頁(yè)面經(jīng)常變,不好定位,不適合業(yè)務(wù)復(fù)雜和頻繁變動(dòng)的項(xiàng)目
改進(jìn):在項(xiàng)目中盡量使用顯示等待
4.請(qǐng)你描述一下在UI自動(dòng)化運(yùn)用的等待機(jī)制區(qū)別?
sleep()強(qiáng)制等待,設(shè)置固定休眠時(shí)間,執(zhí)行sleep()后線程休眠
而另外兩種線程不休眠
隱式等待,是設(shè)置的全局等待
顯示等待,是針對(duì)于某個(gè)特定的元素設(shè)置的等待時(shí)間
5.PO設(shè)計(jì)模式的原理?哪些地方能夠改善?
原理:
PO模式,全稱 Page object ,頁(yè)面對(duì)象模型。
將頁(yè)面的元素定位和元素行為封裝成一個(gè) page 類。
實(shí)現(xiàn)頁(yè)面對(duì)象和測(cè)試用例分離。
改善:
其中對(duì)對(duì)象庫(kù)層、邏輯層、業(yè)務(wù)層進(jìn)行了一系列封裝
6.Unittest框架有什么缺點(diǎn)?
1 不夠靈活,比如進(jìn)行 ui 自動(dòng)化設(shè)計(jì)時(shí),會(huì)多次打開瀏覽器,增加腳本運(yùn)行時(shí)間
2 測(cè)試報(bào)告不夠全面,沒有 pytest 的 allure 測(cè)試報(bào)告清晰美觀
7.Webdriver的原理
由于客戶端腳本(java, python, ruby)不能直接與瀏覽器通信,這時(shí)候可以把Webdriver 當(dāng)做一個(gè)翻譯器,它可以把客戶端代碼翻譯成瀏覽器可以識(shí)別的代碼(比如js).客戶端(也就是測(cè)試腳本)創(chuàng)建 1 個(gè) session,在該 session 中通過 http 請(qǐng)求向Webdriver 發(fā)送請(qǐng)求,Webdriver 翻譯成瀏覽器懂得腳本傳給瀏覽器,瀏覽器把執(zhí)行的結(jié)果返回給 Webdriver,Webdriver 把返回的結(jié)果做了一些封裝(一般都是 json 格式),然后返回給客戶端,根據(jù)返回值就能判斷對(duì)瀏覽器的操作是不是執(zhí)行成功。
8.selenium 中 hidden 或者是 display = none 的元素是否可以定位到?
不能
9.如何提高 selenium 腳本的執(zhí)行速度?
1減少操作步驟,減少腳本用例不必要的步驟
2設(shè)置等待時(shí)間的時(shí)候,可以
sleep 固定的時(shí)間,也可以檢測(cè)某個(gè)元素出現(xiàn)后中斷等待也可
以提高速度
3實(shí)現(xiàn)多線程。在編寫測(cè)試用例的時(shí)候,一定要實(shí)現(xiàn)松耦合,然后在服務(wù)器允許的情況下,
盡量設(shè)置多線程運(yùn)行,提高執(zhí)行速度。
10.如何實(shí)現(xiàn)多線程?
先寫一個(gè)run的函數(shù)
保證for循環(huán)能跑的通
在run函數(shù)上加個(gè)裝飾器 @threads(n),n是線程數(shù)
11.說一下XPATH定位的原理?
基于HTML的文檔目錄結(jié)構(gòu)進(jìn)行定位元素
12.selenium中如何判斷元素一定存在?
Presense_of_element_located
強(qiáng)制等待、隱性等待、顯性等待
1.強(qiáng)制等待--固定等待一段時(shí)間,即使設(shè)置一定的等待時(shí)間,也不能確保一定能夠定位到元素,因?yàn)槟銦o法知道頁(yè)面加載的時(shí)間,而且這種方法通常比較浪費(fèi)腳本執(zhí)行時(shí)間,效率低
2.隱性等待--設(shè)置最長(zhǎng)的等待時(shí)間,在這個(gè)時(shí)間內(nèi),當(dāng)元素被加載出現(xiàn)在dom樹中且頁(yè)面被完全加載完成之后,才執(zhí)行下一步操作,保證了腳本的穩(wěn)定性,但執(zhí)行效率相對(duì)較低,因?yàn)橥覀冎恍枰繕?biāo)元素出現(xiàn)即可,并不需要掙個(gè)頁(yè)面加載完成,而隱性等待要等待掙個(gè)頁(yè)面加載完才能執(zhí)行下一步,浪費(fèi)一定時(shí)間,那么為了解決這種弊端又引入了顯示等待。
3.顯示等待--顯示等待實(shí)現(xiàn)方式通過判斷某一個(gè)條件是否成立,如果成立就立即執(zhí)行下一步操作,不需要等待頁(yè)面加載完成,執(zhí)行效率高,腳本的穩(wěn)定性也相對(duì)較高
selenium原理
我們使用Selenium實(shí)現(xiàn)自動(dòng)化測(cè)試,主要需要3個(gè)東西
1.測(cè)試腳本,可以是python,java編寫的腳本程序(也可以叫做client端)
2.瀏覽器驅(qū)動(dòng),這個(gè)驅(qū)動(dòng)是根據(jù)不同的瀏覽器開發(fā)的,不同的瀏覽器使用不同的webdriver驅(qū)動(dòng)程序且需要對(duì)應(yīng)相應(yīng)的瀏覽器版本
3.瀏覽器,目前selenium支持市面上大多數(shù)瀏覽器,不同的瀏覽器使用不同的webdriver驅(qū)動(dòng)程序且需要對(duì)應(yīng)的瀏覽器版本
selenium工作過程
1.selenium client(python等語(yǔ)言編寫的自動(dòng)化測(cè)試腳本)初始化一個(gè)service服務(wù),通過webdriver啟動(dòng)瀏覽器驅(qū)動(dòng)程序chromedriver.exe
2.通過RemoteWebDriver向?yàn)g覽器驅(qū)動(dòng)程序發(fā)送HTTP請(qǐng)求,瀏覽器驅(qū)動(dòng)程序解析請(qǐng)求,打開瀏覽器,并獲得sessionid,如果再對(duì)瀏覽器操作需攜帶此id
3.打開瀏覽器后,所有的selenium的操作(訪問地址,查找元素)均通過RemoteConection鏈接到remote server,
然后使用execute方法調(diào)用request方法通過urlib3向remote server請(qǐng)求
4.瀏覽器通過請(qǐng)求的內(nèi)容執(zhí)行對(duì)應(yīng)動(dòng)作
5.瀏覽器再把執(zhí)行的動(dòng)作結(jié)果通過瀏覽器驅(qū)動(dòng)程序返回給測(cè)試腳本