2025最新軟件測試面試八股文(含答案+文檔)

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快?

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

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92658.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

表格數據處理-TabNet模型使用說明(模型構建+SHAP)

一、模型介紹 論文為《TabNet: Attentive Interpretable Tabular Learning》發表于2021年,屬于Google Cloud AI。該研究針對表格數據提出了一種新的深度神經網絡(DNN)架構TabNet,旨在解決傳統深度學習在表格數據上表現不如決策樹模…

數據集成難在哪?制造企業該怎么做?

目錄 一、為什么你的數據集成總失敗? 1.數據沒有統一標準 2.數據 “斷點多”,打通成本高 3.數據 “用不起來”,價值難落地 二、數據集成的正確做法是什么? 第一步:明確 “集成為了誰”— 用業務目標倒推數據需求…

Datawhale AI數據分析 作業2

學生考試表現影響因素數據集第一步:數據概覽與清洗Prompt 1:加載StudentPerformanceFactors.csv文件,并顯示前5行數據以及各列的數據類型和非空值數量,檢查是否存在缺失值。處理缺失值是數據預處理的重要一步。對于您提到的缺失值&#xff1a…

Flowable 與 Spring Boot 深度集成:從環境搭建到平臺構建

在前三篇文章中,我們依次認識了 Flowable 的基礎概念、用 Modeler 設計流程,以及通過 API 控制流程運行。但在實際項目中,我們更需要將 Flowable 與 Spring Boot 深度融合,構建完整的工作流平臺。本文將從環境配置、設計器集成、權…

Jenkins最新版本的安裝以及集成Allure生成測試報告

目錄 Jenkins的安裝 將上面的目錄添加到系統環境變量中 為Jenkins配置密碼 創建一個用戶,用于登錄jenkins 為Jenkins安裝Allure插件 幾個大坑 使用jenkins集成python測試項目 Jenkins的安裝 Jenkins官方網址 Jenkins 點擊download 點擊 past Release選擇你想要下載…

Vue3 面試題及詳細答案120道 (1-15 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

基于 GitLab 實踐敏捷開發

在軟件開發中,**基于 GitLab 實踐敏捷開發**,并建立一套**規范的日常管理流程**,不僅可以提升團隊協作效率,還能確保平臺持續向好迭代、性能穩步提升。以下是一個完整的實踐方案,適用于中小型團隊或中大型項目&#xf…

黑馬點評使用Apifox導入接口測試合集(持續更新、詳細圖解)

目錄 一、前言 二、更新店鋪 三、添加秒殺券 四、秒殺下單和秒殺下單user2 一、前言 本博客將持續更新記錄黑馬點評所有接口測試的導入(學到哪更新到哪),以此博客為完整導入接口測試的合集。第一次在黑馬點評項目使用Apifox進行接口測試直接先看我前面的博客&a…

MYOJ_10583:CSP初賽題單7:計算機常識綜合練習

更多初賽題單請參見題目整理CSP初賽題目整理題單,謝謝。 注:閱讀此題單時建議先看1~5,再試著自己做。 題目描述 1. [J-2010-6][S-2010-6]提出“存儲程序”的計算機工作原理的是( )。 A. 克勞德香農 B. 戈登摩爾 C.…

代碼隨想錄day22回溯算法1

文章目錄77. 組合216.組合總和III17. 電話號碼的字母組合77. 組合 題目鏈接 文章講解 class Solution { public:vector<vector<int>> res; // 存儲所有的組合vector<int> path; // 當前正在構建的組合// 回溯算法void solve(int n, int k, int st…

【Android】Popup menu:彈出式菜單

Popup menu&#xff1a;彈出式菜單 PopupMenu&#xff0c;彈出菜單&#xff0c;一個模態形式展示的彈出風格的菜單&#xff0c;綁在在某個View上&#xff0c;一般出現在被綁定的View的下方&#xff08;如果下方有空間&#xff09;。 注意&#xff1a;彈出菜單是在API 11和更高版…

20250724-day21

Main Memory Database System&#xff08;MMDB&#xff09;&#xff1a;基于內存的數據庫系統 File Database&#xff08;FDB&#xff09;&#xff1a;基于文件的數據庫 Netware Database&#xff08;NDB&#xff09;&#xff1a;基于網絡的數據庫 daemon&#xff1a;守護進程 …

API是什么,如何保障API安全?

API&#xff08;應用程序編程接口&#xff09;是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;是不同軟件系統之間通信的“橋梁”。它定義了應用程序如何請求服務、交換數據或調用功能&#xff0c;無需了解底層實現細節。例如&#xff0c;當…

深度分析Java多線程機制

Java 多線程是掌握高性能、高響應性應用程序開發的關鍵&#xff0c;它涉及到語言特性、JVM 實現、操作系統交互以及并發編程的核心概念。 核心目標&#xff1a; 充分利用現代多核 CPU 的計算能力&#xff0c;提高程序吞吐量&#xff08;單位時間內處理的任務量&#xff09;和響…

Android熱修復實現方案深度分析

熱修復的核心目標是在**不發布新版本、不重新安裝、不重啟應用&#xff08;或僅輕量級重啟&#xff09;**的情況下&#xff0c;修復線上應用的 Bug 或進行小范圍的功能更新&#xff0c;極大地提升用戶體驗和問題響應速度。 一、熱修復的核心原理 無論哪種方案&#xff0c;其核心…

HTML前端顏色漸變動畫完整指南

漸變動畫已經成為現代網頁設計中不可或缺的元素&#xff0c;它們不僅能為網站增添視覺吸引力&#xff0c;還能顯著提升用戶體驗。通過巧妙運用CSS漸變動畫&#xff0c;開發者可以創造出令人印象深刻的動態背景效果&#xff0c;而無需依賴圖片或復雜的腳本。 漸變動畫的魅力所在…

b-up:Enzo_mi:Transformer DETR系列

1.視頻1&#xff1a;self-Attention&#xff5c;自注意力機制 &#xff5c;位置編碼 &#xff5c; 理論 代碼 注意&#xff1a; q-查詢; k-商品標簽&#xff1b; v-值&#xff08;具體商品&#xff09; * 不是指乘法&#xff0c;類似概念 a1:相似度&#xff1b; b1:總分 若想…

算法題(179):單調棧

審題&#xff1a; 本題是單調棧的模板題 補充&#xff1a;單調棧 單調棧中的數據始終保持單調遞增或單調遞減 使用情景&#xff1a;給定一個數組&#xff0c;要求尋找 1.某個數左側&#xff0c;離他最近且值大于他的數 2.某個數左側&#xff0c;離他最近且值小于他的數 3.某個數…

CF每日5題(1500-1600)

545C 貪心 1500 題意&#xff1a;給 n 棵樹在一維數軸上的坐標 xix_ixi? &#xff0c;以及它們的長度 hih_ihi?。現在要你砍倒這些樹&#xff0c;樹可以向左倒也可以向右倒&#xff0c;砍倒的樹不能重合、當然也不能覆蓋其他的樹原來的位置&#xff0c;現在求最大可以砍倒的…

HW藍隊:天眼告警監測分析之Web攻擊

Web攻擊 信息泄露 敏感數據包括但不限于:口令、密鑰、證書、會話標識、License、隱私數據(如短消息的內容)、授權憑據、個人數據(如姓名、住址、電話等)等&#xff0c;在程序文件、配置文件、日志文件、備份文件及數據庫中都有可能包含敏感數據 信息收集方法 漏洞分類 備份文…