問題1:Selenium是什么,流行的版本有哪些?
Selenium是基於Web的最流行的UI自動化測試工具。它提供了一組支持多種平台的公開API(例如Linux,Windows,Mac OS X等)。此外,像Google Chrome,Mozilla Firefox,Internet Explorer和Safari等所有現代瀏覽器都可以用來運行Selenium測試。它也涵蓋了Android平台,其中Appium是實現Selenium Webdriver界面的工具,用於移動自動化。
值得注意的是,除了許多后來的小型版本之外,硒還有三個主要版本:
Selenium 1.0或Selenium RC,於2004年初發布,提供了一個使用服務器與瀏覽器交換命令和響應的API集。
Selenium 2.0或Selenium Webdriver,在2011年中推出,並在Selenium功能中引入了一系列重大改進。這些新的API完全取代了服務器組件,並與目標瀏覽器本地交互。
Selenium 3.0,這個版本是在2016年末發布的大版本。它帶來的主要變化是引入Webdriver API的W3C規范,用於瀏覽器自動化。也就是說,每個主要的瀏覽器都會有自己的Webdriver API來實現功能。
問題2:你如何從命令行啟動Selenium RC?
// 簡單的啟動Selenium RC的方法是
java -jar selenium-server.jar
// 在瀏覽器中運行一套Selenese腳本
java -jar selenium-server.jar -htmlSuite
問題3:在我的機器端口4444不是免費的。我怎樣才能使用另一個端口?
//你可以在運行selenium服務器時指定端口為 -
Java -jar selenium-server.jar -port 5555
問題4:什么是Selenium Server,它與Selenium Hub有什么不同?
Selenium Server是使用單個服務器作為測試節點的一個獨立的應用程序。Selenium hub代理一個或多個Selenium的節點實例。一個hub 和多個node被稱為Selenium grid。運行SeleniumServer與在同一主機上用一個hub和單個節點創建de Selenium grid類似。
問題5:你如何從Selenium連接到數據庫?
Selenium是一個Web UI自動化工具。它不提供任何API來建立數據庫連接。這取決於你使用Selenium進行自動化的編程語言。在下面的例子中,我們假設正在使用Java。
一個Connection對象表示與數據庫的連接。當我們使用連接方法連接到一個數據庫時,我們創建了一個連接對象,它代表了與數據庫的連接。單個數據庫可能有一個連接或多個連接,還可能有多個連接到不同的數據庫上。
我們可以使用Connection對象來做以下事情:
-
創建用於執行SQL語句的Statement,PreparedStatement和CallableStatement對象。
-
可以幫助我們提交或回滾一個JDBC事務。
-
如果你想知道連接到的數據庫或數據源信息,Connection對象通過使用DatabaseMetaData就可以收集有關數據庫或數據源的信息。
-
可以幫助我們關閉數據源。Connection.isClosed() 方法只有在調用了Connection.close()時才返回true 。此方法用於關閉所有連接。
首先我們需要通過使用DriverManager.getConnection()方法,建立與數據庫的連接。這個方法接受一個包含URL的字符串。DriverManager類嘗試查找可以連接到由字符串URL表示的數據庫的驅動程序。每當調用getConnection()方法時,DriverManager類都會檢查可以連接到URL中指定的數據庫的所有已注冊的Driver類的列表。
句法:
String url = "jdbc: odbc: makeConnection";
Connection con = DriverManager.getConnection(url, "userID", "password");
問題6:Selenium RC中定位器方法有哪些?
-
ID
-
Name
-
CSS (Cascade Stylesheet)
-
XPATH (Relative XPath and Absolute XPath)
-
Dom
問題7:你如何驗證多個頁面上存在的一個對象?
可以使用下面的Selenium命令來檢查:
assertTrue(selenium.isElementPresent(locator));
問題8:XPath中使用單斜杠和雙斜杠有什么區別?
-
如果XPath是從文檔節點開始,它將允許創建“絕對”路徑表達式。
例如 “/ html / body / p”匹配所有的段落元素。
-
如果XPath在文檔中的任意位置開始進行選擇匹配,那么它將允許創建“相對”路徑表達式。
例如 “// p”匹配所有的段落元素。
問題9:如何編寫Selenium IDE / RC的用戶擴展?
用戶擴展(UX)存儲在Selenium IDE或Selenium RC用來激活擴展的單獨文件中。它包含用JavaScript編寫的函數定義。
因為Selenium的核心是用JavaScript開發的,所以要符合原語言的標准規則來創建擴展。要創建一個擴展,我們必須用下面的設計格式來編寫函數。
// 樣例
Selenium.prototype.doFunctionName = function(){
}
函數名稱前面的“do”告訴Selenium這個函數可以被調用為一個步驟命令,而不是作為內部函數或私有函數被調用。
問題10:如何在頁面加載成功后驗證元素的存在?
它可以通過下面的代碼行來實現。
只需一點時間(以秒為單位)來檢查元素,如下所示:
public void waitForElementPresent(String element, int timeout) throws Exception {
for (int second = 0;; second++) {
if (second >= timeout)
fail("Timeout. Unable to find the Specified element" + element);
try {
if (selenium.isElementPresent(element))
break;
} catch (Exception e) {
}
Thread.sleep(1000);
}
}
問題11:你對Selenium Grid有什么了解?它提供了什么功能?
Selenium Grid是一款利用現有計算基礎架構大幅加速Web應用程序功能測試的工具。允許測試者輕松地在多台機器上並行運行多個測試,並且可以在異構環境中運行。
基於優秀的Selenium Web測試工具,Selenium Grid允許測試者並行運行多個Selenium Remote Control實例。更好的是,它集成顯示所有Selenium遠程控制,所以不必擔心實際的基礎設施。Selenium Grid將運行Selenium測試套件所需的時間,縮短到Selenium實例的單個實例運行時間的一小點。
問題12:如何從你的Java Class啟動Selenium服務器?
try {
seleniumServer = new SeleniumServer();
seleniumServer.start();
} catch (Exception e) {
e.printStackTrace();
}
問題13:Selenium中有哪些驗證點?
Selenium主要有三種驗證點 -
-
檢查頁面標題
-
檢查某些文字
-
檢查某些元素(文本框,下拉菜單,表等)
問題14:什么是XPath?什么時候應該在Selenium中使用XPath?
XPath是一種在HTML / XML文檔中定位的方法,可用於識別網頁中的元素。如果沒有與頁面上的元素相關聯的名稱/ ID,或者名稱/ ID的一部分是常量,則必須使用XPath。
絕對路徑用 - / 單斜杠
相對路徑用 - // 雙斜杠
ID,類,名稱也可以用於XPath :
-
//input[@name=’q’]
-
//input[@id=’lst-ib’]
-
//input[@class=’ lst’]
如果id / name / class的一部分是常量 :
-
//input[contains(@id,’lst-ib’)
問題15:什么是Selenium的CSS定位器策略?用例子來解釋。
CSS位置策略可以與Selenium一起使用來定位元素,它使用CSS定位方法,其中 -
絕對路徑用 - (空格符號)
相對路徑用 - >表示
ID,類,名稱也可以用於XPath:
-
css=input[name=’q’]
-
css=input[id=’lst-ib’] or input#lst-ib
-
css=input[class=’lst’] or input.lst
如果id / name / class只有一部分是常量:
-
css=input[id*=’lst-ib’)]
使用內部文本的元素位置策略:
-
css = a:contains(‘log out’)
問題16:當有很多定位器時,如ID、名稱、XPath、CSS定位器,我應該使用哪一個?
如果有唯一的名稱或標識符可用,那么應該使用它們來代替XPath和CSS定位器。如果沒有,那么CSS定位器應該被優先考慮,因為在大多數現代瀏覽器中,它們的評估速度比XPath更快。
問題17:在硒中處理多個彈出窗口的機制是什么?
可以使用命令getWindowHandles()來處理多個彈出窗口。
然后將所有窗口名稱存儲到Set變量中並將其轉換為數組。
接下來,通過使用數組索引,導航到特定的窗口。
driver.switchTo().window(ArrayIndex);
問題18:你如何處理使用Selenium的Ajax控件?
來看一個例子。假如一個文本框是一個Ajax控件,當我們輸入一些文本時,它會顯示自動建議的值。
處理這樣的控件,需要在文本框中輸入值之后,捕獲字符串中的所有建議值;然后,分割字符串,取值就好了。
Part2. WebDriver相關面試問題和答案
問題19:Selenium Webdriver優於Selenium RC的優點是什么?
Selenium RC的架構相當復雜,WebDriver的架構比Selenium RC簡單些。
-
Selenium RC比較慢,因為它使用了另外一個名為Selenium Core的JavaScript程序。相反,WebDriver比Selenium RC更快,因為它直接與瀏覽器對話,並使用瀏覽器自己的引擎來進行控制。
-
像其他JavaScript代碼一樣,Selenium Core可以訪問禁用的元素。Webdriver以更現實的方式與頁面元素進行交互。
-
Selenium RC的API集已經有所改進,但是仍有經常讓人困惑的冗余部分。WebDriver API更簡單,不包含任何冗余或混淆的命令。
-
Selenium RC無法支持無頭HtmlUnit瀏覽器。它需要一個真正的、可見的瀏覽器來操作。Web Driver可以支持無頭HtmlUnit瀏覽器。
-
Selenium RC內置了測試結果生成器,並自動生成測試結果的HTML文件。Web驅動程序沒有自動生成測試結果文件的內置命令。
問題20:“GET”和“NAVIGATE”方法的主要區別是什么?
Get方法能獲得一個頁面進行加載、或獲取頁面源代碼、或獲取文本,就這三。而Navigate將通過刷新,回退,前進的方式導航。
例如 -如果我們想要前進,並做一些功能,並返回到主頁。
這可以通過調用< navigate()>方法來實現。
driver.get() 方法會等到整個頁面被加載后才可以,而driver.navigate()只是重定向到該網頁,並不會等待。
問題21:隱式等待與顯式等待有什么不同?
隱式等待是設置的全局等待,分為1、頁面加載超時等待 ;2、頁面元素加載超時;3、異步腳本超時。如果是頁面元素超時,設置等待時間,是對頁面中的所有元素設置加載時間。隱式等待是其實可以理解成在規定的時間范圍內,瀏覽器在不停的刷新頁面,直到找到相關元素或者時間結束。
顯式等待只是用於特定搜索的一個計時器。它的可擴展性更強,你可以設置它來等待任何條件。通常情況下,可以使用一些預先構建的條件來等待元素變得可點擊,可見,不可見等,或者只是編寫適合需求的條件。
問題22:你將如何處理Selenium WebDriver中的警報/彈出窗口?
有兩種類型的警報通常被引用。
-
基於Windows的警報彈出窗口
-
基於Web的警報彈出窗口
基於Web的警報彈出窗口。
-
WebDriver為用戶提供了一種使用Alert界面處理這些彈出窗口的非常有效的方法。
-
void dismiss() - 一旦出現彈出窗口,dismiss()方法就會點擊“Cancel”按鈕。
-
void accept() - 只要彈出窗口出現,accept()方法就會點擊“Ok”按鈕。
-
String getText() - getText()方法返回警告框中顯示的文本。
-
void sendKeys(String stringToSend) - sendKeys()方法將指定的字符串模式輸入到警告框中。
基於Windows的警報彈出窗口。
處理基於windows的彈出窗口總是有點棘手,因為我們知道Selenium是一個自動化測試工具,它只支持Web應用程序測試,也就是說,它不支持基於Windows的應用程序,窗口警報就是其中之一。
-
Robot class是基於Java的實用程序,它模擬鍵盤和鼠標操作,並可以有效地用於處理基於windows的彈出與鍵盤事件的幫助。
-
KeyPress和KkeyRelease方法可以分別模擬用戶按下和釋放鍵盤上某個鍵的操作。
問題23:如何使用Selenium WebDriver截圖?
問題24:如何在WebDriver/如何管理HTTPS中的安全連接錯誤中解決Firefox中的SSL證書問題?
問題25:如何解決IE中的SSL認證問題?
// 打開瀏覽器后添加下面的命令
driver.navigate().to(“javascript:document.getElementById(‘overridelink’).click()”);
問題26:Selenium WebDriver中的可用定位器是什么?
-
ID,
-
Name,名稱
-
CSS,
-
XPath,
-
Class name,
-
TagName,
-
LinkText, 鏈接文本
-
Partial Link Text.部分鏈接文本
問題27:如何處理WebDriver中的AJAX控件?
AJAX代表異步JavaScript和XML。它不依賴於創建有效的XML所需的打開和關閉標簽的額外開銷。大部分時間WebDriver自動處理Ajax控件和調用。如果不能處理的話,可以按照下面的方式來處理。
//Waiting for Ajax Control
WebElement AjaxElement = (new WebDriverWait(driver,
10)).until(ExpectedConditions.presenceOfElementLocated(By.("")));
問題28:如何在標題菜單的子菜單項上執行鼠標移動操作?
應該首先移動菜單標題,然后移至彈出菜單項並單擊它。不要忘記在最后調用actions.perform() 。以下是一些示例Java代碼:
Part3. 一般框架面試問題和答案
問題29:大致分類和比較TDD/BDD和DDD框架?
你可能聽說過所有的這些縮寫詞。在這里會簡要地解釋它們,以及它們在系統測試生命周期中如何發揮作用的。
TDD - 測試驅動開發。
也被稱為測試驅動設計,是一個軟件開發的方法,在源代碼上重復進行單元測試。寫測試、看它失敗、然后重構。這個概念是,先編寫測試,然后來檢查我們寫的代碼是否正常工作。每次測試后,重構完成,然后再次執行相同或類似的測試。該過程需要重復多次,直到每個單元在功能上按預期工作。TDD是由XP引入的。
BDD - 行為驅動開發。
行為驅動的開發將TDD的一般技術和原理與領域驅動設計的思想相結合。其目的是幫助人們設計系統(即開發人員)確定合適的測試來編寫測試 - 即反映利益相關者所期望行為的測試。
DDD域驅動的開發。
DDD將業務領域概念映射到軟件工件中。DDD框架提供以下好處:
-
幫助團隊在業務和IT利益相關者之間建立一個共同的模型
-
該模型是模塊化的,可擴展的,易於維護,該設計反映了一種商業模式。
-
它提高了業務領域對象的可重用性和可測試性。
問題30:什么是數據驅動框架?它與關鍵字驅動框架有什么不同?
數據驅動框架。
在這個框架中,測試用例邏輯駐留在測試腳本中。測試數據被分離並保存在測試腳本之外。測試數據是從外部文件(Excel文件)中讀取的,並被加載到測試腳本中的變量中。變量用於輸入值和驗證值。
關鍵字驅動。
關鍵字/表驅動框架需要開發數據表和關鍵字。它們獨立於執行它們的測試自動化工具。可以使用或不使用應用程序來設計測試。在關鍵字驅動的測試中,被測試的應用程序的功能記錄在一個表格中,以及每個測試的分步說明。
問題31:解釋使用TestNG而不是JUnit框架的好處?
TestNG相較於Junit的優勢:
-
在JUnit中,我們必須聲明@BeforeClass和@AfterClass,這是JUnit中的一個約束,而在TestNG中沒有像這樣的約束。
-
TestNG提供了更多的setUp / tearDown級別。1.@ Before/AfterSuite 2.@Before/AfterTest 3.@Before/AfterGroup
-
TestNG中不需要擴展任何類。
-
TestNG中沒有方法名稱約束,就像JUnit一樣。
-
在TestNG中,我們可以告訴測試一個方法依賴於另一個方法,而在JUnit中這是不可能的。
-
測試用例的分組在TestNG中可用,而JUnit中則不可用。執行可以基於組完成。例如,如果你已經定義了許多案例,並通過將2個組分別定義為“離職“與”回歸”隔離。如果你只是想執行“理智”的情況,那就告訴TestNG執行“理智”。TestNG將自動執行屬於“離職”組的案例。
-
另外,TestNG支持並行測試用例執行。
問題32:與@Test注釋相關的TestNG參數的目的是什么?
在TestNG中,參數是修改注釋功能的關鍵字。
問題33:可以使用TestNG運行一組測試用例嗎?
是的,TestNG框架支持在測試組的幫助下執行多個測試用例。
它提供了以下選項來運行特定組中的測試用例。
如果想基於回歸測試或冒煙測試等其中一個組來執行測試用例,那么:
@Test(groups = {“regression-tests”, “smoke-tests”})
問題34:WebDriver哪個實現是最快的,為什么?
WebDriver的最快的實現是 HTMLUnitDriver。
原因是HTMLUnitDriver不會在瀏覽器中執行測試。相反,它使用簡單的HTTP請求 - 響應機制來運行測試用例。
這種方法比需要啟動瀏覽器來測試執行的方式要快得多。
問題35:是否可以在Selenium 2.0中使用Selenium RC API?
是的,可以用Selenium 2.0來模擬Selenium 1.0 API(即RC)。但並不是所有的Selenium 1.0方法都支持。
為了達到這個目的,需要從WebDriver獲取Selenium實例並使用Selenium方法。
在Selenium 2.0中模擬Selenium 1.0時,方法執行速度也可能會變慢。
問題36:可以在Java,Dot Net或Ruby中使用Selenium Grid嗎?
-
使用Java,可以利用TestNG的並行測試功能來驅動Selenium Grid測試。
-
使用.Net,可以使用“Gallio”並行執行測試。
-
使用Ruby,可以使用“DeepTest”來分發測試。