• Selenium是否支持桌面應用軟件的自動化測試
Selenium不支持桌面應用軟件的自動化測試,Selenium是通過操作HTML頁面中的DOM樹上的節點進行模擬用戶行為,暫時不支持桌面應用
• Selenium是否支持用例的執行的引擎。
selenium只是一個用來操作HTML頁面元素的庫,並不支持用例的執行引擎,python中需要使用unittest 或pytest 等測試框架完成用例的執行的引擎。
• Seleinum是否有讀取excel文件的庫
selenium無讀取excel文件的庫,我一般使用openpyxl 庫進行excel的讀寫操作
• Selenium有哪些組件?
Selenium的組件有Selenium Grid(用於調度),webdriver(用於生成對應的瀏覽器實例,進行模擬用戶瀏覽操作),Selenium IDE(瀏覽器錄制回放)
• Selenium有什么限制或者缺陷
Selenium只能完成瀏覽器或者移動端基於DOM元素的操作,無報告,用例執行引擎等功能
• 在selenium中,有哪些不同定位元素方法
id/xpath/name/link_text/className/PartialLinkText/CSS selector,測試腳本編寫過程中使用最多的xpath,css這兩種
• 什么是imlicitlyWait (隱式等待)
全局只需設置一次,元素或腳本執行的結果在設定的最長時間內出現則返回,未出現則在最長時間后拋出找不到元素的異常
• 什么是expliciteWait (顯式等待)
一般設置兩個參數,一個為最長時間,一個為間隔輪詢時間,例如WebDriverWait(10,0.5).until(...),則代表每間隔0.5s查詢一次元素是否出現,出現則返回,未出現則間隔0.5s后再查找一次。10s后仍未找到則拋出找不到元素異常
• 什么是線程等待(硬式等待)
time.sleep(3) 強制當前線程等待3s后再繼續執行。
• 什么是pollingEvery
python 的selenium中未發現這個,可能是指WebDriverWait中的poll_frequency參數
• 你寫的測試腳本能在不同瀏覽器上運行嗎,支持跨瀏覽器平台嗎
支持,在初始化driver的時候使用不同的Webdriver即可,我使用pytest做自動化測試時通過定義addoption方法,在pytest啟動時根據傳參不同,調用不同的瀏覽器
• 什么是POM,為什么要使用它
PageObjectModel,頁面對象模型,將頁面映射成代碼中的類,頁面上的元素映射成類中的屬性,頁面上的操作映射成類的方法,使用POM在進行測試用例編寫時只需要調用在頁面類中定義好的方法即可,頁面發生變動只需修改維護對應頁面類中的屬性或方法即可,無需修改測試用例,減少因頁面頻繁變動而造成的大量維護成本。
• 在你做自動化過程中,遇到了什么問題嗎?舉例下
在做UI自動化時,數據的前置我通過接口進行生成,接口返回成功了,但是真正到頁面上可查詢存在一個時間差,導致case運行失敗,我通過參考顯示等待的方式,在頁面上操作接口生成的數據無法找到時,同樣使用類似輪詢的機制,未找到,則刷新頁面再找,直到超時時間內找到未知,再繼續執行后續的case操作。
有些手工操作時單擊的操作通過代碼單擊會報元素不可點擊,使用雙擊解決。
UI運行受客戶端環境影響較大,我使用docker selenium,保證了每次運行的瀏覽器實例都是新的無污染。
• 舉例一下你遇到過那些異常,在selenium自動化測試
超時,元素不可點擊,未找到元素,元素沒有某個屬性
• 如何處理alert彈窗
a =driver.switch_to.alert
a.accept()
a.dismiss()
a.text
• 在selenium中如何處理多窗口?
driver.window_handles #獲取窗口列表
driver.switch_to.windows(windows_name)
• 你查找元素遇到過在Frame里面嗎?你是如何處理
暫時沒遇到,driver.switch_to.fram(id/name/索引)
• Frame里面元素定位的?
切換至Frame內后繼續操作即可
• 怎么驗證勾選框是enable/disabled/checked/Unchecked/ displayed/not displayed?
ele=driver.find_element((locator,value))
ele.is_displayed()
ele.is_enabled()
ele.is_selected()
• 如何處理下拉菜單?
我的項目中下拉框是div+li組成的下拉框,無法使用selenium中的select類提供的方法,我通過點擊下拉框,喚出菜單,然后使用xpath,定位文本內容進行內容選擇點擊操作
• 在日歷這種web表單你是如何處理的?
日歷表單如果可點擊,可以使用點擊操作,如果不可點擊可使用driver.execute(js代碼),進行賦值操作(據反饋目前一些日歷表單可能需要鍵盤操作配合才可以)
• 關閉瀏覽器中quit和close的區別
close只是關閉窗口,session連接並沒有關閉,瀏覽器進程仍然處於運行狀態,quit是斷開session連接,瀏覽器進程關閉
• 在Selenium中如何實現截圖,如何實現用例執行失敗才截圖
driver.get_screenshot_as_png()
在用例執行時進行try expect 異常捕獲,expect時截圖
• 在Selenium中如何實現拖拽滾動條?
使用js進行拖拽,滾動至頂部:driver.execute("windows.scrollTo(0,0)")
• 如何實現文件上傳?
文件上傳若是input類型的可嘗試使用send_keys() 方法(據反饋VUE組件中input類型為file的以無法使用send_keys方法)
其它類型需使用借助第三方實現.
• 如何處理“不受信任的證書”的問題?
# Firfox
profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True
driver = webdriver.Firefox(firefox_profile=profile)
# Chrome
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
driver = webdriver.Chrome(chrome_options=options)
# IE
capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True
driver = webdriver.Ie(capabilities=capabilities)
• 如何實現鼠標懸停,鍵盤事件和拖拽動作?
使用ActionChains類的方法
click(on_element=None) ——單擊鼠標左鍵
click_and_hold(on_element=None) ——點擊鼠標左鍵,不松開
context_click(on_element=None) ——點擊鼠標右鍵
double_click(on_element=None) ——雙擊鼠標左鍵
drag_and_drop(source, target) ——拖拽到某個元素然后松開
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個坐標然后松開
key_down(value, element=None) ——按下某個鍵盤上的鍵
key_up(value, element=None) ——松開某個鍵
move_by_offset(xoffset, yoffset) ——鼠標從當前位置移動到某個坐標
move_to_element(to_element) ——鼠標移動到某個元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角坐標)多少距離的位置
perform() ——執行鏈中的所有動作
release(on_element=None) ——在某個元素位置松開鼠標左鍵
send_keys(*keys_to_send) ——發送某個鍵到當前焦點的元素
send_keys_to_element(element, *keys_to_send) ——發送某個鍵到指定元素
使用Keys類實現鍵盤事件:
ele.send_keys(Keys.CONTROL,'x') #實現"CTRL + X"
• 如何獲取頁面標題,懸浮文本和錯誤文本,並驗證?
assert driver.title == 'xx標題'
懸浮文本和錯誤文本可以使用ActionChains().move_to_element() 然后ele.text
• 在selenium自動化測試中,你-般完成什么類型的測試?
回歸測試
• 你是如何管理你的測試用例並執行?
測試用例按照業務模塊划分成以test開頭的py文件,pytest測試框架可識別以test開頭或結尾的測試類或方法或文件,運行在根目錄執行pytest 即可,當需要指定較多的參數或需要其他操作時定義run入口文件,直接運行run文件即可
• 關於自動化測試報告生成?
使用的是pytest-html庫生成html報告及allure
• 你如何用Selenium測試?
將基礎通用操作封裝成base類,然后頁面對象模型繼承Base類。
• 如何解決問題?
針對UI自動化中遇到的問題,先查看報錯信息,定位是自己封裝問題則修改封裝,非自己代碼問題則先看實現相關功能模塊依賴庫的官方說明文檔,官方文檔中未解決問題,若是開源庫則對應github參考查看issue欄目,最后再百度或谷歌
• 你是怎么開發測試框架的?
• 做自動化測試的目的?
接口自動化測試可盡快介入項目測試,在聯調前發現編碼中的問題,在版本更新發布后即進行接口自動化可對既有功能進行驗證,保證此次新功能或bug修復對原有功能無影響。UI自動化可減少手工操作,進行兼容性測試。加快版本更新發布進度
• 如何判斷case是否通過?
接口的case 根據規定的響應狀態碼 + 接口響應的值 + db 中對應的數據變化進行判斷
UI的case 根據業務場景進行后頁面上的變動及相關特定提示語 ,也同樣可根據db中的數據狀態進行判斷
• 你項目中有多少case,通過率怎么樣?
UI的case 單次運行目前通過率大約在95% 以上,通過加入失敗重試機制后大約98%-99%左右
• 失敗截圖的原理是什么?
我在框架中使用driver.get_screenshot_as_png() 方法在Base類中使用try expect在expect時即調用截圖方法
• 報告哪里來,主要統計什么?
使用第三方庫實現,統計用例成功失敗,跳過,條數,運行時間、環境等
• 寫出selenium中你最熟悉的接口或者類
WebDriverWait:顯示等待的類
webdrier.Chrome:實例化Chrome driver實例
• Xpath是什么?
一門查找XML文檔中信息的語言
• findElement()和findElements()方法有什么區別
前者返回一個WebElement對象,后者返回一個由WebElement 組成的list
• 登錄按鈕除了click方法還有其他方式嗎?
driver.submit()
• 怎么對含有驗證碼的功能進行自動化測試
簡單驗證碼使用PIL庫進行解決,過於復雜,識別難度過高與開發溝通使用通用驗證碼,或者使用第三方服務提供的圖片識別服務
• 舉一個WebDriver中方 法重載的例子
webdriver.Chrome() 的__init__方法即重載了RemoteWebDriver的__init__方法
• 你如何模擬瀏覽器的前后移動?
driver.forward()
driver.back()
• 你如何獲得當前頁面的URL?
driver.current_url
• 如何從文本框中獲取打字文本?
ele.text
• 你如何清除中文本框的內容?
ele.clear()
原文地址:http://www.grassroadsz.top/article/selenium_know/
--------------------------------------------------------------------------------
關注微信公眾號(測試工程師小站)即可在手機上查閱,並可接收更多測試分享,發送【測試資料】更可獲取百G測試教程~