【转】Selenium 2 入门-2
上一篇 / 下一篇 2013-11-26 10:48:34 / 个人分类:自动化测试
Selenium 2 入门-2
上一篇 / 下一篇 2012-12-21 15:55:01 / 个人分类:Selenium
OperaDriver
依赖性<dependency> <groupId>com.opera</groupId> <artifactId>operadriver</artifactId> <version>0.7.3</version> </dependency> |
需要额外配置以实现在 iPhone 或者 Android 浏览器模拟器中运行测试。
使用 Selenium 2 可以构建比前节内容更加复杂的测试。在本节中,您将测试到,GitHub 主页的顶部导航共有 5 个列表项:Signup and Pricing、Explore GitHub、Features、Blog 以及 Login。图 1展示了 Github 主页。
图 1. 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 href="https://github.com/plans">Signup and Pricing</a> </li> <li class="explore"> <a href="https://github.com/explore">Explore GitHub</a> </li> <li class="features"> <a href="https://github.com/features">Features</a> </li> <li class="blog"> <a href="https://github.com/blog">Blog</a> </li> <li class="login"> <a href="https://github.com/login">Login</a> </li> </ul> </div> ... </div> ... </div> ... </body> </html> |
可利用 WebDriver API(从 HTML 代码内部)检索您需要测试的元素。findElement()
和findElements()
方法会返回公共接口WebElement
的一个实例或者一组实例。WebElement
可以以一种清晰的、面向对象的方式应用于页面中的所有元素。在 API 中可以使用许多不同的策略来定位 UI 元素。这些策略由传递至findElement()
和findElements()
方法的不同类型参数所代表。清单 11展示了应用抽象类By
的各个方法来实现不同策略的示例。
清单 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("//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("//ul[@class='nav logged_out']/li")); |
清单 13使用 CSS 选择器 (By.cssSelector()
) 来检索LI
标记。
清单 13. CSS 选择器
List<WebElement> webElements = webdriver.findElements(By .cssSelector("ul.nav li")); |
此时,可在所检索的项数量上生成断言,如 清单 14所示。
清单 14. 项数量上的断言
Assert.assertEquals(5, webElements.size()); |
前面的步骤验证了LI
标记数量等于 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")); |
在这一阶段,您可以验证,锚点内的文本是否与所期望的字符串一致。要检索标记内的文本,WebDriver 提供了getText()
方法。清单 17展示了完整的测试方法,以及测试底部的断言。
清单 17. 完成测试
@Test public voidtest() { WebDriver webdriver = new FirefoxDriver(); webdriver.get("https://github.com"); List<WebElement> webElements = webdriver.findElements(By .xpath("//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 窗口,该窗口将会保持开启,直到执行完所有的断言。
可在 Selenium 2 中进行本地或远程测试。要实现远程运行,该测试需要使用名为RemoteWebDriver
的WebDriver
接口的特定实现。您可以指定浏览器采用DesiredCapabilities
类运行。清单 18显示了相关示例。
清单 18.
RemoteWebDriver
和DesiredCapabilities
类DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setBrowserName("firefox"); capabilities.setVersion("7"); capabilities.setPlatform("MAC"); WebDriver webdriver = new RemoteWebDriver(capabilities); |
借助DesiredCapabilities
类,您可以指定浏览器的名称、平台和浏览器版本。您还可指定浏览器支持的其他功能。
如果想要远程执行结构化测试,并运行多个浏览器(并且可能是不同的虚拟机),Selenium Grid 提供了很好的解决方案。
Selenium Grid 2 提供了基础设施,其中每个节点代表了不同浏览器将自身注册到 hub 当中。单数的测试将会调用一个 hub,它负责将每个请求分配到正确的浏览器。Hub 和节点可以运行在不同的虚拟机当中。
要实现远程测试,则需要在您将要使用的每台机器上下载 selenium-server-standalone-<version>.jar。要在机器上安装 hub,转到您下载 JAR 所在的文件夹,并运行 清单 19中的命令。
清单 19. 启动 hub
java-jar selenium-server-standalone-2.9.0.jar ?role hub |
您可在 http://localhost:4444/grid/console 访问 Grid 2 控制台,其中会列出所有可用的节点。要注册一个节点,仅需运行一个命令,如 清单 20所示。
清单 20. 在 hub 中注册的节点
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 控制台视图
要使用网格,则需要在测试用例中指定 hub 的 URL 和所要控制的浏览器。清单 22展示了RemoteWebDriver
类构造函数接受了 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中注册的)相关联的节点。
Selenium Grid 2 还向后兼容 Selenium 1。您可以在 hub 中注册 Selenium 1 RC 节点(这是 hub 中 Selenium 1 基础设施的一部分),如 清单 23所示。
清单 23. Selenium 1 RC 节点注册
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 转移到 Selenium 2,那么这种转移会相当平滑。Selenium 1 API 保留在新的 API 中,使得 Selenium 2 能够完全向后兼容。
将测试从 Selenium 1 转移到 Selenium 2 非常简单,这要归功于WebDriverBackedSelenium
类。它将一个WebDriver
的实例和 URL 作为测试的参数,并且返回一个 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("//ul[@class='nav logged_out']/li"); Assert.assertEquals(5, lis.intValue()); // Retrieve the text inside the anchors String anchor1Text = selenium.getText("//ul[@class='nav logged_out']/li[1]/a"); String anchor2Text = selenium.getText("//ul[@class='nav logged_out']/li[2]/a"); String anchor3Text = selenium.getText("//ul[@class='nav logged_out']/li[3]/a"); String anchor4Text = selenium.getText("//ul[@class='nav logged_out']/li[4]/a"); String anchor5Text = selenium.getText("//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 更加关注开发者。它具有比 Selenium 1 更清晰的 API,正如getText()
和getXpathCount()
方法签名所证明的一样。Selenium 2 API 还具有更好的面向对象的特点。例如,不允许您处理 UI 元素对象,仅允许处理字符串。
Selenium 2 标志着浏览器内部自动测试的一个演变过程。它继承了 Selenium 1 与 WebDriver 最优秀的部分,并提供了与多个浏览器的紧密集成。新的 API 更符合开发人员的要求,提供了面向对象的方法,并提供了不同的模型用于编写测试。此外,Selenium 2 还:
- 克服与相同原始策略相关联的限制。
- 为弹出窗口提供更好的支持。
- 有效控制本机的键盘与鼠标的交互。
Selenium Grid 的新版本(包括在 Selenium 2 中)使得远程加载测试更加方便。Selenium 2 能够向后兼容 Selenium 1,因此升级到新版本轻而易举。Selenium 2 能够帮助确保应用程序按需工作。
相关阅读:
- 一个完整的maven配置selenium webdriver工程实例(六) (qicyt1812, 2013-10-23)
- 一个完整的maven配置selenium webdriver工程实例(七) (qicyt1812, 2013-10-23)
- Selenium2.0功能测试之如何使用Action类来模拟交互 (zaza9084, 2013-10-30)
- Selenium2.0功能测试之如何使用Remote WebDriver (zaza9084, 2013-10-31)
- selenium RC中使用click的参数为xpath表示 (congrong, 2013-10-30)
- Android自动化测试之Monkeyrunner从零开始(三) (qingchunjun, 2013-11-17)
- 【转】Selenium 2 入门-1 (sushe2009, 2013-11-26)
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 19021
- 日志数: 22
- 建立时间: 2013-07-18
- 更新时间: 2015-04-22