软件测试面试题整理(一)之自动化测试题大合集
https://blog.csdn.net/weixin_45912307/article/details/109438188
1 什么是POM,為什么要使用它?
- POM是Page Object Model的簡稱,它是一種設(shè)計思想,而不是框架。大概的意思是,把一個一個頁面,當(dāng)做一個對象,頁面的元素和元素之間操作方法就是頁面對象的屬性和行為,所以自然而然就用了類的思想來組織我們的頁面。一般一個頁面寫一個類文件,這個類文件包含該頁面的元素定位和業(yè)務(wù)操作方法
- 為了我們測試用例寫的簡單,清晰,我們很多時候在頁面對象會封裝很多業(yè)務(wù)操作方法,測試腳本只需要調(diào)用相關(guān)方法就可以。
2如果頁面元素經(jīng)常發(fā)生需求變化,你是如何做?
- 采用POM思想。好處就是只要改一個頁面,我就去修改這個頁面對象的元素定位和相關(guān)方法,腳本不需要修改。
3 在你做自動化過程中,遇到了什么問題嗎?舉例下
- 頻繁地變更UI,經(jīng)常要修改頁面對象里面代碼
- 運行用例報錯和處理,例如元素不可見,元素找不到這樣異常
- 測試腳本復(fù)用,盡可能多代碼復(fù)用
- 一些新框架產(chǎn)生的頁面元素定位問題,例如ck編輯器,動態(tài)表格等
4 舉例一下你遇到過那些異常,在selenium自動化測試過程中
- ElementNotSelectableException :元素不能選擇異常
- ElementNotVisibleException :元素不可見異常
- NoSuchAttributeException :沒有這樣屬性異常
- NoSuchElementException:沒有該元素異常
- NoSuchFrameException :沒有該frame異常
- TimeoutException : 超時異常
- Element not visible at this point :在當(dāng)前點元素不可見
5 如何處理alert彈窗
- 我們常見的alert彈窗有兩種:基于windows彈窗和基于web頁面彈窗
- webdriver是能夠處理alert彈窗的,Selenium提供了Alert這個接口。
- 相關(guān)操作代碼如下:
Alert alert = driver.switchTo().alert() // 切換到Alert
alert.accept() // 點擊彈窗上確定按鈕
alert.dismiss() // 點擊彈窗的取消按鈕
alert.getText() // 獲取彈窗上線上的文本文字內(nèi)容
alert.sendkeys() // 有些彈窗還支持文本輸入,這個可以把要輸入字符通過sendkeys方法輸入
6 在selenium中如何處理多窗口?
- 這個多窗口之間跳轉(zhuǎn)處理,在實際selenium自動化測試經(jīng)常遇到。就是,你點擊一個鏈接,這個鏈接會在一個新的tab打開,然后你接下來要查找元素在新tab打開的頁面,所以這里需要用到swithTo方法。
- 需要獲取當(dāng)前瀏覽器多窗口句柄,然后根據(jù)判斷跳轉(zhuǎn)新句柄還是舊句柄
7 你查找元素遇到過在Frame里面嗎?你是如何處理Frame里面元素定位的?
有時候我們知道元素定位表達(dá)式?jīng)]有問題,但是還是提示no such element,那么我們就需要考慮這個元素是否在frame中。如果在,我們就需要從topwindow,通過swithcTo.Frame()方法來切換到目標(biāo)frame中,可以通過frame的name、id和index三種方法來定位frame。
8 如何處理下拉菜單?
- 通常我們也可以通過Click方法來點擊下拉菜單里面的元素,還有一種方法,在Selenium中有一個類叫Select,支持這種下拉菜單交互的操作。
- 基本使用語法是這樣的:
9 關(guān)閉瀏覽器中quit和close的區(qū)別?
- close是關(guān)閉你當(dāng)前聚焦的tab頁面;
- 而quit是關(guān)閉全部瀏覽器tab頁面,并退出瀏覽器session;
- quit一般用在結(jié)束測試之前的操作,close用在執(zhí)行用例過程中關(guān)閉某一個頁面的操作
10 什么是imlicitlyWait(隱式等待)
- webdriver 會在指定的超時時間范圍內(nèi)不斷的查找元素,直到找到元素或超時
11 什么是expliciteWait(顯式等待)
- 通常是我們自定義的一段代碼,這段代碼用來等待某種條件發(fā)生后,再繼續(xù)執(zhí)行后續(xù)的代碼
12 如何實現(xiàn)文件上傳?
我們在web頁面實現(xiàn)文件上傳過程中,可以直接把文件在磁盤完整路徑,通過sendKeys方法實現(xiàn)上傳
13 如何實現(xiàn)鼠標(biāo)懸停,鍵盤事件和拖拽動作?
- 在Webdriver中,處理鍵盤事件和鼠標(biāo)事件,一般使用Actions類提供的方法,包括鼠標(biāo)懸停,拖拽和組合鍵輸入。
- 這里介紹幾個方法
- 方法: clickAndHold()
使用場景:找到一個元素,點擊鼠標(biāo)左鍵,不放手。自己可以點擊鼠標(biāo)不松開試試這個場景。 - 方法:contentClick()
使用場景:模擬鼠標(biāo)右鍵點擊,一般右鍵會帶出菜單來。 - 方法:doubelClick()
使用場景:模擬鼠標(biāo)雙擊 - 方法:dragAndDrop(source,target)
使用場景:模擬從source這個位置,拖拽一個元素到target位置 - 鍵盤事件方法:keyDown(keys.ALT), keyUp(keys.SHIFT)
使用場景:點擊鍵盤事件,分為兩個動作,一個點擊鍵盤,第二個動作是釋放點擊(松開)
- 方法: clickAndHold()
14 在selenium自動化測試中,你一般完成什么類型的測試?
主要是冒煙測試和回歸測試。回歸測試主要寫一些功能穩(wěn)定,容易實現(xiàn)的場景,通過自動化手段去實現(xiàn),節(jié)約測試時間。
15 你是如何管理你的測試用例并執(zhí)行?
通過單元測試框架實現(xiàn),常見的有unittest、pytest
16 自動化測試報告生成
Allure
17 你會封裝自動化測試框架嗎?
- 自動化框架主要的核心框架就是分層+PO模式:
- 分別為:基礎(chǔ)封裝層BasePage,PO頁面對象層,TestCase測試用例層。然后再加上日志處理模塊,ini配置文件讀取模塊,unittest+ddt數(shù)據(jù)驅(qū)動模塊,jenkins持續(xù)集成模式組成。
18 自動化測試有誤報過bug嗎?產(chǎn)生誤報怎么辦?
- 有誤報過,有時候自動化測試報告中顯示發(fā)現(xiàn)了bug,實際去通過手工測試去確認(rèn)又不存在該bug。
- 誤報原因一般是:
- 1.元素定位不穩(wěn)定,需要盡量提高腳本的穩(wěn)定性;
- 2.開發(fā)更新了頁面但是測試沒有及時更新維護(hù)!
19 自動化測試過程中,你遇到了哪些問題,是如何解決的?
- 1.頻繁地變更頁面,經(jīng)常要修改頁面對象類里面的代碼
- 2.自動化測試偶爾出現(xiàn)過誤報
- 3.自動化測試結(jié)果出現(xiàn)覆蓋的情況:Jenkins根據(jù)時間建立文件夾
- 4.自動化測試代碼維護(hù)比較麻煩
- 5.自動化測試進(jìn)行數(shù)據(jù)庫對比數(shù)據(jù)
20 在上一家公司做自動化測試用的什么框架?
可以說出以下自己擅長的一種:
- 1.python+selenium+unittest+htmltestrunner
- 2.python+selenium+pytest+allure
- 3.robotframework+Selenium2Library
21 遇到frame框架頁面怎么處理?
- 先用driver.switch_to.frame()跳轉(zhuǎn)進(jìn)去frame,
- 然后再操作頁面元素,
- 操作完后使用driver.swith_to.default_content()跳轉(zhuǎn)出來
22 遇到alert彈出窗如何處理?
- 使用driver.switch_to.alert()方法先跳轉(zhuǎn)到alert彈出窗口
- 然后再通過accept點擊確定按鈕;
- 通過dismiss點擊取消難;
- 通過text獲得彈出窗口的文本;
23 什么是斷言
- 斷言assert 用于代碼中驗證實際結(jié)果符合預(yù)期結(jié)果,如果測試用例失敗,則拋出異常并且提供斷言日志
24 如何提高selenium腳本的執(zhí)行速度
- 1、優(yōu)化等待時間,使用WebDriverWait智能等待代替強制等待sleep和隱式等待imlicitlyWait
- 2、減少不必要的操作
- 3、在服務(wù)器允許的情況下,使用多線程實現(xiàn)并發(fā)執(zhí)行測試用例
25 怎么對含有驗證碼的功能進(jìn)行自動化測試
- 圖像識,難度大,效果不好不推薦
- 屏蔽驗證碼,邀請開發(fā)處理,在測試環(huán)境,預(yù)發(fā)和正式環(huán)境恢復(fù)
- 通過數(shù)據(jù)庫抓取驗證碼
26 自動化測試分為哪幾類
- UI自動化:又分為web和和app自動化
- 接口自動化
27 自動化測試的使用場景?
- 需求穩(wěn)定,不會頻繁變更。
- 研發(fā)和測試周期長,需要頻繁執(zhí)行回歸測試。
- 需要在多種平臺上重復(fù)運行相同測試的場景。
- 某些測試項目,通過手工測試無法實現(xiàn),或者手工成本太高。
- 被測軟件的開發(fā)較為規(guī)范,能夠保證系統(tǒng)的可測試行
28 請描述一下自動化測試流程?
- 1.編寫自動化測試計劃
- 2.設(shè)計自動化測試用例
- 3.編寫自動化測試框架和腳本
- 4.調(diào)試并維護(hù)腳本
- 5.無人值守測試
- 6.后期腳本維護(hù)(添加用例、開發(fā)更新版本)
29 一個接口的響應(yīng)在下一個接口中怎么用?(一個請求依賴另一個請求的返回結(jié)果)
- cookie 全局變量 反射
- 存儲到excel表,需要時再取
- 框架里邊的期望結(jié)果: 查庫 依賴用戶成功之后
30 web和app自動化有什么不同?
-
1 啟動差別
- app端:在執(zhí)行用例的時候,一部安卓手機同一時刻只能打開一個apk包進(jìn)行操作
- web端:在web端,通過Python多線程(或多進(jìn)程)同時開啟幾個瀏覽器,讓selenium對多個瀏覽器進(jìn)行操作;
-
2 安裝檢查
- app端:需要先檢查軟件是否安裝才能進(jìn)行測試
- web端:不需要安裝,在瀏覽器中輸入url就可以測試。
-
3 頁面元素操作
- app端:需要保證不可見的元素顯示在手機頁面才能對它進(jìn)行操作。
- web端:如果遇到需要下拉才能加載的頁面,可以用js操作滾動條。
-
4 元素定位
-
app端:部分定位方式不支持,比如css_selector和link_text
-
web端:name,id,class_name,css,xpath、link_text、partrail_link_text、tag_name、坐標(biāo)、圖像識別
-
-
5 啟動方式
- app端:需要制定desired_caps內(nèi)容,因為里面包含了設(shè)備信息等。
- web端:通過啟動webdriver不同的瀏覽器類,獲取driver,如webdriver.Chrome(),也可以模擬手機端加載wap頁面做wap頁面的測試。
31 unitest和pytest框架講解以及使用的是哪個一個為什么不用另一個?
- 較unittest,pytest有以下優(yōu)點
- 自動發(fā)現(xiàn)測試模塊、測試方法
- 斷言使用asert+表達(dá)式
- 可以設(shè)置會話級、模塊級、類級、函數(shù)級的fixtures、數(shù)據(jù)準(zhǔn)備+清理工作
- 有豐富的插件庫,目前在300個以上。
32 分別說出web和app元素定位方法
- Web:id、xpath、name、class_name、tag_name、link_text、partial_link_text、css_selector
- app: id、classname、xpath
33 get和post不同點
- GET - 從指定的資源請求數(shù)據(jù)。請求的數(shù)據(jù)會附加在URL之后,以?分割URL和傳輸數(shù)據(jù),多個參數(shù)用&連接
- POST - 向指定的資源提交要被處理的數(shù)據(jù)。POST請求會把請求的數(shù)據(jù)放置在HTTP請求包的包體中
34 http和https不同點
-
1、HTTPS 協(xié)議需要到 CA (Certificate Authority,證書頒發(fā)機構(gòu))申請證書,一般免費證書較少,因而需要一定費用。(以前的網(wǎng)易官網(wǎng)是http,而網(wǎng)易郵箱是 https 。)
-
2、HTTP 是超文本傳輸協(xié)議,信息是明文傳輸,HTTPS 則是具有安全性的 SSL 加密傳輸協(xié)議。
-
3、HTTP 和 HTTPS 使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
-
4、HTTP 的連接很簡單,是無狀態(tài)的。HTTPS 協(xié)議是由 SSL+HTTP 協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比 HTTP 協(xié)議安全。(無狀態(tài)的意思是其數(shù)據(jù)包的發(fā)送、傳輸和接收都是相互獨立的。無連接的意思是指通信雙方都不長久的維持對方的任何信息。)
35 selenium原理
- 當(dāng)使用 Selenium 2.0 啟動瀏覽器時,后臺會同時啟動基于 WebDriver Wire 協(xié)議的 Web Service 作為 Selenium 的 Remote Server,并與瀏覽器綁定。之后Remote Server 就開始監(jiān)聽 Client 端的操作請求;
- 執(zhí)行測試時,測試用例會作為 Client 端,將需要執(zhí)行的頁面操作請求以 Http Request 的方式發(fā)送給 Remote Server 。該 Http Request 的 body,是以 WebDriver Wire 協(xié)議規(guī)定的 JSON 格式來描述需要瀏覽器執(zhí)行的具體操作;
- Remote Server 接收到請求后,會對請求進(jìn)行解析,并將解析結(jié)果發(fā)給 WebDriver,由WebDriver 實際執(zhí)行瀏覽器的操作;
- WebDriver 可以看做是直接操作瀏覽器的原生組件(Native Component),所以搭建測試環(huán)境時,通常都需要先下載瀏覽器對應(yīng)的 WebDriver。
- 源代碼:通過 subprocess.Popen 啟動 chromedriver.exe 程序,從而提供服務(wù)
- driver.get, driver.find_element 等方法底層都調(diào)用 self.execute方法, 而最終都是去訪問 chromedriver 提供的接口地址
36 appium原理
- 開源、跨平臺的UI自動化測試工具,支持多種語言編寫的測試腳本
- 原理:
- test scripts(測試腳本發(fā)送一個請求到appium server)
- appium server接收到請求后進(jìn)行解析并把請求轉(zhuǎn)發(fā)給 bootstrap.jar。
- jar接收到appium的命令,調(diào)用UIAutomator命令實現(xiàn)操作
- 最終結(jié)果由bootstrap.jar返回給Appium server。
37 android和iOS自動化實現(xiàn)原理的區(qū)別(安裝環(huán)境區(qū)別)
- 都需要安裝 jdk、nodejs、appium、appi-client
- appium自動化原理:
- Appium提供各個語言的第三方庫,將測試腳本轉(zhuǎn)化成 WebDriver 協(xié)議下的 URL,通過 Node 服務(wù)發(fā)送到各個平臺上的代理工具,代理工具在運行過程中不斷接收 URL,根據(jù) WebDriver 協(xié)議解析出要執(zhí)行的操作,然后調(diào)用各個平臺上的原生測試框架完成測試,再將測試結(jié)果返回給 Node 服務(wù)器。
- appium android自動化原理是:
- google官方sdk自帶了一個操作APP的UI的框架叫做uiautomator,然后appium初始化的時候,就會推送一個bootstrip.jar推送到手機,然后appium client發(fā)送請求到appium server,然后server發(fā)送到bootstrip.jar,bootstrip.jar調(diào)用uiautomator接口,由uiautomator驅(qū)動APP的UI界面操作,然后bootstrip.jar返回操作的結(jié)果給appium server
- appium ios原理:
- appium在iOS上的實際上就是使用了WebDriverAgent,作為實現(xiàn)webdriver協(xié)議的驅(qū)動層,通過驅(qū)動蘋果的UIAutomationUI框架完成iOS的自動化
38自動化測試用到的模塊
- requests+unittest+ddt+httptestrunner+pymysql+openpyxl+logging 接口自動化
- selenium+pytest+allure web自動化
- appium+selenium+pytest+allure+yaml app自動化
39 OSI七層模型
- 物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層
40 cookie、session、token各自區(qū)別
- cookie:在客戶端存儲在客戶端用于存儲會話信息的
- session:在服務(wù)器端,記錄用戶的請求狀態(tài),一般默認(rèn)時間30min
- session_id會存在cookie中,每次請求cookie中所有信息都會傳遞給服務(wù)器,服務(wù)器通過 session_id來識別是否是同一個用戶請求,不是同一個用戶的話,就會要求重新登錄
- token:訪問權(quán)限
- 鑒權(quán):訪問的接口是否正常,是否非法訪問繞過前端。防止跳過頁面直接訪問接口。token
- 授權(quán):是否具有訪問接口的權(quán)限。 唯一全局動態(tài)的 。key
41 常用狀態(tài)碼
- 100系列:請求已收到繼續(xù)處理;
- 200系列:表示成功
- 200:正常,服務(wù)器正確響應(yīng)了請求
- 300系列:資源重定向;
- 301:永久重定向;請求的網(wǎng)頁已永久移動到新位置
- 302:2臨時重定向;被請求文檔已經(jīng)臨時移至別處,此文檔新的url在location響應(yīng)頭中給出
- 303:瀏覽器對于POST的響應(yīng)進(jìn)行重定向至新的url
- 307:瀏覽器對于GET的響應(yīng)重定向至新的url
- 400系列:客戶端錯誤:
- 400:錯誤請求;服務(wù)器不理解請求的語法。
- 401:未授權(quán);如請求參數(shù)、方法、格式等
- 403:拒絕訪問;服務(wù)器理解客戶的請求,但拒絕處理它(沒有權(quán)限)
- 404:請求資源不存在
- 500系列:服務(wù)器端出錯
- 500:服務(wù)器內(nèi)部錯誤
- 501:尚未實施;服務(wù)器不具備完成請求的功能
- 502:服務(wù)器網(wǎng)關(guān)錯誤
- 503:服務(wù)器由于維護(hù)或者負(fù)載過重未能應(yīng)答
- 504請求超時
42 手寫adb命令
-
adb 幫助:adb --help
-
啟動adb 服務(wù):adb start-server
-
關(guān)閉adb 服務(wù):adb kill-server
-
獲取設(shè)備號:adb devices
-
獲取系統(tǒng)版本:adb shell getprop ro.build.version.release
-
發(fā)送文件到手機:adb push 電腦端?件路徑/需要發(fā)送的文件 手機端存儲的路徑
- adb push C:\Users\win\Desktop\xx.png /sdcard
-
從手機拉取文件: adb pull 手機端的路徑/拉取文件名 電腦端存儲文件路徑
- adb pull /sdcard/xx.png C:\Users\win\Desktop
-
查看手機運行日志: adb logcat
-
進(jìn)入到手機終端: adb shell
-
安裝app到手機: adb install 路徑/xxx.apk
-
卸載手機app : adb uninstall app
-
獲取app啟動包名和啟動名(?手機需要先打開對應(yīng)app)
- Mac/Linux: adb shell dumpsys window windows | grep mFocusedApp
- 在 Windows 終端運?: adb shell dumpsys window windows | findstr mCurrent
-
獲取app啟動時間: adb shell am start -W 包名/.啟動名
-
查看設(shè)備ip地址:
- adb shell ifconfig wlan0
- adb shell netcfg
-
查看設(shè)備cpu信息: adb shell cat /proc/cpuinfo
-
查看設(shè)備內(nèi)存信息: adb shell cat /proc/meminfo
43 http請求頭和響應(yīng)頭
- http請求及其結(jié)構(gòu):
請求信息包含:請求行(request) 請求頭部header 、空行和請求數(shù)據(jù)組成 - 響應(yīng)及其結(jié)構(gòu)
響應(yīng)組成:狀態(tài)行、響應(yīng)頭報頭、空行和響應(yīng)正文
44 鼠標(biāo)操作常用函數(shù)
45 鍵盤操作常用函數(shù)
- 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,'v') 全選(Ctrl+V)
- send_keys(Keys.CONTROL,'x') 復(fù)制(Ctrl+X)
46 解決手動造數(shù)據(jù)問題
- 參數(shù)化
- 手機號:
- excel里邊存放初始手機號 每次執(zhí)行完,回寫新的手機號(原來號碼+1)
- 每次從數(shù)據(jù)庫里查詢最大手機號,在這個基礎(chǔ)上加1
- 變量替換: 數(shù)據(jù)庫依賴關(guān)系 ${mobile} ${regtime} ${memberid} ${loanid}
- 最關(guān)鍵:用例設(shè)計、用例參數(shù)之間依賴關(guān)系
47 你寫框架多長時間?
初步模型:1-2周,一個月時間
48 TestCase使用
- 導(dǎo)入unittest模塊、被測文件或其中的類
- 創(chuàng)建一個測試類,并繼承unitest.TestCase
- 定義測試函數(shù),函數(shù)名已test_開頭,測試用例
- 調(diào)用unittest.main()方法運行測試用例
49 Selenium 中如何保證操作元素的成功率?也就是說如何保證我點擊的元素一 定是可以點擊的?
- 1.添加元素智能(隱性)等待時間 driver.implicitly_wait(30)
- 2.添加強制等待時間 time.sleep()
- 3.try 方式進(jìn)行id,name,clas,xpath, css selector不同方式進(jìn)行定位,如果第一種失敗可以自動嘗試第二種
50 你的自動化用例的執(zhí)行策略是什么?
- 利用自動化測試工具,經(jīng)過測試需求分析;
- 設(shè)計出自動化測試用例;
- 從而搭建自動化測試的框架,設(shè)計與編寫自動化腳 本;
- 驗證測試腳本的正確性,最終完成自動化測試測試腳本(即主要功能為測試的應(yīng)用軟件)
- 輸出測試結(jié)果
51 常見的 POST 提交數(shù)據(jù)方式
主要有四種方式:
- application/x-www-form-urlencoded;
- multipart/form-data;
- application/json;
- text/xml
52 目前主流的APP自動化測試框架,各個自動化適合的語言
- appium macaca、robotium、UiAutomator
53 Selenium有哪幾種定位方式?用的最多的是哪種?
8種單元素定位方法,8種對應(yīng)的多元素定位方法;所有方法都是基于driver.find_element()和driver.find_elements()方法,如下:
為了保證代碼的統(tǒng)一性,使用的最多的是driver.find_element_by_xpath()這個方法,傳入定位器,即使我們使用id作為定位器,仍然寫成基于id的xpath定位器表達(dá)式,如下:
baidu_yi_xia_locator = ‘//input[@id="su"]’ # 百度一下按鈕的定位器,寫成了xpath,但基于的是id這個屬性 baidu_yi_xia = driver.find_element_by_xpath(baidu_yi_xia_locator) #定位元素,并返回給變量 baidu_yi_xia.click() # 點擊百度一下54 UI自動化能發(fā)現(xiàn)多少Bug
- UI自動化的目的不是為了發(fā)現(xiàn)多少Bug,主要是為了減輕重復(fù)的基礎(chǔ)操作和線上監(jiān)控的作用
55 monkey屬于自動化嗎?
monkey不屬于嚴(yán)格意義上的自動化,monkey是生成用戶或系統(tǒng)的偽隨機事件,在屏幕上觸發(fā)隨機點擊事件
56 你們一般對什么case會進(jìn)行自動化,自動化一般在哪個階段進(jìn)行
- 主要是主流程中比較容易實現(xiàn)的進(jìn)行自動化,一般在集成階段進(jìn)行該版本的自動化監(jiān)控,平常的話會一直跑線上監(jiān)控的
57 app自動化你們一般用什么工具定位元素?
- Uiautomatorview和appium的客戶端
58 您需要一臺服務(wù)器機器來運行Appium上的測試嗎?
- 不需要服務(wù)器機器在Appium上運行測試。 Appium促進(jìn)了一個2層架構(gòu),其中測試機連接到運行Appium的測試服務(wù)器并自動化整個事情。您可以在運行測試的同一臺機器上運行Appium。
59 使用Appium可能遇到的錯誤是什么?
- 錯誤1:需要以下所需的功能,但不提供:設(shè)備名稱,platformName
- 錯誤2:找不到adb。請使用Android SDK根目錄路徑設(shè)置ANDROID_HOME環(huán)境變量
- 錯誤3:openqa.selenium.SessionNotCreatedException:無法創(chuàng)建新的會話
- 錯誤4:如何在移動應(yīng)用程序中查找DOM元素或XPath?
60 簡述Appium的原理?
- Appium是使用Node.js平臺編寫的“HTTP Server”,并使用Webdriver JSON線協(xié)議驅(qū)動iOS和Android會話。
- 在初始化Appium Server之前,必須在系統(tǒng)上預(yù)先安裝Node.js 當(dāng)Appium被下載并安裝時,在我們的機器上設(shè)置一個暴露REST API的服務(wù)器
它從客戶端接收連接和命令請求,并在移動設(shè)備(Android / iOS)上執(zhí)行該命令,
它響應(yīng)HTTP響應(yīng)。 - 再次,為了執(zhí)行此請求,它使用移動測試自動化框架來驅(qū)動應(yīng)用程序的用戶界面。 框架像Apple Instruments for iOS(僅適用于Xcode 3.0或更高版本的OS X v10.5及更高版本)適用于Android API的Google UIAutomator 16級或更高版本Selendroid for Android API等級在15以下。
61 如何提高selenium腳本的執(zhí)行速度?
如網(wǎng)速、操作步驟的繁瑣程度、頁面加載的速度、在腳本中設(shè)置的等待時間、運行腳本的線程數(shù)等。所以不能單方面追求運行速度的,要確保穩(wěn)定性,能穩(wěn)定地實現(xiàn)回歸測試才是關(guān)鍵。
- 減少操作步驟,如經(jīng)過三四步才能打開我們要測試的頁面的話,我們就可以直接通過網(wǎng)址來打開,減少不必要的操作。
- 中斷頁面加載,如果頁面加載的內(nèi)容過多,我們可以查看一下加載慢的原因,如果加載的內(nèi)容不影響我們測試,就設(shè)置超時時間,中斷頁面加載。
- 在設(shè)置等待時間的時候,可以sleep固定的時間,也可以檢測某個元素出現(xiàn)后中斷等待也可以提高速度。
四,配置testNG實現(xiàn)多線程。在編寫測試用例的時候,一定要實現(xiàn)松耦合,然后在服務(wù)器允許的情況下,盡量設(shè)置多線程運行,提高執(zhí)行速度。
62 什么是持續(xù)集成?
- 持續(xù)集成源于極限編程(XP),是一種軟件實踐,軟件開發(fā)過程中集成步驟是一個漫長并且無法預(yù)測的過程。集成過程中可能會爆發(fā)大量的問題,因此集成過程需要盡可能小而多,實際上持續(xù)集成講的是不斷的去做軟件的集成工作。持續(xù)集成,最簡單的形式是包括一個監(jiān)控版本控制(SVN等等)變化的工具。當(dāng)變化被發(fā)覺時,這個工具可以自動的編譯并測試你的應(yīng)用
63 什么是page object設(shè)計模式?
通過分離測試對象和測試腳本的抽象來實現(xiàn)的
64 你覺得自動化測試最大的缺陷是什么?
- 不穩(wěn)定
- 可靠性
- 不易維護(hù)
- 成本與收益
65 Selenium是否支持桌面應(yīng)用軟件的自動化測試。
- Selenium不支持桌面軟件的自動化測試,Selenium是根據(jù)網(wǎng)頁元素的屬性才定位元素,而其他桌面軟件自動化測試工具是根據(jù)桌面元素的位置來定位元素,當(dāng)然現(xiàn)在也有根據(jù)桌面元素的屬性來定位的。
66 BDD是什么?你了解多少?TDD是什么?
BDD:行為驅(qū)動開發(fā)(Behavior Driven Development)
TDD:測試驅(qū)動開發(fā)(Test-Driven Development)
67 selenium是否可以直接讀取Excel表中測試用例,來執(zhí)行相關(guān)測試
可以的,需要借助第三方庫
68 Selenium有哪些組件?
最早的有Selenium IDE,IDE只支持安裝在fiefox上一個插件,支持錄制自動化腳本。還有
remote RC、Grid 、webdriver。我們一般最重要的就是使用webdriver。
69 如果元素定位中遇到iFrame內(nèi)嵌框架,你是如何定位的?如果沒有遇到id屬性和name屬性為空的情況,又是如何處理的?
- 第一個問題:遇到iFrame內(nèi)嵌框架里的任何元素,和以往一樣寫出定位器就可以了,只是在執(zhí)行腳本的時候,定位器是正確的,但是仍然腳本執(zhí)行失敗,報錯“無法找到元素”。原因就是因為這個元素被嵌在了iFrame內(nèi)嵌框架中(我們也叫子框架),所以需要在定位元素前,先寫以下代碼,作用是從當(dāng)前的主框架切換到內(nèi)嵌框架中,有多種方式:
- 第二個問題:沒有id或者name屬性,只需要用xpath寫出表達(dá)式,表達(dá)式中利用元素的其他單個或多個屬性的組合,只要能夠保證元素的唯一性即可,如下例子:
70 明明自己定位的元素是對的,執(zhí)行自動化測試腳本時卻報錯,這時你有幾種方法解決此問題?請寫出你的解決方法。
- (1)元素在iFrame里:先切入iFrame
- (2)元素在打開的新窗口里:先切入新窗口
- (3)元素在新跳轉(zhuǎn)的頁面里,但是因為各種原因,新頁面跳轉(zhuǎn)很慢,已經(jīng)超過了Selenium中對于元素定位的最大等待時間:增加隱式等待時間或?qū)@個元素進(jìn)行智能等待
- 隱式等待的代碼如下:
71 簡單說出如何用自動化測試腳本實現(xiàn)遍歷復(fù)選框點擊功能(要求全部勾上)。
xPathRadio = '//input[@type="radio"]' # radiobox復(fù)選框?qū)ο笪覀儽仨毷褂胒ind_elements方法去定位多個元素(復(fù)選框就是多元素) radioboxes = driver.find_elements_by_xpath(xPathRadio) # 使用循環(huán)遍歷的方式,逐個點擊這些定位到的元素 for radiobox in radioboxes:radiobox.click()72 寫一個自動化腳本,語言不限,要求每執(zhí)行一次腳本隨機生成一個手機號碼。
import random # 導(dǎo)入隨機數(shù)模塊# 一開始,手機號是空的 mobile_phone = '' # 在中國,手機號碼的第一位都是1 phone_num_1 = '1' # 把第一位生成的數(shù)字拼接到手機號 mobile_phone = mobile_phone + phone_num_1 # 根據(jù)不同的運營商,手機號碼的第2位和第3位都是有固定值的,這里隨便列舉了幾個,放入列表 phone_num_2_to_3 = ['38', '82', '88', '36', '30'] # choices方法可以隨機抽取列表里的元素,從而生成第二三位手機號碼,并拼接到手機號 phone_num_2_to_3 = random.choices(phone_num_2_to_3)[0] mobile_phone = mobile_phone + phone_num_2_to_3 # 最后8個數(shù)字,循環(huán)生成 for i in range(8):# randint方法可以隨機產(chǎn)生0~9的值,但是為了拼接字符串,我們用str()方法轉(zhuǎn)換phone_num = str(random.randint(0, 9)) # 每一次循環(huán)都會生成一個數(shù)字,并且繼續(xù)拼接到現(xiàn)有的電話號碼里mobile_phone = mobile_phone + phone_num # 打印最終生成的手機號碼 print(mobile_phone)73 你對單元測試框架了解多少
unittest、testng、nose、pytest、
74.深拷貝和淺拷貝的區(qū)別?
- 淺拷貝:淺拷貝是對于一個對象的頂層拷貝。簡單理解:拷貝了引用,并沒有拷貝內(nèi)容(對象)
- 深拷貝:對于一個對象所有層次的拷貝(遞歸)
- 全都是不可變類型的數(shù)據(jù):copy.copy、copy.deepcopy都是引用指向
- 包含不可變類型的數(shù)據(jù):deepcopy是深拷貝,copy.copy是指向引用
- 不可變對象中包含可變對象:copy.copy是引用指向,deepcopy是開辟新的內(nèi)存地址,即深層拷貝
75 web/app動態(tài)元素如何定位
- 對于屬性值動態(tài):
- 用xpath+模糊匹配定位方式:
- driver.find_element_by_xpath(“//標(biāo)簽名[contains(@屬性,‘部分片段值’)]”)
- driver.find_element_by_xpath(“//標(biāo)簽名[starts-with(@屬性,‘頭部片段值’)]”)
- driver.find_element_by_xpath(“//標(biāo)簽名[ends-with(@屬性,‘尾部片段值’)]”)
- 屬性可以為 id、name、tag_name、link_text、partial_link_text等
- 用模糊組合定位:
- driver.find_element_by_xpath(“//標(biāo)簽名[contains(@屬性1,‘片段值’) and @屬性2=‘屬性值’ and …]")
- 用xpath+模糊匹配定位方式:
- 位置動態(tài):
- 采用兄弟節(jié)點/父子節(jié)點方式定位
76 沒有找到元素的原因可能是什么?
- 元素定位表達(dá)式寫錯
- 定位的元素屬性值會動態(tài)發(fā)生變化
- 解決方案:
- 1)通過數(shù)據(jù)庫查詢屬性值再動態(tài)傳入
- 2)組合定位:兄弟節(jié)點、父子節(jié)點、子孫節(jié)點方式
- 3) 模糊定位方式:starts-with、ends-with、contains(參考75)
- 解決方案:
- 定位的元素屬性值會動態(tài)發(fā)生變化
- 元素沒加載
- 解決方法:全局加隱式等待self.driver.implicitly_wait(time_to_wait=5)
- 元素在適當(dāng)位置添加顯示等待:WebDriverWait(self.driver, timeout).until(EC.element_to_be_clickable(locator)) #元素是否可點擊 WebDriverWait(self.driver, timeout).until(EC.visibility_of_element_located(locator)) #元素是否可見 WebDriverWait(self.driver, timeout).until(EC.presence_of_element_located(locator)) # 元素是否存在
- 頁面加載慢,添加強制等待
- 元素不在該頁面
- 切換到iframe(id、name、index方式)再處理元素
- window(句柄切換:self.driver.switch_to.window(current_window_handles[-1]))
- alert(先切換到alert(self.driver.switch_to.alert)
77 驗證碼如何處理
- 元素滑動方式:
- 定位滑塊–>模擬單擊滑塊,讓拼圖和缺口顯現(xiàn)出來–>獲得缺口位置–>計算需要滑動的距離–>通過ActionChains函數(shù)滑動滑動
- 通過opencv庫計算閥值匹配背景和缺口(推薦)
- 參考:https://segmentfault.com/a/1190000019218588
78 ui自動化中登錄如何處理
在conftest.py中定義fixture夾具,在對應(yīng)測試用例調(diào)用
79 字典里嵌套字典或列表,如何獲取值?
通過re.search()方法
80 docker怎么用(常用命令)
- 鏡像:
- 啟動docker:sudo systemctl start docker
- 鏡像查看:docker images
- 刪除鏡像:
- docer image rmi image ID
- docker image rm 鏡像版本號:標(biāo)簽名
- 容器:
- 啟動容器:
- docker run imagename
- docker run -dit 鏡像版本名:標(biāo)簽名 /bin/bash
- 指定端口和數(shù)據(jù)卷:docker run -dit --name 容器名稱 -v 宿主機目錄:容器目錄 -P 宿主機端口:映射端口 鏡像名稱
- 進(jìn)入容器:docker exec -it 容器名 /bin/bash
- 列出系統(tǒng)中所有容器:docker ps -a
- 停止容器:docker stop containerID
- 重啟容器:docker restart 容器名(容器id)
- 刪除容器:
- 刪除一個正在運行容器(強制刪除): docker rm -f containerID
- docker rm containerID
- 查看容器日志:docker container logs container_id
- 啟動容器:
81 微信小程序怎么實現(xiàn)自動化?
- 連接真機:開啟usb調(diào)式模式
- 打開x5內(nèi)核調(diào)試模式:http://debugmm.qq.com/?forcex5=true
- Android Screen Monitor 顯示真機屏幕
- 核心配置參數(shù)desired_caps["recreateChromeDriverSessions"] = True # 支持X5內(nèi)核應(yīng)用自動化配置 desired_caps["chromedriverExecutableDir"] = r'D:\xxxx\chromedriver' # 指定driver版本 desired_caps["chromeOptions"] = {"androidProcess": "com.tencent.mm:appbrand0"}
82.字符串怎么轉(zhuǎn)字典
s = '{"name":"zhangsan","age":13,"sex":"男"}' # 法1 json.loads() import json # print(json.loads(s)) # 法2:eval() # print(eval(s)) # 法3 : ast.literal_eval() import ast print(ast.literal_eval(s))總結(jié)
以上是生活随笔為你收集整理的软件测试面试题整理(一)之自动化测试题大合集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机教案评比,信息技术课堂教学评比案例
- 下一篇: Android版CCLabelTTF在s