【selenium】UI自动化面试题精简附答案
【selenium】UI自動化面試題
題記:
最近也想換工作了,所以整理一下該復(fù)習(xí)的筆記,也提供大家參考與學(xué)習(xí)
1、selenium的原理是什么?
selenium 的原理涉及到 3 個部分, 分別是: 1.瀏覽器 2.driver:一般我們都會下載driver 3.client:也就是我們寫的代碼
運行過程:
client 其實并不知道瀏覽器是怎么工作的,但是 driver 知道,在 selenium 啟動以后,driver 其實充當(dāng)了服務(wù)器的角色,跟 client 和瀏覽器通信
client 根據(jù) webdriver 協(xié)議發(fā)送請求給 driver,driver 解析請求,并在瀏覽器上執(zhí)行相應(yīng)的操作,并把執(zhí)行結(jié)果返回給 client。這就是 selenium 工作的大致原理。
2、WebDriver提供哪些常見類型的驅(qū)動程序?
WebDriver 中常見驅(qū)動程序有(這部分建議在面試前查閱一下官網(wǎng),做到 實時同步更新):
FirefoxDriver
InternetExplorerDriver
ChromeDriver
SafariDriver
OperaDriver
AndroidDriver
3、webdriver的協(xié)議是什么?
client與driver之間的約定,無論client是使用java實現(xiàn)還是c#實現(xiàn),只要通過這個約定,client 就可以準(zhǔn)確的告訴drier它要做什么以及怎么做。 webdriver 協(xié)議本身是 http 協(xié)議,數(shù)據(jù)傳輸使用 json。這里有webdriver協(xié)議所有endpoint,稍微瀏覽下就知道這些endpoints涵蓋了selenium 的所有功能。
4、什么是page object設(shè)計模式?
簡單來說就是用 class 去表示被測頁面。在 class 中定義頁面上的元素和 一些該頁面上專屬的方法。
簡要:
將頁面操作放入一個類整體封裝
將頁面元素放入一個類整體封裝
將頁面動作整合一個類,在這個類中將元素跟操作結(jié)合成動作
測試用例類,直接調(diào)用頁面動作類進(jìn)行測試(測試類)
5、什么是page factory?
Page Factory 實際上是官方給出的 java page object 的工廠模式實現(xiàn)。
6、如何查找元素是否顯示在屏幕上?
WebDriver 通過 isDisplayed(),isSelected(),isEnabled() 這三種方法判斷 Web 元素的可見性,這類方法將返回結(jié)果是布爾類型; Web元素可以是按鈕,下拉框,復(fù)選框,單選按鈕,標(biāo)簽等。 ①isDisplayed():boolean b1 = driver.findElement(By.id(“XXX”)).isDisplayed(); ②isSelected():boolean b2 = driver.findElement(By.id( “XXX”)).isSelected(); ③isEnabled():boolean b3 = driver.findEleme nt(By.id(“XXX”)).isEnabled();
7、selenium中如何判斷元素是否存在?
selenium 中沒有提供原生的方法判斷元素是否存在,一般我們可以通過定位元素+異常捕獲的方式判斷.
# 判斷元素是否存在
try:
driver.find_element_by_id('none')
except NoSuchElementException:
print 'element does not exist'
8、selenium中hidden或者是display = none的元素是否可以定位到?
不可以,selenium不能定位不可見的元素。display=none的元素實際上是不可見元素。
9、selenium中如何保證操作元素的成功率?也就是說如何保證我點擊的元素一定是可以點擊的?
1.增加固定等待或者隱式等待,讓頁面元素先加載出來 2.被點擊的元素一定要占一定的空間,因為 selenium 默認(rèn)會去點這個元素的中心點,不占空間的元素算不出來中心點; 3.如果是元素被遮擋住,先去除遮擋元素,可以使用js或者修改元素屬性實現(xiàn) 4.如果是下拉框,先點擊下拉框,在定位里面的值
5.如果是iframe框架中,則需要先跳入框架中,再去定位元素
6.判斷元素是否能點擊/選擇
10、selenium自動化頁面元素找不到存在異常的原因?
1.頁面沒加載出來,就開始點擊查找元素 2.元素被遮擋 3.元素可能在嵌入的iframe框架當(dāng)中 4.定位的元素信息錯誤,定位方法有問題
5.定位的元素不在當(dāng)前頁面,需要下拉滾動條才能識別到
11、如何去定位屬性動態(tài)變化的元素?
1.使用相對定位的方法,父節(jié)點、子節(jié)點、兄弟節(jié)點定位 2.可以使用findelements然后去遍歷元素取下標(biāo)定位元素 3.部分元素屬性,xpath中的contains/strats-with/ends-with都可以
12、如何去定位頁面上動態(tài)加載的元素?
觸發(fā)動態(tài)事件,繼而 findelement;如果是動態(tài)菜單,需要一級一級的 find。
舉例:
下拉框里面的元素定位
點擊下拉框
點擊選中的元素
13、如何提高selenium腳本的執(zhí)行速度?
使用更高配置的電腦和選擇更快的網(wǎng)絡(luò)環(huán)境;
使用效率更高的語言,比如 java 執(zhí)行速度就快過 python;
優(yōu)化代碼;
不要盲目的加 sleep,盡量使用顯式等待;
可以考慮分布式執(zhí)行 或者使用 selenium grid;
chrome 瀏覽器和 safari 瀏覽器的執(zhí)行速度看上去是最快的
14、用例在運行過程中經(jīng)常會出現(xiàn)不穩(wěn)定的情況,也就是說這次可以通過,下次就沒辦法通過了,如何去提升用例的穩(wěn)定性?
測試專屬 profile,盡量讓靜態(tài)資源緩存;
盡量使用顯式等待;
盡量使用測試專用環(huán)境,避免其他類型的測試同時進(jìn)行,對數(shù)據(jù)造成干
擾。
15、id,name,clas,xpath,css selector這些定位器,你最偏愛哪一種,為什么?
xpath 和 css 最為靈活。id、name 等需要開發(fā)支持。(因人而異,看你自己喜歡用什么)
16、selenium為什么不推薦使用xpath定位?
selenium 使用 xpath 定位時采用遍歷頁面的方式,性能指標(biāo)較差。 另外 xpath 定位有通過絕對路徑定位的,有時會不準(zhǔn)確; 而用 css 選擇器定位比較簡潔,運行速度更快,通常用于性能要求嚴(yán)格 的場景。
17、如何去定位頁面上動態(tài)加載的元素?
顯式等待。(顯示等待就是有條件的等待,隱式等待就是無條件的等待, 如 sleep、driver.implicitly_wait())
顯示等待例子: WebDriverWait(driver, 3, 0.5) #傳入三個參數(shù),第一個是瀏覽器驅(qū)動,第 二個是等待多少秒,第三個是每隔多少秒監(jiān)控一次
18、如何去定位屬性動態(tài)變化的元素?
找出屬性動態(tài)變化的規(guī)律,然后根據(jù)上下文生成動態(tài)屬性
19、如何通過子元素定位父元素?
通過父元素定位子元素,可以通過二次定位來找到。 第一種:通過子元素定位父元素,css/xpath父子級查找,軸定位查找 第二種:通過 xpath 的語法直接定位。 如.//*[@name="hello"]/.. 兩 個點代表父級元素。
20、selenium中隱藏元素定位,你該如何做?
隱藏元素可以正常定位到,只是不能操作(定位元素和操作元素是兩碼 事,操作元素是指 click 、clear 、send_keys 等這些方法)。我們可以 用 js 來操作隱藏元素。js 和 selenium 不同,只有頁面上有的元素(在 dom 里面的)都能正常操作。
21、如何判斷一個頁面上元素是否存在?
法 1:用 try...except 在代碼塊加上 法 2:用 elements 定義組元素方法 然后根其元素個數(shù) len()<1 存在 返回 True, 不存在則返回 False 法 3:結(jié)合 WebDriverWait 和 excepted_conditions 條件判斷(強烈推薦)
WebDriverWait(driver,30,1).until(excepted_conditions.title_contains(u"軟件測試部落"))#判斷 title,每間隔 1 秒判斷一次,30 秒超時,存在返回 True,不存在則返回 False
22、page object設(shè)置模式中,是否需要在page里定位的方法中加上斷言?
一般不要,除非是要判斷頁面是否正確加載。
23、driver.close() 和driver.quit() 有什么區(qū)別?
driver.close() 關(guān)閉用戶當(dāng)前正在使用的 Web 瀏覽器窗口 quit()方法 用于關(guān)閉程序已打開的所有窗口。
24、selenium 上傳文件操作,需要被操作對象的type屬性是什么?
file
25、selenium如何處理web彈窗?js彈窗?
需要使用 driver.switch_to.alert()
26、如何在webdriver中調(diào)用應(yīng)用程序?
driver.get('url') 或者 driver.navigate().to('url')
27、selenium中常見的異常?
NoSuchElementException
ElementNoInteractac
tableException
NoAlertPresentException
28、怎樣去選擇一個下拉框中的value=xx的option?
需要二次定位 : ①拿到所有的 option; ②遍歷 option 的 value 并與后臺拿到的值進(jìn)行比較(相同則選擇該option)。
29、點擊鏈接以后,selenium是否會自動等待該頁面加載完畢?
不會。所以有的時候,當(dāng) selenium 并未加載完一個頁面時再請求頁面資源,則會誤報不存在此元素。所以首先我們應(yīng)該考慮判斷,selenium 是否加載完此頁面。其次再通過函數(shù)查找該元素。
30、selenium 是否可以調(diào)用js來對dom對象進(jìn)行操作?
可以
31、selenium 是否可以向頁面發(fā)送鼠標(biāo)滾輪操作?
不能。(可利用 javaScript 來實現(xiàn)拖拽頁面滾動條。)
32、selenium可以處理window彈窗嗎?
selenium 本身是不可以處理 windows 彈窗的,但是可以借助 AutoIT 小工具來完成對 windows 彈窗的操作,比如 上傳下載附件等。
33、如何在定位元素后高亮元素(以調(diào)試為目的)?
使用 javascript 將元素的 border 或者背景顏色改成黃色或其他顏色即 可。
34、selenium是否有讀取excel文件的庫?
沒有,需要借助第三方工具。例如 Apache PIO 插件
35、上傳圖片的幾種方式?
send_keys 和 AutoIT 工具實現(xiàn).
可以使用pyautogui
36、selenium是否支持桌面應(yīng)用軟件的自動化測試?
不支持。selenium 是根據(jù)網(wǎng)頁元素的屬性來確定范圍元素的。
37、Selenium是否支持用例的執(zhí)行的引擎。
引擎好比就是一個發(fā)動機。Selenium 是沒有關(guān)于測試用例和測試套件管 理和執(zhí)行的模塊。我們需要借助第三方單元測試框架來實現(xiàn)用例管理和 用例的執(zhí)行。例如 Java 中有 Junit 或者 testNG,python 中有 unittest 單元測試框架。
38、列舉Selenium的局限性有哪些?
Selenium 僅支持基于 Web 的應(yīng)用程序的測試; 無法使用 Selenium 測試移動應(yīng)用程序,可以選擇 Appium 進(jìn)行移動端 功能測試; 驗證碼和條形碼閱讀器無法使用 Selenium 進(jìn)行測試;Selenium 本身不具有生成測試報告的功能,以JAVA 為例,需要結(jié)合第三方框架如 TestNG 或 JUnit 來生成測試報告。
39、Selenium如何拖動滾動條
# 滾動到底部 # document.body.scrollHeight 是用來獲取滾動條的高度 js = 'window.scrollTo(0, document.body.scrollHeight)' driver.execute_script(js)
40、在你做自動化過程中,遇到了什么問題嗎?
當(dāng)然有遇到問題和挑戰(zhàn),主要有以下幾點:
頻繁地變更UI,經(jīng)常要修改頁面對象里面代碼
運行用例報錯和處理,例如元素不可見,元素找不到這樣異常
測試腳本復(fù)用,盡可能多代碼復(fù)用
一些新框架產(chǎn)生的頁面元素定位問題,例如ck編輯器,動態(tài)表格等
腳本上傳涉及到windows跟mac系統(tǒng)的差異,使用不同的腳本windows可以使用pyautogui,或者是autoit
多人合作編寫測試用例的時候會導(dǎo)致沖突等,使用分excel分表格分模塊的方法
40、在Selenium中如何處理多窗口?
使用切換tab的方法
用到swithTo方法。需要獲取當(dāng)前瀏覽器多窗口句柄,然后根據(jù)判斷跳轉(zhuǎn)新句柄還是舊句柄
# 句柄封裝
def get_window_handle(self):
"""獲取句柄"""
return self.driver.window_handles
def switch_to_window_by_handle(self, window_handle):
"""
:param window_handle: 切換到某個句柄
:return:
"""
self.driver.switch_to.window(window_handle)
后續(xù)持續(xù)更新~敬請期待
總結(jié)
以上是生活随笔為你收集整理的【selenium】UI自动化面试题精简附答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一二九运动口号文案大全:12.9运动主要
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?