日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

软件测试面试题整理(一)之自动化测试题大合集

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件测试面试题整理(一)之自动化测试题大合集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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方法。
  • 需要獲取當前瀏覽器多窗口句柄,然后根據判斷跳轉新句柄還是舊句柄
# 最新句柄 current_window_handles = self.driver.window_handles self.driver.switch_to.window(current_window_handles[-1]) elif window_reference == "default":self.driver.switch_to.default_content() # 默認當前句柄 else:self.driver.switch_to.window(window_reference) # 指定句柄

7 你查找元素遇到過在Frame里面嗎?你是如何處理Frame里面元素定位的?
有時候我們知道元素定位表達式沒有問題,但是還是提示no such element,那么我們就需要考慮這個元素是否在frame中。如果在,我們就需要從topwindow,通過swithcTo.Frame()方法來切換到目標frame中,可以通過frame的name、id和index三種方法來定位frame。

8 如何處理下拉菜單?

  • 通常我們也可以通過Click方法來點擊下拉菜單里面的元素,還有一種方法,在Selenium中有一個類叫Select,支持這種下拉菜單交互的操作。
  • 基本使用語法是這樣的:
Se=new Select(element) Se.selectByIndex(index) Se.selectByvalue(value) Se.selectByVisibleText(text)

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)
      使用場景:點擊鍵盤事件,分為兩個動作,一個點擊鍵盤,第二個動作是釋放點擊(松開)

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 鼠標操作常用函數

  • context_click() 右擊 --> 此方法模擬鼠標右鍵點擊效果
  • double_click() 雙擊 --> 此方法模擬雙標雙擊效果
  • drag_and_drop() 拖動 --> 此方法模擬雙標拖動效果
  • move_to_element() 懸停 --> 此方法模擬鼠標懸停效果
  • perform() 執行 --> 此方法用來執行以上所有鼠標方法
  • 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()方法,如下:

    from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('www.baidu.com') driver.find_element_by_id('id') # 通過元素id屬性定位元素 driver.find_element_by_name('name') # 通過元素名字屬性定位元素 driver.find_element_by_tag_name('tag_name') # 通過元素的標簽名稱定位元素 driver.find_element_by_class_name('class_name') # 通過元素的類名稱定位元素 driver.find_element_by_link_text('link_text') # 通過鏈接元素的完整顯示文字定位元素 driver.find_element_by_partial_link_text('partial_link_text') # 通過鏈接元素的部分顯示文字定位元素 driver.find_element_by_xpath('xpath') # 通過xpath表達式定位元素 driver.find_element_by_css_selector('css_selector') # 通過css表達式定位元素 driver.find_elements_by_id('id') # find_elements_by_xxx系列也有8種,可以定位多個滿足條件的元素 driver.find_element(By.ID, 'id') # 每一個find_element_by_xxx方法都是基于find_element方法的 driver.find_elements(By.ID, 'id') # find_element()方法的復數形式,可以定位多個滿足條件的元素

    為了保證代碼的統一性,使用的最多的是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內嵌框架中(我們也叫子框架),所以需要在定位元素前,先寫以下代碼,作用是從當前的主框架切換到內嵌框架中,有多種方式:
    # 切入frame有3種方式 # (1) 通過frame的id屬性或name屬性 driver.switch_to.frame('layui-layer-iframe1') # (2) 通過frame的index,從0開始(第1個iframe) driver.switch_to.frame(0) # (3) 通過定位器,配合find_element()方法,定位到框架元素后,再把這個定位到的框架元素入參iframe_loc = '//iframe[@id="layui-layer-iframe1"]' driver.switch_to.frame(driver.find_element_by_xpath(iframe_loc))
    • 第二個問題:沒有id或者name屬性,只需要用xpath寫出表達式,表達式中利用元素的其他單個或多個屬性的組合,只要能夠保證元素的唯一性即可,如下例子:
    //input[@value="百度一下"]

    70 明明自己定位的元素是對的,執行自動化測試腳本時卻報錯,這時你有幾種方法解決此問題?請寫出你的解決方法。

    • (1)元素在iFrame里:先切入iFrame
    • (2)元素在打開的新窗口里:先切入新窗口
    • (3)元素在新跳轉的頁面里,但是因為各種原因,新頁面跳轉很慢,已經超過了Selenium中對于元素定位的最大等待時間:增加隱式等待時間或對這個元素進行智能等待
      • 隱式等待的代碼如下:
      from selenium import webdriver driver = webdriver.Chrome() # 設置全局等待(即:隱式等待),注意只需要設置一次 driver.implicitly_wait(60) # 延長到60秒 顯示等待(智能等待)的代碼如下: from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() mobile_phone_loc = (By.XPATH, '//input[@name="mobilephone"]') elem = WebDriverWait(driver, 60).until(EC.element_to_be_clickable(mobile_phone_loc)) elem.send_keys('13812345678')

    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 …]")
    • 位置動態:
      • 采用兄弟節點/父子節點方式定位
      //*[contains(@resource-id,"fixedWrap")]//*[@content-desc="自選"] //android.widget.LinearLayout[contains(@resource-id,"home_item_layout_bg") and @index="1"] //*[contains(@resource-id,"myfund_name_text_view") and @text="${fund_name}"]/../..//android.widget.LinearLayout[1]

    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夾具,在對應測試用例調用

    @pytest.fixture() def driver():global dd = webdriver.Chrome()d.implicitly_wait(5)d.maximize_window()yield dd.quit()@pytest.fixture() def login(driver): # 調用fixture時一定要在定義函數中傳入driver,否則報錯lg = LoginPage(driver)lg.login('1a2b','abcd')time.sleep(5)return driverdef test_xxxx(self, login): # 調用logindriver = loginpage = LoginPage(driver)

    79 字典里嵌套字典或列表,如何獲取值?
    通過re.search()方法

    import re import json res = {'code': 0, 'success': True, 'data': {'result': {'isSucceed': True, 'message': '44704', 'mdmId': 0, 'setMessage': True, 'setIsSucceed': True,'setMdmId': False}}, 'msg': None} res= json.dumps(res) info = re.compile(r'"message": ".*?"') print(info.search(res).group().split(":")[1].strip(' ,"')) # code = re.search(r'"message": ".*?"',res)[0].split(":")[1].strip(' "') # print(code)

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

    總結

    以上是生活随笔為你收集整理的软件测试面试题整理(一)之自动化测试题大合集的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。