<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Selenium 1 (Selenium RC)? ## 介紹 正如你在 Selenium 項目簡史里讀到的,Selenium RC 在很長一段時間內都是 Selenium 的主要項目,直到 WebDriver/Selenium 合并而產生了最新和最強大的 Selenium 2。 Selenium 仍然被活躍的支持(大部分是維護工作),并且提供了一些 Selenium 2 短期不會支持的特性,包括支持多語言 (Java, Javascript, Ruby, PHP, Python, Perl 和 C#) 和支持幾乎所有的瀏覽器。 ## Selenium RC 如何工作 首先,我們將講述 Selenium RC 的組件如何操作,以及在測試腳本運行時各自扮演的角色。 ### RC 組件 Selenium RC 組件是: Selenium Server 能啟動和殺死瀏覽器進程,解析并運行由測試程序傳遞過來的 Selenese 命令,并且可以是一個 HTTP 代理,攔截和驗證瀏覽器和 AUT(測試中的應用)之間的 HTTP 通信。 客戶端庫提供了各種編程語言和 Selenium RC Server 之間的接口。 以下是一個簡單的架構圖: ![架構圖](http://seleniumhq.org/docs/_images/chapt5_img01_Architecture_Diagram_Simple.png) 上圖演示了客戶端和服務端進行通信以傳遞要執行的 Selenium 命令。然后服務端使用 Selenium-Core JavaScript 命令將 Selenium 命令傳遞給瀏覽器。瀏覽器則使用其內置的 JavaScript 解析器來執行 Selenium 命令。這樣運行 Seleniun 動作或者驗證你指定的測試腳本。 ### Selenium 服務端 Selenium 服務端從你的測試程序接收 Selenium 命令,解析它們,并且反饋給你程序的測試執行結果。 RC 服務端綁定了 Selenium Core 并且自動將其注入瀏覽器。這在你的測試程序打開瀏覽器時發生(使用客戶端庫的方法)。Selenium-Core 是一個 JavaScript 程序,實際上是一些利用瀏覽器的內置 JavaScript 解析器解析和實行 Selenese 命令 的 JavaScript 函數。 Server 使用簡單的 HTTP GET/POST 請求來接收你的測試程序中的 Selenese 命令。這意味這你可以使用任何可以發送 HTTP 請求的編程語言來實現 Selenium 測試在瀏覽器中的自動運行。 ### 客戶端庫 客戶端庫提供了能讓你從自定義的程序中運行 Selenium 命令的編程支持。每種支持的語言都有一個不同的客戶端庫。Selenium 客戶端庫提供了一組接口,例如一些從你的程序中運行 Selenium 命令的方法。通過實現這些接口,我們就能得到一個支持所有 Selenese 命令的編程方法。 客戶端庫將 Selenese 命令傳遞給 Selenium 服務端來處理一個特定的動作或者執行 AUT 的測試。客戶端庫同時接收所傳遞命令的執行結果,并將其返回給你的程序。你的程序可以接收這個結果并且將其存儲到一個變量中,然后報告其運行結果是成功還是失敗,或者當其發生錯誤是進行適當的處理。 因此要創建一個測試程序,你僅僅需要使用客戶端庫的 API 來編寫一個可以運行 Selenium 命令的程序。或者,如果你已經有了使用 Selenium-IDE 創建的 Selenium 測試腳本,你可以使用它來生成 Selenium RC 代碼。Selenium-IDE 可以將 Selenium 命令轉換(使用導出菜單)成客戶端 API 的方法調用。查看 Selenium-IDE 章節中關于從 Selenium-IDE 中導出 RC 代碼的細節。 ## 安裝 用安裝這個詞不是很恰當。Selenium 在你選擇的編程語言中有一組組件可用。你可以從下載頁面下載它們。 一旦你選定了一種編程語言,你僅需要: - 安裝 Selenium RC 服務端。 - 使用特定于該語言的客戶端驅動創建你的項目 ### 安裝 Selenium 服務端 Selenium RC 服務端是一個簡單的 jar 包 (selenium-server-standalone-<version-number>.jar),它不需要安裝。只需要下載這個zip文件,并提取服務所需的目錄即可。 ### 運行 Selenium 服務 在開始任何測試之前,你必須先啟動服務。進到 Selenium RC 服務端所在的目錄,并在命令行中運行以下命令: java -jar selenium-server-standalone-<version-number>.jar 你也可以簡單的創建一個包含上述命令的批處理或shell文件(Windows 中擴展名為 .bat,Linux 中擴展名為 .sh)。然后在你的桌面上創建一個該可執行文件的快捷方式,通過雙擊圖標來啟動服務。 要成功啟動服務必須確保 Java 已安裝,并且設置了正確的 PATH 環境變量。你可以通過下面的命令檢查你的 Java 是否安裝正確: java -version 如果你得到一個版本號(必須>=1.5),那么你已經成功啟動 Selenium RC。 ### 使用 Java 客戶端驅動 - 從 SeleniumHQ 下載頁面下載 Selenium java 客戶端驅動 zip 包。 - 提取 selenium-java-<version-number>.jar - 打開你喜歡的 Java IDE (Eclipse, NetBeans, IntelliJ, Netweaver, etc.) - 創建一個 java 項目。 - 將 selenium-java-<version-number>.jar 文件作為引用添加到你的項目中。 - 將 selenium-java-<version-number>.jar 文件添加到你項目的 classpath 中。 - 從 Selenium-IDE 到處一個 Java 文件,并放入你的項目,或者使用 Selenium 的 Java 客戶端 API 編寫一個 Selenium 測試文件。這些 API 將在本章的后面部分進行講解。你可以使用 JUnit,或者 TestNg 來運行你的測試,或者你可以簡單的寫一個 main() 方法。這些概念也將在本文后面進行說明。 - 從命令行運行 Selenium 服務。 - 從 Java IDE 或者命令行中執行你的測試。 關于更多 Java 測試項目的配置細節,可查看本章附件:**在 Eclipse 中配置 Selenium RC** 和 **在 Intellij 中配置 Selenium RC**。 ## 將 Selenese 轉換成程序 使用 Selenium RC 的主要任務就是將你的 Selenese 轉換成一個編程語言。在本小結中,我們提供幾種不同的語言演示。 ### 測試腳本范例 讓我們從一個 Selenese 測試腳本的例子開始. 假定我們使用 Selenium-IDE 記錄了如下測試: <table> <tbody> <tr> <td>open</td> <td>/</td> <td>&nbsp;</td> </tr> <tr> <td>type</td> <td>q</td> <td>selenium rc</td> </tr> <tr> <td>clickAndWait</td> <td>btnG</td> <td>&nbsp;</td> </tr> <tr> <td>assertTextPresent</td> <td>Results * for selenium rc</td> <td>&nbsp;</td> </tr> </tbody> </table> 注意: 這個例子僅僅在 Google 搜索頁面 http://www.google.com 工作。 ## Selenese 作為編程代碼 以下為使用支持的多種編程序言從 Selenium-IDE 中導出的測試腳本。如果你有一些面向對象編程的基礎知識,你就可以通過閱讀以下代碼理解 Selenium 如何運行 Selenese 命令。 /** Add JUnit framework to your classpath if not already there * for this example to work */ package com.example.tests; import com.thoughtworks.selenium.*; import java.util.regex.Pattern; public class NewTest extends SeleneseTestCase { public void setUp() throws Exception { setUp("http://www.google.com/", "*firefox"); } public void testNew() throws Exception { selenium.open("/"); selenium.type("q", "selenium rc"); selenium.click("btnG"); selenium.waitForPageToLoad("30000"); assertTrue(selenium.isTextPresent("Results * for selenium rc")); } } 在接下來的章節中,我們將介紹如何通過生成的代碼創建你的測試程序。 ## 編寫你的測試代碼 現在我們將為每種支持的語言演示如何通過上述例子編寫你自己的測試代碼。我們主要需要做2件事情: - 從 Selenium-IDE 導出指定語言的腳本,有選擇性的修改它。 - 編寫一個 main() 方法來執行創建的代碼。 你可以選擇平臺支持的任意測試引擎,如 Java 的 JUnit 或 TestNG。 這里我們將演示指定語言的例子。每種語言的 API 都有所不同,所以我們將單獨解釋每一個。 ### Java 在 Java 中,大家通常選擇 JUnit 或 TestNG 作為測試引擎。一些像 Eclipse 這樣的 IDE 能通過插件直接支持它們,使得事情更簡單。JUnit 和 TestNG 教學不在本文檔的范圍內,但是你可以通過網絡找到相關資料。如果你是一個 Java 程序員,你可能已經有使用這些框架的經驗了。 你可能希望為 “NewTest” 測試類重命名。同時,你可能也需要修改以下語句中的瀏覽器打開參數。 selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com/"); 使用 Selenium-IDE 創建的代碼看起來大致如下。為了使代碼更清晰易讀,我們手工加入了注釋。 package com.example.tests; // 我們指定了這個文件的包 import com.thoughtworks.selenium.*; // 導入驅動。 // 你將使用它來初始化瀏覽器并執行一些任務。 import java.util.regex.Pattern; // 加入正則表達式模塊,因為有些我們需要使用它進行校驗。 // 如果你的代碼不需要它,完全可以移除掉。 public class NewTest extends SeleneseTestCase { // 創建 Selenium 測試用例 public void setUp() throws Exception { setUp("http://www.google.com/", "*firefox"); // 初始化并啟動瀏覽器 } public void testNew() throws Exception { selenium.open("/"); selenium.type("q", "selenium rc"); selenium.click("btnG"); selenium.waitForPageToLoad("30000"); assertTrue(selenium.isTextPresent("Results * for selenium rc")); // 以上為真實的測試步驟 } } ## 學習使用 API Selenium RC API 使用以下約定:假設你了解 Selenese,并且大部分接口是自解釋的。在此,我們僅解釋最具爭議或者看起來不那么直接明了的部分。 ### 啟動瀏覽器 setUp("http://www.google.com/", "*firefox"); 每個例子都打開了一個瀏覽器,并且將瀏覽器作為一個瀏覽器對象返回,賦值給一個變量。這個變量將用于調用瀏覽器方法。這些方法可以執行 Selenium 命令,例如打開、鍵入或者校驗。 創建瀏覽器對象所需要的參數如下: #### host 指定服務所在的機器的 IP 地址。通常它和運行客戶端的機器是同一臺。所以在這個例子中我們傳入 localhost。在某些客戶端中,這是一個可選參數。 #### port 指定服務監聽的客戶端用于創建連接的 TCP/IP socket。這在某些客戶端中也是可選的。 #### browser 指定你希望運行測試的瀏覽器。該參數必選。 #### url AUT 的基準 url。在所有的客戶端中必選,并且是啟動瀏覽器代理的 AUT 通訊的必須信息。 注意,有些客戶端要求調用 start() 方法來啟動瀏覽器。 ### 運行 命令 一旦你初始化了一個瀏覽器并且將其賦值給一個變量(通常命名為 "Selenium"),你可以使用這個變量調用各種方法來運行 Selenese 命令。例如,調用 selenium 對象的鍵入方法: selenium.type(“field-id”,”string to type”) 此時瀏覽器將真正執行指定的操作,在這個方法調用時指定了定位符和要鍵入的字符串,本質上就像是一個用戶在瀏覽器中輸入了這些內容。 ## 報告結果 Selenium RC 沒有內置的結果報告機制。而是讓你根據所選語言的特性創建符合你需求的自定義報告。這非常棒!但是你是不是希望這些事情都已經就緒,而你可以快速使用它們?其實市面上不難找到符合你需求的庫或框架,這比編寫你自己的測試報告代碼快多了。 ### 測試框架報告工具 很多語言都有對應的測試框架。它們除了提供靈活的測試引擎執行你的測試之外,通常還包括結果報告的庫。例如,Java有兩個常用的測試框架,JUnit 和 TestNG. .NET 也有適合它的, NUnit。 我們不會教你如何使用這些框架,那超出了本指南的范圍。但我們將簡單介紹一下這些框架中你可以使用的跟 Selenium 相關的特性。有很多關于學習這些測試框架的書,互聯網上頁有豐富的資料。 ### 測試報告庫 同樣可以利用的是使用你所選語言編寫的專門用于報告測試結果的三方庫。它們通常支持多種格式,如 HTML 或 PDF。 ### 最佳實踐是? 大多數新接觸測試框架的人將會從框架內置的報告功能開始。他們會檢查任何可用庫,這可比你自己開發的開銷要小。當你開始使用 Selenium,毫無疑問你將開始在報告處理中使用你自己的 “print 語句”。這將可能導致你在使用一個庫或框架的同時,逐漸開發開發你自己的報告功能。無論如何,在最初短暫的學習曲線之后,你將自然而然的開發出最適合你的報告功能。 ### 測試報告范例 為了進行演示,我們將直接使用 Selenium 支持的語言的特定工具。以下列出的是最常用的,而且也是最為推薦的。 #### Java 中的測試報告 - 如果 Selenium 測試用例是使用 JUnit 開發的,那么 JUnit 報告就能用于創建測試報告。了解更多 [JUnit 報告](http://ant.apache.org/manual/Tasks/junitreport.html) 。 - 如果 Selenium 測試用例是使用 TestNG 開發的,那也不需要依賴外部任務來創建測試報告。TestNG 框架創建包含測試詳情列表的 HTML 報告。了解更多 [TestNG 報告](http://testng.org/doc/documentation-main.html#test-results) 。 - ReportNG 是一個用于TestNG 框架的 HTML 報告插件。它的初衷是用于取代默認的 HTML 報告。ReportNG 提供了簡單、彩色的測試結果顯示。了解更多 [TestNG](http://reportng.uncommons.org/) - 同時,TestNG-xslt 是一個很好的摘要報告工具。TestNG-xslt 報告看起來如下圖: ![TestNG-xslt](http://seleniumhq.org/docs/_images/chapt5_TestNGxsltReport.png) 了解更多 [TestNG-xslt]() ##### 記錄 Selenese 命令 Logging Selenium 可以用于為你的測試創建一個含有所有 Selenium 命令及其運行結果(成功或失敗)的報告。為了獲得這項功能,使用 Logging Selenium 擴展你的 Java 客戶端。了解更多 [Logging Selenium](http://loggingselenium.sourceforge.net/index.html) ## 為你的測試加點料 現在我們將獲得所有使用 Selenium 的理由,它能為你的測試添加邏輯。就像任何程序一樣。程序流通過條件語句和迭代控制。另外,你能使用 IO 來報告處理信息。在這一小結中,我們將演示一些可聯合 Selenium 使用的編程語言構建例子,用以解決常見的測試問題。 當你將頁面元素是否存在的簡單測試轉換成涉及多個網頁和數據的動態功能時,你將發現你需要編程邏輯來校驗期待的結果。一般的, Selenium-IDE 不支持迭代和標準的條件語句。你可以通過將 javascript 嵌入 Selenese 參數來實現條件控制和迭代,并且大部分的條件都比真正的編程語言要簡單。此外,你可能需要使用異常處理來進行錯誤回復。基于這些原因,我們編寫了這一小結內容來演示普通編程技巧的使用,以使你在自動化測試中獲得更大的校驗能力。 本小結例子使用 C# 和 Java 編寫而成,它們非常簡單,也很容易轉換成其他語言。如果你有一些面向對象編程的基礎知識,你將很容易掌握這個章節。 ### 迭代 迭代是測試中最常用的功能了。例如你可能希望執行一個查詢多次。或者你需要處理那些從數據庫中返回的結果集以校驗你的測試結果。 使用同之前一樣的 [Google 搜索例子](http://seleniumhq.org/docs/05_selenium_rc.jsp#google-search-example),讓我們來檢查搜索結果。這個測試將使用 Selenese: <table> <tbody> <tr> <td>open</td> <td>/</td> <td>&nbsp;</td> </tr> <tr> <td>type</td> <td>q</td> <td>selenium rc</td> </tr> <tr> <td>clickAndWait</td> <td>btnG</td> <td>&nbsp;</td> </tr> <tr> <td>assertTextPresent</td> <td>Results * for selenium rc</td> <td>&nbsp;</td> </tr> <tr> <td>type</td> <td>q</td> <td>selenium ide</td> </tr> <tr> <td>clickAndWait</td> <td>btnG</td> <td>&nbsp;</td> </tr> <tr> <td>assertTextPresent</td> <td>Results * for selenium ide</td> <td>&nbsp;</td> </tr> <tr> <td>type</td> <td>q</td> <td>selenium grid</td> </tr> <tr> <td>clickAndWait</td> <td>btnG</td> <td>&nbsp;</td> </tr> <tr> <td>assertTextPresent</td> <td>Results * for selenium grid</td> <td>&nbsp;</td> </tr> </tbody> </table> 同樣的代碼重復跑了3次。將同樣的代碼拷貝多次運行可不是一個好的編程實踐,因為維護的時候成本會很高。使用編程語言,我們可以通過迭代這一更靈活更易于維護的方式來處理搜索結果。 ### In Csharp // Collection of String values. String[] arr = {"ide", "rc", "grid"}; // Execute loop for each String in array 'arr'. foreach (String s in arr) { sel.open("/"); sel.type("q", "selenium " +s); sel.click("btnG"); sel.waitForPageToLoad("30000"); assertTrue("Expected text: " +s+ " is missing on page." , sel.isTextPresent("Results * for selenium " + s)); } ### 條件語句 我們使用一個例子來演示條件語句的使用。讓運行 Selenium 測試時,如果一個原本應該存在的元素沒有出現在頁面上時,將會觸發一個普通的錯誤。例如,我們運行如下 代碼: // Java selenium.type("q", "selenium " +s); 如果元素“q”不在頁面上將會拋出一個異常: com.thoughtworks.selenium.SeleniumException: ERROR: Element q not found 這個異常將會終止你的測試。對于某些測試來說這正是你想要的。但是更多的時候,你并不希望這樣,因為還有很多后續的測試要執行。 一個更好的解決辦法是我們首先判定元素是否存在,然后再進行相應的處理。我們來看看 Java 的寫法: // 如果元素可用,則則行類型判定操作 if(selenium.isElementPresent("q")) { selenium.type("q", "Selenium rc"); } else { System.out.printf("Element: " +q+ " is not available on page.") } 這樣做的好處是,即使頁面上沒有這個元素測試也能夠繼續執行。 ### 在你的測試中執行 JavaScript 在一個應用程序中使用 JavaScript 是非常方便的,但是 Selenium 不直接支持它。你可以在 Selenium RC 中使用 getEval 接口的方法來執行它。 考慮一個應用中的沒有靜態 id 的多選框。在這種情況下,你可以通過使用 Selenium RC 對 JavaScript 語句進行求值(evaluate)來找到所有的多選框并處理它們。 // Java public static String[] getAllCheckboxIds () { String script = "var inputId = new Array();";// Create array in java script. script += "var cnt = 0;"; // Counter for check box ids. script += "var inputFields = new Array();"; // Create array in java script. script += "inputFields = window.document.getElementsByTagName('input');"; // Collect input elements. script += "for(var i=0; i<inputFields.length; i++) {"; // Loop through the collected elements. script += "if(inputFields[i].id !=null " + "&& inputFields[i].id !='undefined' " + "&& inputFields[i].getAttribute('type') == 'checkbox') {"; // If input field is of type check box and input id is not null. script += "inputId[cnt]=inputFields[i].id ;" + // Save check box id to inputId array. "cnt++;" + // increment the counter. "}" + // end of if. "}"; // end of for. script += "inputId.toString();" ;// Convert array in to string. String[] checkboxIds = selenium.getEval(script).split(","); // Split the string. return checkboxIds; } 如果要計算頁面中的圖片數,你可以: // Java selenium.getEval("window.document.images.length;"); 記住要調用 window 對象,以防在 DOM 表達式中其默認指向 Selenium 窗口而不是測試窗口。 ## 服務端選項 當服務啟動時,可以使用命令行配置項來改變其默認行為。 回想一下,我們是這樣啟動服務的: $ java -jar selenium-server-standalone-<version-number>.jar 你可以使用 -h 來查看所有的配置項: $ java -jar selenium-server-standalone-<version-number>.jar -h 你將看到所有配置項列表,每個配置項附帶間斷描述。這里提供的描述并不總是足夠禽畜,所以接下來我們將對一些重要的配置項進行補充描述。 ### 代理配置 如果你的 AUAT 使用了一個需要授權的 HTTP 代理,你需要使用以下命令來配置 http.proxyHost, http.proxyPort, http.proxyUser 和 http.proxyPassword。 $ java -jar selenium-server-standalone-<version-number>.jar -Dhttp.proxyHost=proxy.com -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password ### 多窗口模式 如果你正在使用 Selenium 1,你可以跳過這部分內容,因為多窗口模式已經是默認配置。但是在更早的版本中,AUT 默認是在子幀(sub frame)中運行的。 ![multi-window](http://seleniumhq.org/docs/_images/chapt5_img26_single_window_mode.png) 有些應用在子幀中不能正常運行,必須要加載到頂級幀中運行。多窗口模式允許 AUT 在兩個獨立的窗口中運行,而不是在默認的幀中運行,這樣它就能在頂級幀中運行了。 ![multi-window2](http://seleniumhq.org/docs/_images/chapt5_img27_multi_window_mode.png) 對于老版本的 Selenium 來說,你必須通過下面的配置項明確指定多窗口模式: -multiwindow 在 Selenium 1 以及更新的版本中,如果你希望在單窗口中運行你的測試,你可以使用以下配置項: -singlewindow ### 指定 Firefox 配置 Firefox 不會同時運行兩個實例,除非你為每一個指定單獨的配置。Selenium RC 1 及其后續版本會自動運行兩個單獨的配置,所以如果你正在使用 Selenium 1,你可以跳過這個章節。如果你在使用更老的版本而你有需要指定單獨的配置,你需要明確的指定它。 首先,穿加你一個單獨的 Firefox 配置,根據以下步驟。打開 Windows 的開始菜單,選擇 “run”,然后鍵入以下內容: firefox.exe -profilemanager firefox.exe -P 使用對話框來創建新配置。當你運行 Selenium 服務時,你需要使用命令行選項 -firefoxProfileTemplate 告訴它使用新的 Firefox 配置,并且指定要使用的配置的路徑。 -firefoxProfileTemplate "path to the profile" **警告** 確保你的配置文件被存放在一個不同于默認路徑的文件夾中!!!Firefox 配置管理會在你刪除一個配置的時候刪除該配置所在文件夾的所有內容,而不管它是不是配置文件。 更多請參考 [Mozilla’s Knowledge Base](http://support.mozilla.com/zh-CN/kb/Managing+profiles) ### 通過 -htmlSuite 配置項在服務端直接運行 Selenese 通過將 html 文件傳遞給服務端的命令行,你可以直接在 Selenium 服務端運行 Selenese html 文件。例如: java -jar selenium-server-standalone-<version-number>.jar -htmlSuite "*firefox" "http://www.google.com" "c:\absolute\path\to\my\HTMLSuite.html" "c:\absolute\path\to\my\results.html" 這個例子將自動加載你的 html 測試套件,運行所有的測試并生成一份 html 格式的測試報告。 **注意** 在使用這個配置項時,服務端將開始運行測試,并為測試結束等待指定的秒數,如果測試沒有在指定時間內結束,命令行將以一個非0的退出碼退出,并且沒有報告文件生成。 這個命令行非常長,所以鍵入它的時候需要非常小心。注意這要求你傳入一個 html 測試套件,而非單個的測試。并且配置項和 -interactive 不兼容,你不能同時使用他們。 ### Selenium 服務日志 #### 服務端日志 當啟動 Selenium 服務,可以使用 -log 配置項來將 Selenium 服務報告的有價值的 debug 信息記錄到一個文本文件。 java -jar selenium-server-standalone-<version-number>.jar -log selenium.log 這個日志文件相比標準的 console 日志而言要冗余的多(它包括了 debug 級別的日志信息)。它頁包含了 logger name,打印日志信息的線程 id。例如: 20:44:25 DEBUG [12] org.openqa.selenium.server.SeleniumDriverResourceHandler - Browser 465828/:top frame1 posted START NEW 該信息格式為: TIMESTAMP(HH:mm:ss) LEVEL [THREAD] LOGGER - MESSAGE #### 瀏覽器端日志 在瀏覽器端的 javascript (Selenium Core)也將記錄重要的日志信息。在很多時候,對最終用戶而言,這比常規的 Selenium 服務端日志有用的多。為了訪問瀏覽器端日志,將 -browserSideLog 參數傳遞給 Selenium 服務。 java -jar selenium-server-standalone-<version-number>.jar -browserSideLog 為了將所有瀏覽器端的日志保存到一個文件中,-browserSideLog 必須和 -log 配置項聯合使用。 ### 指定特定瀏覽器路徑 你可以為 Selenium RC 指定一個特定瀏覽器的路徑。如果你需要測試同一個瀏覽器的不同版本時,這一功能將非常有效。同時這也允許你在一個 Selenium RC 不直接支持的瀏覽器中運行你的測試。當指定這個運行模式,使用 *cunstom 來指定可執行的瀏覽器的全路徑: *custom <path to browser> ## Selenium RC 架構 **注意** 該主題嘗試解釋 Selenium RC 背后的運行原理。這并不是 Selnium 用戶需要了解的基礎知識,但是你會發現它對于了解一些問題非常有用。 為了理解 Selenium RC 服務端工作的細節,以及為什么它使用代理注入和高特權模式你必須先了解 [同源策略](http://seleniumhq.org/docs/05_selenium_rc.jsp#the-same-origin-policy)。 ### 同源策略 Selenium 面臨的主要約束即同源策略。市面上所有的瀏覽器都有這個安全約束,它的目的是確保一個網站的內容永遠不會被另外一個站點的腳本訪問到。同源策略規定瀏覽器加載的任何腳本僅能操作引入它的頁面所在的域的內容。它也不能執行另一個網站中的方法。例如,如果瀏覽器在載入 www.mysite.com 時加載了一個腳本,這腳本就不能操作 www.mysite2.com 的內容,即使那是另一個你自己的網站。如果這被允許,腳本將可以操作你打開的任何網站的內容,于是當你在 tab 頁中打開一個銀行站點時它就能讀取你的銀行賬號信息。。我們把這叫 XSS(Cross-site Scripting) 攻擊。 為了在這個約束下工作,Selenium Core(包括它的 javascript 腳本)必須和 AUT 放置在同一個域下。 之前,因為 Selenium core 使用 JavaScript 實現的,所以一直被這個問題困擾。但現在,這個問題已經得到解決。它使用 Selenium 服務端作為一個代理來避免這個問題。本質上來講,Selenium RC 告訴瀏覽器它是運行在服務端提供的一個“被欺騙的”站點上。 **注意** 你可以在維基百科上找到更多關于 [同源策略](http://en.wikipedia.org/wiki/Same_origin_policy) 和 [XSS](http://en.wikipedia.org/wiki/Cross-site_scripting) 的內容 ### 代理注入 Selenium 避免同源策略約束的首選方法是代理注入。在代理注入模式,Seleniium 服務端扮演一個客戶端配置[1] 的 HTTP 代理[2] 的角色,它位于瀏覽器和 AUT 之間。它為 AUT 偽裝了一個虛假的 url(將Selenium Core 和測試注入到 AUT,就好像他們來自同一個域)。 1. 代理扮演一個第三方角色,在雙方傳遞內容的過程中。它好像一個 web 服務器將 AUT 傳送給瀏覽器。作為一個代理,使得 Selenium 服務端有能力偽裝 AUT 的真實 url。 2. 瀏覽器加載的時候,配置文件將指定 localhost:4444 作為 http 代理,這就是為什么瀏覽器發起一個 http 請求將通過 Selenium 服務端并且響應頁將通過它而不是來自真實的服務器。以下是結構圖: ![proxy](http://seleniumhq.org/docs/_images/chapt5_img02_Architecture_Diagram_1.png) 當測試開始時,將發生以下事情: 1. 客戶端驅動將和 Selenium RC 服務端建立一個連接。 2. Selenium RC 服務端啟動一個打開指定 url 的瀏覽器(或復用一個已打開的),將 Selenium Core 的 JavaScript 代碼注入的這個頁面中。 3. 客戶端驅動向服務端傳遞一個 Selenese 命令。 4. 服務端解析這個命令,然后觸發 JavaScript 腳本執行瀏覽器中相應的命令。 5. Selenium Core 指示瀏覽器在第一個指令后開始執行,典型的是打開一個 AUT 頁面。 6. 瀏覽器收到打開頁面的請求,并且從 Selenium RC 服務端詢問獲取頁面內容(作為瀏覽器的 http 代理) 7. Selenium RC 服務端和網站服務器通訊,一旦獲取到頁面,它就對頁面的源進行偽裝然后發送到瀏覽器,使這個頁面看起來像是和 Selenium Core 來自于同一個源(這使得我們可以繞開同源策略的限制) 8. 瀏覽器接收到這個頁面并且渲染到相應的幀或者窗口。 ### 高特權瀏覽器(Heightened Privileges Browsers) 這種方法的工作流程和代理注入非常像,主要的區別是瀏覽器在一個叫高特權的模式下啟動,這將允許網站做一些平時不被允許做的事情(例如 XSS,或者填充文件上傳輸入框,或者其他一些對 Selenium 非常有用的操作)。使用這種瀏覽器模式, Selenium Core 就可以直接打開 AUT 并且讀取或操作其內容,而不需要將整個 AUT 通過 Selenium RC 服務端中轉。 結構圖如下: ![Heightened Privileges Browsers](http://seleniumhq.org/docs/_images/chapt5_img02_Architecture_Diagram_2.png) 此時,將發生以下事情: 1. 客戶端驅動和 Selenium RC 服務端建立一個連接。 2. Selenium RC 服務端啟動一個開打指定 url 的瀏覽器,并且將 Selenium Core 加載到整個頁面中。 3. Selenium Core 從客戶端驅動獲得第一個指令(通過向 Selenium RC 服務端發起的另一個 http 請求)。 4. Selenium Core 執行第一個指令,典型的是打開一個 AUT 頁面。 5. 瀏覽器收到這個請求并且向站點服務器請求頁面。一旦瀏覽器接收到頁面內容,就會渲染到相應的幀或窗口。 ## 處理 HTTPS 和安全警告彈出框 當需要發送諸如密碼或信用卡等加密信息時,我們往往會從 http 轉為 https。這在今天的應用中非常常見。Selenium RC 也支持。 為了確保這個 https 站點的真實性,瀏覽器需要一個安全整數。否則,當瀏覽器使用 https 訪問 AUT 時,這個應用經常被認為是不受信任的。當遇到這種情況時,瀏覽器會顯示安全警告彈出框,而 Selenium RC 無法關閉這個彈出框。 當在 Selenium RC 測試中使用 https 時,你必須使用一個支持的運行模式,并且能為你處理安全證書。你可以在測試項目初始化 Selenium 時指定這個運行模式。 在 Selenium RC 1.0 beta 2 和其后續版本中,可以使用 *firefox 和 *iexplore 運行模式。在更早期的版本中,包括 Selenium RC 1.0 beta 1 使用 *chrome 和 *iehta 運行模式。通過使用這些運行模式,你不需要安裝任何特殊的安全證書,Selenium RC 將幫你處理它。 在版本1中,推薦運行 *firefox 和 *iexplore 運行模式。然而,我們還提供 *iexploreproxy 和 *firefoxproxy 運行模式。它們只是用于提供向后兼容,除非遺留的測試項目,否則我們不應該使用它們。在你需要處理安全證書和運行多窗口時,它們的處理將存在局限性。 在 Selenium RC 的早期版本中,*chrome 或 *iehta 是支持 https 和能處理安全警告彈出窗的運行模式。它們被認為是實驗性的模式,雖然現在它們已經很穩定并且有大量用戶。如果你在使用 Selenium 1,你不應該使用那些老的運行模式。 ### 關于安全證書 通常來來說,安裝了安全證書后,瀏覽器將信任你測試的應用。你可以在瀏覽器的選項或者 Internet 屬性中檢查它(如果你不知道你的 AUT 的安全證書,詢問你的系統管理員)。當 Selenium 啟動了瀏覽器,它注入代碼以解析瀏覽器和服務器之間的通訊。這時,瀏覽器認為這個引用是不被信任的了,并且會彈出一個安全警告。 為了繞過這個問題,Selenium RC,(又需要使用支持的運行模式)將安裝它自己的證書。將臨時裝在你的客戶機上,能被瀏覽器訪問到的地方。這將欺騙瀏覽器認為它在訪問一個和你的 AUT 完全不同的重難點,就能成功的組織彈出框。 另一個在早期的版本中解決此問題的方法是安裝一個隨 Selenium 安裝提供的 Cybervillians 安全證書。大部分用戶不需要做這件事情,但是當你在代理注入的模式下運行 Selenium RC 時,你就需要安裝它了。 ## 更多瀏覽器支持和相關配置 Selenium API 支持在多個瀏覽器中運行,包括 ie 和 Firefox。請從 SeleniumHQ.org 查看支持的瀏覽器。另外,當一個瀏覽器不直接被支持時,啟動瀏覽器時,你可以使用 ”*custom“ 來指定一個瀏覽器運行你的 Selenium 測試(例如:替換 *firefox 或 *iexplore)。這樣,你可以將這個 API 調用可執行的路徑傳遞給瀏覽器。這個操作也可以在服務端的交互模式下完成。 cmd=getNewBrowserSession&1=*custom c:\Program Files\Mozilla Firefox\MyBrowser.exe&2=http://www.google.com ### 使用不同的瀏覽器配置來運行測試 通常 Selenium RC 會自動配置瀏覽器, 但是如果你使用 “*custom” 運行模式啟動瀏覽器,你必須強制 Selenium RC 啟動瀏覽器,就像自動配置不存在一樣。 例如,你使用如下自定義配置啟動 Firefox: cmd=getNewBrowserSession&1=*custom c:\Program Files\Mozilla Firefox\firefox.exe&2=http://www.google.com 注意,當使用這種方法啟動瀏覽器時,我們必須手工配置瀏覽器使用 Selenium 服務端作為代理。通常這意味這你需要打開你的瀏覽器選項,指定 “localhost:4444” 作為 http 代理,但是每種瀏覽器的設置方式可能不太一樣。 注意 Mozilla 瀏覽器的啟動和停止不太一樣。你需要設置 MOZ_NO_REMOTE 環境變量確保它表現如預期。Unix 用戶應該避免使用 shell 腳本來啟動它,直接使用一個二進制可執行文(如:firefox-bin)會更好。 ## 常見問題 **譯者注:**這部分內容不翻譯了,請參考原英文文檔。 - Unable to Connect to Server - Unable to Load the Browser - Selenium Cannot Find the AUT - Firefox Refused Shutdown While Preparing a Profile - Versioning Problems - Error message: “(Unsupported major.minor version 49.0)” while starting server - 404 error when running the getNewBrowserSession command - Permission Denied Error - Handling Browser Popup Windows - On Linux, why isn’t my Firefox browser session closing? - Firefox *chrome doesn’t work with custom profile - Is it ok to load a custom pop-up as the parent page is loading (i.e., before the parent page’s javascript window.onload() function runs)? - Problems With Verify Commands - Safari and MultiWindow Mode - Firefox on Linux - IE and Style Attributes - Error encountered - “Cannot convert object to primitive value” with shut down of *googlechrome browser - Where can I Ask Questions that Aren’t Answered Here?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看