亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Selenium 2 入門

系統(tǒng) 1992 0

在多個瀏覽器中進行 Web 應(yīng)用程序的端到端功能測試

Selenium 是一款有名的 Web 應(yīng)用程序測試框架,用于進行功能測試。新版本 Selenium 2 結(jié)合了 Selenium 1 和 WebDriver(Selenium 的并行項目)中的最佳特性。在本文中,我們將介紹如何輕松地從 Selenium 1 過渡到 Selenium 2,并用一些示例介紹如何使用 Selenium 2,如何進行遠程測試,以及如何將書面測試從 Selenium 1 遷移到 Selenium 2 中。

簡介

Selenium 是用于測試 Web 應(yīng)用程序用戶界面 (UI) 的常用框架。它是一款用于運行端到端功能測試的超強工具。您可以使用多個編程語言編寫測試,并且 Selenium 能夠在一個或多個瀏覽器中執(zhí)行這些測試。

Selenium(以下簡稱為 Selenium 1)并不是能夠在瀏覽器中自動化功能測試的惟一工具。由 Simon Stewart(來自 Google)創(chuàng)建的 WebDriver 是一個具有類似目標的項目。要控制瀏覽器,需要依賴采用本機支持的獨立客戶端。WebDriver 僅提供 Java 綁定,并不能支持 Selenium 1 所能支持的那么多瀏覽器。

Selenium 1 + WebDriver = Selenium 2

Selenium 1 和 WebDriver 合并成一款性能更佳的產(chǎn)品 Selenium 2(或 Selenium WebDriver),該款產(chǎn)品發(fā)行于 2011 年。Selenium 2 具有來自 WebDriver 的清晰面向?qū)ο?API,并能以最佳的方式與瀏覽器進行交互。Selenium 2 不使用 JavaScript 沙盒,它支持多種瀏覽器和多語言綁定。在撰寫本文時,Selenium 2 為下列程序提供驅(qū)動程序:

  • Mozilla Firefox
  • Google Chrome
  • Microsoft Internet Explorer
  • Opera
  • Apple iPhone
  • Android browsers

借助 Selenium 2,您可使用 Java、C#、Ruby、和 Python 編寫測試。Selenium 2 還提供基于 HtmlUnit 的無外設(shè)驅(qū)動,是用于測試 Web 應(yīng)用程序的 Java 框架。HtmlUnit 運行速度特別快,但它不是一個真正與真實瀏覽器相關(guān)聯(lián)的驅(qū)動。

目前,Selenium 2 仍處于開發(fā)階段,還有些細節(jié)問題正在處理。當前版本為 2.9。針對 Safari 和 Blackberry 的驅(qū)動將會在近期集成到產(chǎn)品中。

在本文當中,我們將學習如何利用 Selenium 2 來測試 Web 應(yīng)用程序。示例展示了如何遠程實現(xiàn)測試。我們還將學習如何將編寫好的測試從 Selenium 1 轉(zhuǎn)移到 Selenium 2 中。

下載 本文中所使用的源代碼。

?

Selenium 2 入門

在本節(jié),我們將學習如何將 Selenium 2 框架用于 Web 應(yīng)用程序的一個相對簡單的測試中。開發(fā)環(huán)境采用 Java 語言。您還需要包括 Java 綁定的 selenium-java-<version>.jar(參閱? 參考資料 并下載)。在一個 Maven 項目中,您只需要在 pom.xml 中包含正確的依賴性,如 清單 1所示。

清單 1. Selenium-java 依賴性
                   <dependency> 

    <groupId>org.seleniumhq.selenium</groupId> 

    <artifactId>selenium-java</artifactId> 

    <version>2.9.0</version> 

 </dependency>
                

現(xiàn)在,可以開始編寫測試。WebDriver API 中的主要組件是? WebDriver 接口。這一公共接口在每個有效瀏覽器中都能實現(xiàn)。例如,類 FirefoxDriver 將用于控制 Mozilla Firefox。 清單 2 展示了如何在測試當中實例化一個特定的實現(xiàn)。您可以采用最符合您需求的測試框架,比如 JUnit 或者 TestNG。

清單 2. 實例化的? FirefoxDriver
                   public class Selenium2Example1Test { 

    @Test 

    public void test() { 

        // Instantiate a webDriver implementation 

        WebDriver webdriver = new FirefoxDriver(); 

    } 

 }
                

要加載頁面進行測試,可利用? get() 方法。在? 清單 3 中,GitHub 主 (https://github.com) 被加載到先前創(chuàng)建的 Firefox 實例中。

清單 3. 在測試下加載頁面
                   WebDriver webdriver = new FirefoxDriver(); 

 webdriver.get(https://github.com);
                

您可在剛加載的頁面上添加斷言。假如您想要測試頁面標題是否等于? "GitHub - Social Coding" ,如下? 清單 4 所示。WebDriver 提供 getTitle() 方法;您可利用所選的測試框架來生成斷言。

清單 4. 頁面標題的斷言
                   Assert.assertEquals("GitHub - Social Coding", webdriver.getTitle());
                

完成測試以后,最好利用? quit() 方法來終止 WebDriver 實例,如下 清單 5所示。

清單 5. 終止 WebDriver 實例
                   webdriver.quit();
                

FirefoxDriver 只是有效的 WebDriver 實現(xiàn)之一。您可以利用 ChromeDrive 在 Chrome 內(nèi)部運行測試,來執(zhí)行相同的測試。 清單 6 展示了利用 ChromeDriver 的完整示例。

清單 6. ChromeDriver 樣例
                   public class Selenium2Example2Test { 

    @Test 

    public void test() { 

        System.setProperty("webdriver.chrome.driver", 

"src/main/resources/drivers/chrome/chromedriver-mac"); 



        // Instantiate a webDriver implementation 

        WebDriver webdriver = new ChromeDriver(); 



        webdriver.get(https://github.com); 



        Assert.assertEquals("GitHub - Social Coding", webdriver.getTitle()); 

    } 

 }
                

在實例化 ChromeDriver 之前,需要正確設(shè)置? "webdriver.chrome.driver" 系統(tǒng)屬性。該屬性指出您操作系統(tǒng)的 ChromeDriver 文件位置(參閱? 參考資料 并下載)。 清單 6 中的示例使用了針對 Mac 的版本;同樣可用針對 Windows 和 Linux 的版本。

要在 Internet Explorer 中執(zhí)行相同的測試,需要用到? InterentExplorerDriver 類的實例,如 清單 7所示。

清單 7.? InternetExplorerDriver 實例化
                   WebDriver webdriver = new InternetExplorerDriver();
                

當采用? InterenetExplorerDriver 時,可能會遇到一個安全問題提示:"Protected Mode must be set to the same value (enabled or disabled) for all zones"。想要解決這一問題,需要設(shè)置特定的功能,如 清單 8所示。

清單 8. 為 Internet Explorer 設(shè)置安全性功能
                   DesiredCapabilities capability=DesiredCapabilities.internetExplorer(); 

 capability.setCapability( 

              InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_ 

 IGNORING_SECURITY_DOMAINS, true); 

 WebDriver webdriver = new InternetExplorerDriver(capability);
                

要在 Opera 中執(zhí)行測試,需要實例化? OperaDriver 類,這是由 Opera 直接開發(fā)的。記得要將包含驅(qū)動的 JAR 包括到項目中。如果您使用 Maven,則僅需增加 清單 9中的依賴性。

清單 9.? OperaDriver 依賴性
                   <dependency> 

    <groupId>com.opera</groupId> 

    <artifactId>operadriver</artifactId> 

    <version>0.7.3</version> 

 </dependency>
                

需要額外配置以實現(xiàn)在 iPhone 或者 Android 瀏覽器模擬器中運行測試。

?

使用 Selenium 2 進行測試

使用 Selenium 2 可以構(gòu)建比前節(jié)內(nèi)容更加復雜的測試。在本節(jié)中,您將測試到,GitHub 主頁的頂部導航共有 5 個列表項:Signup and Pricing、Explore GitHub、Features、Blog 以及 Login。圖 1展示了 Github 主頁。

圖 1. Github 主頁
Github 主頁

查看頂部導航的 HTML 代碼,如 清單 10所示。

清單 10. 頂部導航的 HTML 代碼
                   <html> 

 <head> 

    ... 

    </head> 

    <body class="logged_out env-production"> 

        <div id="main"> 

            <div id="header" class="true"> 

 ... 

                <div class="topsearch"> 

                        <ul class="nav logged_out"> 

                            <li class="pricing"> 

 <a >Signup and Pricing</a> 

 </li> 

                            <li class="explore"> 

 <a >Explore GitHub</a> 

 </li> 

                          <li class="features"> 

 <a >Features</a> 

 </li> 

                            <li class="blog"> 

 <a >Blog</a> 

 </li> 

                          <li class="login"> 

 <a >Login</a> 

 </li> 

                        </ul> 

 </div> 

 ... 

            </div> 

            ... 

        </div> 

       ... 

    </body> 

 </html>
                

可利用 WebDriver API(從 HTML 代碼內(nèi)部)檢索您需要測試的元素。 findElement() 和? findElements() 方法會返回公共接口 WebElement 的一個實例或者一組實例。 WebElement 可以以一種清晰的、面向?qū)ο蟮姆绞綉?yīng)用于頁面中的所有元素。在 API 中可以使用許多不同的策略來定位 UI 元素。這些策略由傳遞至? findElement() 和? findElements() 方法的不同類型參數(shù)所代表。 清單 11 展示了應(yīng)用抽象類 By 的各個方法來實現(xiàn)不同策略的示例。

清單 11. 使用? findElement() 方法
                   WebElement element1 = webdriver.findElement(By.id("header")); 

 WebElement element2 = webdriver.findElement(By.name("name")); 

 WebElement element3 = webdriver.findElement(By.tagName("a")); 

 WebElement element4 = webdriver.findElement(By.xpath("http://a[@title='logo']")); 

 WebElement element5 = webdriver.findElement(By.cssSelector(".feautures")); 

 WebElement element6 = webdriver.findElement(By.linkText("Blog")); 

 WebElement element7 = webdriver.findElement(By.partialLinkText("Ruby")); 

 WebElement element8 = webdriver.findElement(By.className("login"));
                

使用? 清單 11 中的一個策略,就可以開始編寫測試來檢索第一個元素: UL 標記中? LI 標記帶有? nav 類。清單 12使用了 Xpath ( By.xpath() )。

清單 12. Xpath
                   List<WebElement> webElements = webdriver.findElements(By 

            .xpath("http://ul[@class='nav logged_out']/li"));
                

清單 13使用 CSS 選擇器 ( By.cssSelector() ) 來檢索? LI 標記。

清單 13. CSS 選擇器
                   List<WebElement> webElements = webdriver.findElements(By 

            .cssSelector("ul.nav li"));
                

此時,可在所檢索的項數(shù)量上生成斷言,如 清單 14所示。

清單 14. 項數(shù)量上的斷言
                   Assert.assertEquals(5, webElements.size());
                

前面的步驟驗證了? LI 標記數(shù)量等于 5。

下一步是檢索每個? LI 標記中的每個錨點( A 標記)。? 清單 15 展示了如何在第一個? LI 中獲取錨點。此用例使用了 tagName ( By.tagName() ) 策略。

清單 15. 檢索第一個? LI 標記 中的? A 錨點
                   WebElement anchor1 = webElements.get(0).findElement(By.tagName("a"));
                

您可以使用類似的方法收集到所有的 5 個錨點,如 清單 16所示。

清單 16. 檢索? LI 標記中的所有錨點
                   WebElement anchor1 = webElements.get(0).findElement(By.tagName("a")); 

 WebElement anchor2 = webElements.get(1).findElement(By.tagName("a")); 

 WebElement anchor3 = webElements.get(2).findElement(By.tagName("a")); 

 WebElement anchor4 = webElements.get(3).findElement(By.tagName("a")); 

 WebElement anchor5 = webElements.get(4).findElement(By.tagName("a"));
                

在這一階段,您可以驗證,錨點內(nèi)的文本是否與所期望的字符串一致。要檢索標記內(nèi)的文本,WebDriver 提供了? getText() 方法。清單 17展示了完整的測試方法,以及測試底部的斷言。

清單 17. 完成測試
                   @Test 

 public void test() { 

 WebDriver webdriver = new FirefoxDriver();    

 webdriver.get("https://github.com"); 

 List<WebElement> webElements = webdriver.findElements(By 

                .xpath("http://ul[@class='nav logged_out']/li")); 

 Assert.assertEquals(5, webElements.size()); 



    // Retrieve the anchors 

    WebElement anchor1 = webElements.get(0).findElement(By.tagName("a")); 

    WebElement anchor2 = webElements.get(1).findElement(By.tagName("a")); 

    WebElement anchor3 = webElements.get(2).findElement(By.tagName("a")); 

    WebElement anchor4 = webElements.get(3).findElement(By.tagName("a")); 

    WebElement anchor5 = webElements.get(4).findElement(By.tagName("a")); 

    

 // Assertions    

    Assert.assertEquals("Signup and Pricing", anchor1.getText()); 

    Assert.assertEquals("Explore GitHub", anchor2.getText()); 

    Assert.assertEquals("Features", anchor3.getText()); 

    Assert.assertEquals("Blog", anchor4.getText()); 

    Assert.assertEquals("Login", anchor5.getText()); 

        

    webdriver.quit(); 



 }
                

啟動這一測試后,將會打開一個新的 Firefox 窗口,該窗口將會保持開啟,直到執(zhí)行完所有的斷言。

?

使用 Selenium Grid 2 進行遠程測試

可在 Selenium 2 中進行本地或遠程測試。要實現(xiàn)遠程運行,該測試需要使用名為? RemoteWebDriver 的? WebDriver 接口的特定實現(xiàn)。您可以指定瀏覽器采用? DesiredCapabilities 類運行。清單 18顯示了相關(guān)示例。

清單 18.? RemoteWebDriver 和? DesiredCapabilities
                   DesiredCapabilities capabilities = new DesiredCapabilities(); 

 capabilities.setBrowserName("firefox"); 

 capabilities.setVersion("7"); 

 capabilities.setPlatform("MAC"); 

 WebDriver webdriver = new RemoteWebDriver(capabilities);
                

借助? DesiredCapabilities 類,您可以指定瀏覽器的名稱、平臺和瀏覽器版本。您還可指定瀏覽器支持的其他功能。

如果想要遠程執(zhí)行結(jié)構(gòu)化測試,并運行多個瀏覽器(并且可能是不同的虛擬機),Selenium Grid 提供了很好的解決方案。

Selenium Grid 2 提供了基礎(chǔ)設(shè)施,其中每個節(jié)點代表了不同瀏覽器將自身注冊到 hub 當中。單數(shù)的測試將會調(diào)用一個 hub,它負責將每個請求分配到正確的瀏覽器。Hub 和節(jié)點可以運行在不同的虛擬機當中。

要實現(xiàn)遠程測試,則需要在您將要使用的每臺機器上下載 selenium-server-standalone-<version>.jar。要在機器上安裝 hub,轉(zhuǎn)到您下載 JAR 所在的文件夾,并運行 清單 19中的命令。

清單 19. 啟動 hub
                   java -jar selenium-server-standalone-2.9.0.jar ?role hub
                

您可在 http://localhost:4444/grid/console 訪問 Grid 2 控制臺,其中會列出所有可用的節(jié)點。要注冊一個節(jié)點,僅需運行一個命令,如 清單 20所示。

清單 20. 在 hub 中注冊的節(jié)點
                   java -jar selenium-server-standalone-2.9.0.jar 

 -role webdriver ?hub http://localhost:4444/grid/register -port 5556
                

在默認情況下,清單 20中的命令注冊了 7 個瀏覽器:5 個 Firefox 實例、1 個 Chrome 實例以及一個 Internet Explorer 實例。您可以在特定的端口上定位一個特定瀏覽器,如 清單 21所示。

清單 21. 在 hub 上注冊的 Firefox 7 實例
                   java -jar selenium-server-standalone-2.9.0.jar -role webdriver 

 -hub http://localhost:4444/grid/register -port 5556 -browser 

 browserName=chrome,version=14,platform=MAC
                

注冊完一些瀏覽器之后,Selenium Grid 2 控制臺會變成如 圖 2顯示的樣子。

圖 2. Selenium Grid 2 控制臺視圖
Grid 2 控制臺視圖樣例

要使用網(wǎng)格,則需要在測試用例中指定 hub 的 URL 和所要控制的瀏覽器。 清單 22 展示了? RemoteWebDriver 類構(gòu)造函數(shù)接受了 hub 的 URL 以及定義特定瀏覽器的? DesiredCapabilities 實例。

清單 22.? RemoteWebDriver 實例化
                   DesiredCapabilities capability = new DesiredCapabilities(); 

 capability.setBrowserName("chrome"); 

 capability.setVersion("14"); 

 capability.setPlatform(Platform.MAC); 

 WebDriver webdriver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), 

 capability);
                

在本用例中,hub 將會啟動與 Chrome 版本 14(之前已在? 清單 21 中注冊的)相關(guān)聯(lián)的節(jié)點。

Selenium Grid 2 還向后兼容 Selenium 1。您可以在 hub 中注冊 Selenium 1 RC 節(jié)點(這是 hub 中 Selenium 1 基礎(chǔ)設(shè)施的一部分),如 清單 23所示。

清單 23. Selenium 1 RC 節(jié)點注冊
                   java ?jar selenium-server-standalone-2.9.0.jar 

 -role rc ?hub http://localhost:4444/grid/register -port 5557
                
?

將測試從 Selenium 1 遷移到 Selenium 2

如果需要將編寫好的測試從 Selenium 1 轉(zhuǎn)移到 Selenium 2,那么這種轉(zhuǎn)移會相當平滑。Selenium 1 API 保留在新的 API 中,使得 Selenium 2 能夠完全向后兼容。

將測試從 Selenium 1 轉(zhuǎn)移到 Selenium 2 非常簡單,這要歸功于? WebDriverBackedSelenium 類。它將一個? WebDriver 的實例和 URL 作為測試的參數(shù),并且返回一個 Selenium 實例。清單 24展示了與? 清單 16 相同示例,但是使用集成到 Selenium 2 中的 Selenium 1 API。

清單 24. 將 Selenium 1 集成到 Selenium 2
                   @Test 

 public void test() { 

    String url = "https://github.com"; 

 WebDriver webdriver = new FirefoxDriver(); 

 webdriver.get(url); 

 Selenium selenium = new WebDriverBackedSelenium(webdriver, url); 

    selenium.open(url); 

        

 // Get the number of LIs 

    Number lis = selenium.getXpathCount("http://ul[@class='nav logged_out']/li"); 



    Assert.assertEquals(5, lis.intValue()); 



    // Retrieve the text inside the anchors 

    String anchor1Text = selenium.getText("http://ul[@class='nav logged_out']/li[1]/a"); 

    String anchor2Text = selenium.getText("http://ul[@class='nav logged_out']/li[2]/a"); 

    String anchor3Text = selenium.getText("http://ul[@class='nav logged_out']/li[3]/a"); 

    String anchor4Text = selenium.getText("http://ul[@class='nav logged_out']/li[4]/a"); 

    String anchor5Text = selenium.getText("http://ul[@class='nav logged_out']/li[5]/a"); 

        

    Assert.assertEquals("Signup and Pricing", anchor1Text); 

    Assert.assertEquals("Explore GitHub", anchor2Text); 

    Assert.assertEquals("Features", anchor3Text); 

    Assert.assertEquals("Blog", anchor4Text); 

    Assert.assertEquals("Login", anchor5Text); 

        

    webdriver.quit(); 

 }
                

Selenium 2 更加關(guān)注開發(fā)者。它具有比 Selenium 1 更清晰的 API,正如? getText() 和? getXpathCount() 方法簽名所證明的一樣。Selenium 2 API 還具有更好的面向?qū)ο蟮奶攸c。例如,不允許您處理 UI 元素對象,僅允許處理字符串。

?

結(jié)束語

Selenium 2 標志著瀏覽器內(nèi)部自動測試的一個演變過程。它繼承了 Selenium 1 與 WebDriver 最優(yōu)秀的部分,并提供了與多個瀏覽器的緊密集成。新的 API 更符合開發(fā)人員的要求,提供了面向?qū)ο蟮姆椒ǎ⑻峁┝瞬煌哪P陀糜诰帉憸y試。此外,Selenium 2 還:

  • 克服與相同原始策略相關(guān)聯(lián)的限制。
  • 為彈出窗口提供更好的支持。
  • 有效控制本機的鍵盤與鼠標的交互。

Selenium Grid 的新版本(包括在 Selenium 2 中)使得遠程加載測試更加方便。Selenium 2 能夠向后兼容 Selenium 1,因此升級到新版本輕而易舉。Selenium 2 能夠幫助確保應(yīng)用程序按需工作。

Selenium 2 入門


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 伊人网2021| 殴美毛片 | 有码在线| 久99久精品视频免费观看v | 欧美成人高清免费大片观看 | 欧美片欧美日韩国产综合片 | 俄罗斯一级毛片aaaa | 色噜噜中文网 | 亚洲欧美在线精品一区二区 | 日韩国产精品99久久久久久 | 亚洲精品6久久久久中文字幕 | 久久亚洲精品国产亚洲老地址 | 国产看片网站 | 好吊顶色| 日韩欧美亚洲综合一区二区 | 四虎精品影视 | 欧美 日| 亚洲欧洲视频在线 | 欧美日韩国产成人综合在线 | 亚洲图片 中文字幕 | 国产成人精品免费大全 | 四虎影视成人精品 | 国产成人精品日本亚洲专一区 | 日日摸夜夜添夜夜添97 | 99精品国产高清一区二区麻豆 | 成人性生活免费视频 | 欧美日韩无线码在线观看 | 极品女神西比尔久久精品 | 亚洲国产精品一区二区三区 | 成人区在线观看免费视频 | 色老头xxxxbbbb视频 | 国产亚洲综合精品一区二区三区 | 成人欧美一区二区三区视频不卡 | 69视频在线观看福利视频 | www.91色.com| 麻豆成人在线 | 久草在线视频精品 | 欧洲自拍偷拍 | 特级黄aaaaaaaaa毛片 | 在线高清一级欧美精品 | 精品美女视频在线观看2023 |