🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快?
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))
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。