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