1. 什么是Selenium?
Selenium是一個開源的web自動化測試框架,主要是基於web uI的自動化測試。現在的版本,逐步增加了對移動端的自動化測試。Selenium支持多種語言進行開發自動化測試腳本,有Java,python,C#,Javascript等等。Selenium支持跨瀏覽器平台測試。
2.Selenium是否支持桌面應用軟件的自動化測試。
Selenium不支持桌面軟件的自動化測試,Selenium是根據網頁元素的屬性才定位元素,而其他桌面軟件自動化測試工具是根據桌面元素的位置來定位元素,當然現在也有根據桌面元素的屬性來定位的。
3.Selenium是否支持用例的執行的引擎。
引擎好比就是一個發動機。Selenium是沒有關於測試用例和測試套件管理和執行的模塊。我們需要借助第三方單元測試框架來實現用例管理和用例的執行。例如Java中有Junit或者testNG,Python中有unittest單元測試框架。
4.Seleinum是否有讀取excel文件的庫
沒有,這里需要用到第三方工具。例如Apache POI插件。
5.Selenium有哪些組件?
最早的有Selenium IDE,IDE只支持安裝在fiefox上一個插件,支持錄制自動化腳本。還有
remote RC,和Grid 和webdriver。我們一般最重要的就是使用webdriver。
6.Selenium有什么限制或者缺陷
除了基於web的軟件和mobile的程序,selenium不支持桌面軟件自動化測試。軟件測試報告,和用例管理只能
依賴第三方插件,例如Junit/TestNG和unittest。由於它是免費的軟件,所以沒有供應商去提供支持和服務,有問題,只能求助selenium社區。還有一個就是,selenium入門門檻可能有點高,需要具備一定編程語言基礎的才能玩轉。
7.在selenium中,有哪些不同定位元素方法
ID/className/Name/LinkText/PartialLinkText/Xpath/CSS selector
8.什么是imlicitlyWait
imlicitlyWait是隱式等待,一般在查找元素的時候使用。例如,我設置一個查找元素最大時間為10秒,使用了
imlicitlyWait后,如果第一次沒有找到元素,會在10秒之內不斷循環去找元素,知道超過10秒,報超時錯誤。
9.什么是expliciteWait
這個是顯式等待,就是不管如何都是要等10秒,如果你設置了10秒超時,這個是selenium2的功能
在selenium3中,我暫時沒有找到這個接口。
10.什么是線程等待
有時候,我們需要強制設置線程等待,Thread.sleep(2000),driver這個實例,就是當前的線程。
11.什么是pollingEvery
這個是設置個一段時間就去做一件事,例如下面設置隔一秒就去查找元素一次。
WebDriverWait wait = new WebDriverWait(driver,30);
wait.pollingEvery(1, TimeUnit.SECONDS);
driver.findElement(By.xpath("xxxx"));
12你能解釋下Selenium這個框架嗎?
這個問題在面試中被問到的概率還是比較高的,同樣類似的問題有,selenium的原理是什么?首先不要被這個問題嚇到,我們主要圍繞selenium的歷史版本演化和基本的組件去展開描述就好,最后回到webdriver這個組件上面,我們基本上都是在使用webdriver提供的API。所以這個題目的最好的答案就是把圖畫出來,然后自己解釋幾句就可以。 早期Selenium1.0是有Selenium Grid,Selenium RC, Selenium IDE, Webdriver四部分組成,后來Selenium RC和Webdriver合並之后,就是Selenium2,當前我們在使用Selenium3。
Selenium Grid:它是selenium框架的一部分,主要是專門用來把測試用例並行地在不同瀏覽器,不同操作系統,不同機器上運行。一般我們寫腳本,調試都在單機上線性地一個測試用例接着一個測試用例執行下去。如果有人問題如何提高測試用例執行效率,告訴他Selenium Grid可以實現。
Selenium IDE: 這個算Selenium里面最簡單的一個組建,只支持在火狐瀏覽器上安裝這個擴展程序,支持錄制web ui腳本,然后導出不同語言的腳本,例如java c#等。這個功能算雞肋,因為很多時候導出腳本debug的時間還不如自己代碼重新寫來的快。
Selenium RC: RC是remote control的縮寫,主要的功能就是讓你不管使用什么語言(Selenium支持的這幾種語言之一)來寫測試腳本,只要是這個瀏覽器支持java script,那么寫一遍測試腳本,都能在這些不同瀏覽器運行腳本。
Webdriver:這個是用來替代Selenium RC,就是一個網頁自動化工具,支持在不同瀏覽器上運行測試腳本,運行速度比Selenium RC要快很多。據說(我也記得不清楚),webdriver最早是google內部開發的一個工具,用來捐給selenium了,變成開源了。
目前,我們做的web ui的自動化測試,大部分都是在使用webdriver提供的API來模擬手動測試過程中的一系列動作和行為。基本上通過這個方式來回答這個問題,那就沒問題了。
13.你寫的測試腳本能在不同瀏覽器上運行嗎,支持跨瀏覽器平台嗎
這里出現了跨瀏覽器平台的概念,就是寫一個測試用例,可以在主流的幾個瀏覽器跑起來。
是的,我寫的測試用例能在IE,火狐和谷歌這三種瀏覽器上運行。主要是在windows平台上運行腳本,所以mac的safari瀏覽器暫時沒有寫過。主要實現這個跨瀏覽器的思想就是,把瀏覽器類型寫到配置文件,代碼里寫if語句去判斷配置文件的瀏覽器的類型,來決定用什么瀏覽器去執行測試用例。
14.一天你寫多少個自動化測試用例
這個要看具體情況,完全取決於手工測試用例的實現難易程度。通常,熟練的話,寫一個5到8個步驟的測試用例,差不多要半小時。時間最多花在元素定位和報錯debug上面,例如在POM思想的框架中,某一些元素定位和方法是復用的,可能會更快一些。所以,一天,大概能完成15-30個自動化測試用例。
15.什么是POM,為什么要使用它
POM是Page Object Model的簡稱,它是一種設計思想,而不是框架。大概的意思是,把一個一個頁面,當做一個對象,頁面的元素和元素之間操作方法就是頁面對象的屬性和行為,所以自然而然就用了類的思想來組織我們的頁面。一般一個頁面寫一個類文件,這個類文件包含該頁面的元素定位和業務操作方法。
為了我們測試用例寫的簡單,清晰,我們很多時候在頁面對象會封裝很多業務操作方法,測試腳本只需要調用相關方法就可以。
還有一個可能和這個問題相關的面試題,如果頁面元素經常發生需求變化,你是如何做,答案就是采用POM思想。好處就是只要該一個頁面,我就去修改這個頁面對象的元素定位和相關方法,腳本不需要修改。
16.在你做自動化過程中,遇到了什么問題嗎?舉例下
這個問題,不管是自動化還是任何工作,都會被問到。主要想知道你是如何解決問題的,從而推斷你問題分析和解決的能力。
當然有遇到問題和挑戰,主要有以下幾點:
頻繁地變更UI,經常要修改頁面對象里面代碼
運行用例報錯和處理,例如元素不可見,元素找不到這樣異常
測試腳本復用,盡可能多代碼復用
一些新框架產生的頁面元素定位問題,例如ck編輯器,動態表格等
這個遇到的難點完全取決寫腳本人的代碼能力。回答三個左右就差不多,記得既然拋出了難點問題,一定要記得處理這個問題的方法。
17.舉例一下你遇到過那些異常,在selenium自動化測試過程中
通過這個問題,大概知道你寫過多少腳本。寫腳本過程最常見的異常就是,這個元素無法找到。常見的selenium有以下這些:
1. ElementNotSelectableException :元素不能選擇異常
2. ElementNotVisibleException :元素不可見異常
3. NoSuchAttributeException :沒有這樣屬性異常
4. NoSuchElementException:沒有該元素異常
5. NoSuchFrameException :沒有該frame異常
6. TimeoutException : 超時異常
7. Element not visible at this point :在當前點元素不可見
18. 如何處理alert彈窗
我們常見的alert彈窗有兩種:基於windows彈窗和基於web頁面彈窗
我們知道,webdriver是能夠處理alert彈窗的,Selenium提供了Alert這個接口。相關操作代碼如下:
// 切換到Alert
Alert alert = driver.switchTo().alert();
// 點擊彈窗上確定按鈕
alert.accept();
// 點擊彈窗的取消按鈕
alert.dismiss()
// 獲取彈窗上線上的文本文字內容
alert.getText();
// 有些彈窗還支持文本輸入,這個可以把要輸入字符通過sendkeys方法輸入
alert.sendkeys();
19. 在selenium中如何處理多窗口?
這個多窗口之間跳轉處理,在實際selenium自動化測試經常遇到。就是,你點擊一個鏈接,這個鏈接會在一個新的tab打開,然后你接下來要查找元素在新tab打開的頁面,所以這里需要用到swithTo方法。
需要獲取當前瀏覽器多窗口句柄,然后根據判斷跳轉新句柄還是舊句柄,具體代碼可以參考我博客文章:http://blog.csdn.net/u011541946/article/details/73611301
20. 你查找元素遇到過在Frame里面嗎?你是如何處理Frame里面元素定位的?
有時候我們知道元素定位表達式沒有問題,但是還是提示no such element,那么我們就需要考慮這個元素是否在frame中。如果在,我們就需要從topwindow,通過swithcTo.Frame()方法來切換到目標frame中,可以通過frame的name和id和索引三種方法來定位frame。
21. 怎么驗證勾選框是enable/disabled/ checked/Unchecked/ displayed/ not displayed?
通過以下方法來驗證元素是enable 還是disable
boolean enabled = driver.findElement(By.xpath("元素定位表達式")).isEnabled();
通過以下方法來驗證元素是select/check
boolean checked = driver.findElement(By.xpath("元素定位表達式")).isSelected();
通過以下方法來驗證元素是dispalyed還是not display
boolean displayed = driver.findElement(By.xpath("元素定位表達式")).isDisplayed();
22. 如何處理下拉菜單?
通常我們也可以通過Click方法來點擊下拉菜單里面的元素,還有一種方法,在Selenium中有一個類叫Select,支持這種下拉菜單交互的操作。
基本使用語法是這樣的:
Select Se=new Select(element);
Se.selectByIndex(index);
Se.selectByvalue(value);
Se.selectByVisibleText(text);
23. 在日歷這種web 表單你是如何處理的?
首先要分析當前網頁試用日歷插件的前端代碼,看看能不能通過元素定位,點擊日期實現,如果不能,可能需要借助javascript。還有些日歷控件一個文本輸入框,可以直接sendKeys()方法來實現傳入一個時間的數據。
24. 關閉瀏覽器中quit和close的區別
簡單來說,兩個都可以實現退出瀏覽器session功能,close是關閉你當前聚焦的tab頁面,而quit是關閉全部瀏覽器tab頁面,並退出瀏覽器session。知道這兩個區別,我們就知道quit一般用在結束測試之前的操作,close用在執行用例過程中關閉某一個頁面的操作。
25. 什么是頁面加載超時
Selenium中有一個 Page Load wait的方法,有時候,我們執行腳本的速度太快,但是網頁程序還有一部分頁面沒有完全加載出來,就會遇到元素不可見或者元素找不到的異常。為了解決問題,讓腳本流暢的運行,我們可以通過設置頁面加載超時時間。具體代碼是這個:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);
這行作用就是,如果頁面加載超過10秒還沒有完成,就拋出頁面加載超時的異常。
26.什么是JavaScript Executor,你什么時候會用到這個?
JavaScript Executor是一個接口,給driver對象提供一個執行javaScript並訪問和修改前端元素屬性和值。
還是有比較多的場景,我們可能或者需要借助javaScript來實現:
1.元素通過現有定位表達式不能夠實現點擊
2.前端頁面試用了ck-editor這個插件
3.處理時間日期插件(可能)
4.生成一個alert彈窗
5.拖拽滾動條
基本語法:
JavascriptExecutor js =(JavascriptExecutor) driver;
js.executeScript(Script,Arguments);
27.在Selenium中如何實現截圖,如何實現用例執行失敗才截圖
在Selenium中提供了一個TakeScreenShot這么一個接口,這個接口提供了一個getScreenshotAs()方法可以實現全屏截圖。然后我們通過java中的FileUtils來實現把這個截圖拷貝到保存截圖的路徑。
代碼舉例:
File src=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
// 拷貝到我們實際保存圖片的路徑
FileUtils.copyFile(src,new File("C:/selenium/error.png"));
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
如果要實現執行用例發現失敗就自動截圖,那么我們需要把這個截圖方法進行封裝。然后在測試代碼中的catch代碼塊去調用這個截圖方法。這個我們在POM的框架中一般是把截圖方法封裝到BasePage這個文件中。
28.在Selenium中如何實現拖拽滾動條?
在Selenium中通過元素定位會自動幫你拖拽到對應位置,所以是沒有自帶的scoll方法。但是這個是有限制,例如當前頁面高度太長,默認是頁上半部分,你定位的元素在頁尾,這個時候可能就會報元素不可見的異常。我們就需要利用javaScript來實現拖拽頁面滾動條。
我們一般可以兩個方法去拖拽,一個是根據拖拽的坐標(像素單位),另外一個是根據拖拽到一個參考元素附件。
代碼舉例(根據元素坐標拖拽):
JavascriptExecutor jse= (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0,250)", "");
29.如何實現文件上傳?
我們在web頁面實現文件上傳過程中,可以直接把文件在磁盤完整路徑,通過sendKeys方法實現上傳。如果這種方法不能實現上傳,我們就可能需要借助第三方工具,我用過一個第三方工具叫autoIT.
還有一個方法是利用robot類:
http://blog.csdn.net/u011541946/article/details/74332938
30.如何處理“不受信任的證書”的問題?
例如,在登錄12306網站的時候,如果你沒有下載和安裝過這個網站的根證書,那么你就會遇到打開12306網站提示證書不受信任的攔截頁面。
下面舉例火狐和谷歌上處理這個問題的基本代碼
火狐:
// 創建firefoxprofile
FirefoxProfile profile=new FirefoxProfile();
// 點擊繼續瀏覽不安全的網站
profile.setAcceptUntrustedCertificates(true);
// 使用帶條件的profile去創建一個driver對象
WebDriver driver=new FirefoxDriver(profile);
Chrome:
// 創建類DesiredCapabilities的對象
DesiredCapabilities cap=DesiredCapabilities.chrome();
// 設置ACCEPT_SSL_CERTS 變量值為true
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
// 新建一個帶capability的chromedriver對象
WebDriver driver=new ChromeDriver(cap);
31.findElement 和 FindElements有什么區別?
首先,兩個都是查找元素,都支持八大元素定位方法。findElement()得到的只有一個元素,如果根據提供的元素定位方式找不到,會報noSuchElement異常。
findElements()返回的是一組元素,所以我們需要根據能夠找到一組元素的表達式去定位,返回一組元素我們可以放在集合里,這樣我們就可以使用集合里面的迭代方法去遍歷元素,拿到元素去做其他操作。
32.在執行腳本過程,如何實現當前元素高亮顯示?
這個其實就是利用javaScript去修改當前元素的背景顏色來到達高亮顯示的效果,
33.如何獲取頁面標題,懸浮文本和錯誤文本,並驗證?
標題,我們可以通過driver.getTitle()方法來得到一個字符串,然后使用字符串的containts方法或者equals方法去進行斷言。
懸浮文本(tooltip),一般是利用Actions類,然后鼠標懸停方法,然后通過getText()方法來得到這個tooltip字符串。
錯誤信息,直接把這個錯誤字段先進行定位,然后通過getText()方法拿到錯誤文本,主要的斷言有包含,相等,不相等,不包含,以什么開頭等。
34.在selenium自動化測試中,你一般完成什么類型的測試?
主要是冒煙測試和回歸測試。回歸測試主要寫一些功能穩定,容易實現的場景,通過自動化手段去實現,節約測試時間。
35.你是如何管理你的測試用例並執行?
寫用例和管理並執行用例,我們都需要借助單元測試框架來實現,如果是Java語言一般有junit和TestNG,如果是python,常見的有unittest。
就你實際情況,說一下。例如我使用TestNG比較多,需要配置testng.xml文件來實現測試用例的執行。有時候需要配置多個testng.xml去實現不同的任務場景。再展開,可能問你一下testng框架的知識點。例如,方法依賴,用例執行優先級,數據源驅動等。
36.關於自動化測試報告生成?
我個人一般用TestNG原生的測試報告,也有第三方叫reportNG的插件,不過我沒有實際使用過。
Python下報告生成一般使用HTMLTestRunner.py
37. 了解或者使用過框架不?
類似的問題還有,你知道那些自動化測試框。
我們知道POM自動化測試框,還有關鍵字驅動框架。當然還有數據驅動框架,最近幾年出的行為驅動框架。
38. 這個框架是你自己寫的嗎?
我自己設計過POM的框架和關鍵字驅動框架。
39.能不能介紹下你的框架
把你自己POM的框架從上往下,樹形結構畫圖出來,然后講下有哪些層,哪些包,包下幾個重點的類的作用和一些工具類說一下。用例如何執行,頁面對象和元素定位放哪里,錯誤日志和截圖如何處理,報告如何得到等。