Selenium - 快速指南


Selenium - 概述

介绍

Selenium 是一个开源的、便携式的自动化软件测试工具,用于测试 Web 应用程序。它具有跨不同浏览器和操作系统运行的能力。Selenium 不仅仅是一个工具,而是一组工具,可以帮助测试人员更有效地自动化基于 Web 的应用程序。

现在让我们了解 Selenium 套件中可用的每一种工具及其用法。

先生。 工具及说明
1

Selenium集成开发环境

Selenium集成开发环境(IDE) 是一个 Firefox 插件,可让测试人员在遵循需要测试的工作流程时记录他们的操作

2

SeleniumRC

Selenium远程控制(RC) 是旗舰测试框架,它不仅仅允许简单的浏览器操作和线性执行它充分利用 Java、C#、PHP、Python、Ruby 和 PERL 等编程语言的全部功能来创建更复杂的测试。

3

Selenium网络驱动程序

Selenium WebDriver 是 Selenium RC 的继承者,它直接向浏览器发送命令并检索结果。

4

Selenium网格

Selenium Grid 是一种用于在不同机器和不同浏览器上同时运行并行测试的工具,从而最大限度地缩短执行时间。

Selenium的优点

QTP 和 Selenium 是软件自动化测试市场上最常用的工具。因此,比较 Selenium 与 QTP 的优点是有意义的。

Selenium QTP
Selenium 是一个开源工具。 QTP 是一种商业工具,每个许可证都涉及成本。
可以针对公开 DOM 的各种技术进行扩展。 附加组件有限,并且每一项技术都需要附加组件。
具有跨不同浏览器执行脚本的能力。 可以在特定版本的 Firefox、IE 和 Chrome 中运行测试。
可以在各种操作系统上执行脚本。 仅适用于 Windows。
支持移动设备。 借助第三方工具支持移动设备。
在浏览器中执行测试,因此在脚本执行过程中不需要焦点。 在脚本执行期间需要焦点,因为该工具作用于浏览器(模仿用户操作)。
可以使用 Selenium Grid 并行执行测试。 QTP 无法并行执行测试,但是将 QTP 与 QC 集成允许测试人员并行执行。QC也是一种商业工具。

Selenium的缺点

现在让我们讨论 Selenium 相对于 QTP 的缺陷。

Selenium QTP
仅支持基于 Web 的应用程序。 可以测试 Web 和桌面应用程序。
没有对象存储库/恢复场景等功能 QTP 具有内置的对象存储库和恢复方案。
没有IDE,所以脚本开发不会像QTP那么快。 更直观的IDE;可以更快地实现自动化。
无法访问浏览器内的控件。 可以访问浏览器内的控件,例如收藏夹栏、后退和前进按钮。
没有默认的测试报告生成。 工具内默认生成测试结果。
对于参数化,用户必须依赖编程语言。 参数化是内置的并且易于实现。

Selenium-IDE

Selenium-IDE(集成开发环境)是一个易于使用的 Firefox 插件,用于开发 Selenium 测试用例。它提供了一个图形用户界面,用于使用 Firefox 记录用户操作,用于学习和使用 Selenium,但它只能与 Firefox 浏览器一起使用,因为不支持其他浏览器。

然而,录制的脚本可以转换为Selenium支持的各种编程语言,并且脚本也可以在其他浏览器上执行。

下表列出了我们将在本章中介绍的部分。

先生。 标题描述
1 下载 Selenium IDE

本节介绍如何下载和配置 Selenium IDE。

2 Selenium IDE 功能

本节介绍 Selenium IDE 中可用的功能。

3 创建 Selenium IDE 测试

本节介绍如何使用录制功能创建 IDE 测试。

4 Selenium IDE 脚本调试

本节涉及调试 Selenium IDE 脚本。

5 插入验证点

本节介绍如何在 Selenium IDE 中插入验证点。

6 Selenium模式匹配

本节介绍如何使用 IDE 处理正则表达式。

7 Selenium 用户扩展

允许用户自定义或添加新功能的 Java 脚本。

8 不同浏览器执行

本节介绍如何在不同浏览器上执行 Selenium IDE 脚本。

Selenium - 环境设置

为了开发 Selenium RC 或 WebDriver 脚本,用户必须确保已完成初始配置。设置环境涉及以下步骤。

  • 下载并安装 Java
  • 下载并配置 Eclipse
  • 配置 FireBug 和 FirePath
  • 配置 Selenium RC
  • 配置 Selenium WebDriver

下载并安装 Java

我们需要安装 JDK(Java 开发工具包)才能使用 Selenium WebDriver/Selenium。让我们看看如何下载并安装 Java。

步骤 1 - 导航至 UR。

https://www.oracle.com/technetwork/java/javase/downloads/index.html

步骤 2 - 转到“下载”部分并选择“JDK 下载”。

SeleniumIDE 30

步骤 3 - 选择“接受许可协议”单选按钮。

SeleniumIDE 31

步骤 4 - 选择适当的安装。在本例中,它是“Windows 7-64”位。单击相应的链接并将 .exe 文件保存到您的磁盘。

SeleniumIDE 32

步骤 5 - 运行下载的 exe 文件以启动安装程序向导。单击“下一步”继续。

SeleniumIDE 33

步骤 6 - 选择功能并单击“下一步”。

SeleniumIDE 34

步骤 7 - 安装程序被提取,其进度显示在向导中。

SeleniumIDE 35

步骤 8 - 用户可以选择安装位置并单击“下一步”。

SeleniumIDE 36

步骤 9 - 安装程序安装 JDK 并复制新文件。

SeleniumIDE 37

步骤 10 - 安装程序安装成功并向用户显示相同的内容。

SeleniumIDE 38

步骤 11 - 要验证安装是否成功,请转到命令提示符并键入“java”作为命令。该命令的输出如下所示。如果Java安装不成功或尚未安装,则会抛出“未知命令”错误。

SeleniumIDE 48

下载并配置 Eclipse

步骤 1 - 导航到 URL: https: //www.eclipse.org/downloads/并根据您的操作系统架构下载适当的文件。

SeleniumIDE 39

步骤 2 - 单击“下载”按钮。

SeleniumIDE 40

步骤 3 - 下载将为压缩格式。解压缩内容。

SeleniumIDE 41

步骤 4 - 找到 Eclipse.exe 并双击该文件。

SeleniumIDE 42

步骤 5 - 要配置工作区,请选择必须进行开发的位置。

SeleniumIDE 43

步骤 6 - Eclipse 窗口打开,如下所示。

SeleniumIDE 44

配置 FireBug 和 FirePath

要使用 Selenium RC 或 WebDriver,我们需要根据 XPath 或 ID 或名称等来定位元素。为了定位元素,我们需要工具/插件。

步骤 1 - 导航到 URL: https: //addons.mozilla.org/en-US/firefox/addon/firebug/并下载插件。

SeleniumIDE 62

步骤 2 - 向用户显示附加安装程序,并在单击“安装”按钮后安装。

SeleniumIDE 63

步骤 3 - 安装后,我们可以通过导航到“Web Developer”>>“Firebug”来启动插件。

SeleniumIDE 64

步骤 4 - FirePath,一个在 Firebug 中工作的插件,可以帮助用户获取元素的“XPath”。通过导航到“ https://addons.mozilla.org/en-US/firefox/addon/firepath/ ”来安装 FirePath

SeleniumIDE 65

步骤 5 - 向用户显示附加安装程序,并在单击“安装”按钮后安装。

SeleniumIDE 66

步骤 6 - 现在通过导航到“Tools”>>“Webdeveloper”>>“Firebug”来启动“Firebug”。

SeleniumIDE 67

例子

现在让我们通过示例来了解如何使用 FireBug 和 FirePath。为了进行演示,我们将使用 www.google.com 并捕获“google.com”文本框的属性。

步骤 1 - 首先单击以下屏幕截图中突出显示的箭头图标,并将其拖动到我们要捕获其属性的对象。对象的 HTML/DOM 将显示如下。我们能够捕获可以与之交互的输入文本框的“ID”。

SeleniumIDE 68

步骤 2 - 要获取对象的 XPath,请转到“firepath”选项卡并执行以下步骤。

  • 单击间谍图标。
  • 选择我们想要捕获 XPath 的控件。
  • 将生成所选控件的 XPath。
SeleniumIDE 69

配置 Selenium RC

现在让我们看看如何配置 Selenium 远程控制。我们将在后面的章节中了解如何使用 Selenium RC 开发脚本,但现在我们仅了解其中的配置部分。

步骤 1 - 导航到 Selenium 下载部分http://www.seleniumhq.org/download/并通过单击版本号下载 Selenium Server,如下所示。

SeleniumIDE 45

步骤 2 - 下载后,我们需要启动 Selenium 服务器。为此,请打开命令提示符并导航到保存下载的 JAR 文件的文件夹,如下所示。

SeleniumIDE 46

步骤 3 - 要启动服务器,请使用命令“java -jar <<下载的 jar 名称 >>”,如果 java JDK 安装正确,您将收到如下所示的成功消息。现在我们可以开始编写 Selenium RC 脚本了。

SeleniumIDE 47

配置 Selenium WebDriver

现在让我们看看如何配置 Selenium WebDriver。我们将在后面的章节中了解如何使用 Selenium WebDriver 开发脚本,但现在我们仅了解其配置部分。

步骤 1 - 导航到 selenium 下载部分http://www.seleniumhq.org/download/并通过单击版本号下载 Selenium WebDriver,如下所示。

SeleniumIDE 49

步骤 2 - 下载的文件为压缩格式,必须解压缩内容才能将其映射到项目文件夹。

SeleniumIDE 49

步骤 3 - 解压缩的内容将显示如下。如何将其映射到项目文件夹以及如何开始编写脚本将在 webDriver 章节中讨论。

SeleniumIDE 51

Selenium - 远程控制

什么是Selenium RC?

Selenium Remote Control (RC) 是 Selenium WebDriver(Selenium 2.0)出现之前持续了很长时间的主要 Selenium 项目。现在Selenium RC已经很少使用了,因为WebDriver提供了更强大的功能,但是用户仍然可以继续使用RC来开发脚本。

它允许我们借助 Java、C#、Perl、Python 和 PHP 等编程语言的全部功能来编写自动化 Web 应用程序 UI 测试,以创建更复杂的测试,例如读写文件、查询数据库以及通过电子邮件发送测试结果。

Selenium RC 架构

Selenium RC 的工作方式是客户端库可以与 Selenium RC 服务器进行通信,传递每个 Selenium 命令来执行。然后服务器使用 Selenium-Core JavaScript 命令将 Selenium 命令传递到浏览器。

浏览器使用其 JavaScript 解释器执行 Selenium 命令。

SeleniumIDE 52

Selenium RC 分为两部分。

  • Selenium 服务器启动并终止浏览器。除此之外,它还解释并执行 Selenese 命令。它还通过拦截和验证浏览器与被测应用程序之间传递的 HTTP 消息来充当 HTTP 代理。

  • 客户端库提供每种编程语言(Java、C#、Perl、Python 和 PHP)与 Selenium-RC 服务器之间的接口。

RC 脚本

现在让我们使用 Selenium Remote Control 编写一个示例脚本。让我们使用http://www.calculator.net/来了解 Selenium RC。我们将使用“数学计算器”模块下的“百分比计算器”执行百分比计算。

步骤 1 - 启动 Selenium Remote Control(在命令提示符的帮助下)。

步骤 2 - 启动 Selenium RC 后,打开 Eclipse 并创建一个“新项目”,如下所示。

SeleniumIDE 53

步骤 3 - 输入项目名称并单击“下一步”按钮。

SeleniumIDE 54

步骤 4 - 验证源、项目、库和输出文件夹,然后单击“完成”。

SeleniumIDE 55

步骤 5 - 右键单击​​“项目”容器并选择“配置构建路径”。

SeleniumIDE 56

步骤 6 - 打开“selrcdemo”属性。导航到“库”选项卡并选择“添加外部 JAR”。选择我们下载的 Selenium RC jar 文件,它将如下所示。

SeleniumIDE 57

步骤 7 - 引用的库如下所示。

SeleniumIDE 58

步骤 8 - 通过右键单击“src”文件夹并选择“新建”>>“类”来创建新的类文件。

SeleniumIDE 59

步骤 9 - 输入类文件的名称并启用“public static void main”,如下所示。

SeleniumIDE 60

步骤 10 - 在文件夹结构下创建创建的类,如下所示。

SeleniumIDE 70

步骤 11 - 现在是编码的时候了。以下代码中嵌入了注释,以便读者理解所提出的内容。

package selrcdemo;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class rcdemo {
   public static void main(String[] args) throws InterruptedException {

      // Instatiate the RC Server
      Selenium selenium = new DefaultSelenium("localhost", 4444 , "firefox", "http://www.calculator.net");
      selenium.start();   // Start
      selenium.open("/");  // Open the URL
      selenium.windowMaximize();

      // Click on Link Math Calculator
      selenium.click("xpath = .//*[@id = 'menu']/div[3]/a");
      Thread.sleep(2500); // Wait for page load

      // Click on Link Percent Calculator
      selenium.click("xpath = .//*[@id = 'menu']/div[4]/div[3]/a");
      Thread.sleep(4000); // Wait for page load

      // Focus on text Box
      selenium.focus("name = cpar1");
      
      // enter a value in Text box 1
      selenium.type("css=input[name = \"cpar1\"]", "10");
      
      // enter a value in Text box 2
      selenium.focus("name = cpar2");
      selenium.type("css = input[name = \"cpar2\"]", "50");

      // Click Calculate button
      selenium.click("xpath = .//*[@id = 'content']/table/tbody/tr/td[2]/input");

      // verify if the result is 5
      String result = selenium.getText(".//*[@id = 'content']/p[2]");

      if (result == "5") {
         System.out.println("Pass");
      } else {
         System.out.println("Fail");
      }
   }
}

步骤 12 - 现在,让我们通过单击“运行”按钮来执行脚本。

SeleniumIDE 72

步骤 13 - 脚本将开始执行,用户将能够在“命令历史记录”选项卡下查看命令历史记录。

SeleniumIDE 71

步骤 14 - 应用程序的最终状态如下所示。计算百分比并将结果显示在屏幕上,如下所示。

SeleniumIDE 73

步骤 15 - 测试的输出打印在 Eclipse 控制台上,如下所示,因为我们已将输出打印到控制台。输出实时写入 HTML 文件或简单的文本文件中。

SeleniumIDE 74

Selenium - Selenese 命令

命令是指 Selenium 必须执行的操作,selenium 中的命令分为三种类型。单击其中每一项即可了解有关命令的更多信息。

定位器

元素定位器帮助 Selenium 识别命令引用的 HTML 元素。所有这些定位器都可以借助 Mozilla 的 FirePath 和 FireBug 插件来识别。详细信息请参阅环境设置章节。

  • identifier = id选择指定“id”属性的元素,如果没有匹配,则选择第一个@name属性为id的元素。

  • id = id选择具有指定“id”属性的元素。

  • name = name选择第一个具有指定“name”属性的元素

  • dom = javascriptExpression Selenium 通过评估指定的字符串来查找元素,该字符串允许我们使用 JavaScript 遍历 HTML 文档对象模型。用户无法返回值,但可以将其计算为块中的表达式。

  • xpath = xpathExpression使用 XPath 表达式定位元素。

  • link = textPattern选择包含与指定模式匹配的文本的链接元素(在锚标记内)。

  • css = cssSelectorSyntax使用 css 选择器选择元素。

Selenium - Webdriver

WebDriver 是一个用于自动测试 Web 应用程序的工具。它通常被称为 Selenium 2.0。WebDriver 使用不同的底层框架,而 Selenium RC 使用嵌入在浏览器中的 JavaScript Selenium-Core,这有一些限制。WebDriver 直接与浏览器交互,无需任何中介,不像 Selenium RC 依赖于服务器。它用于以下上下文 -

  • 多浏览器测试,包括 Selenium RC (Selenium 1.0) 未很好支持的浏览器改进功能。

  • 处理多个框架、多个浏览器窗口、弹出窗口和警报。

  • 复杂的页面导航。

  • 高级用户导航,例如拖放。

  • 基于 AJAX 的 UI 元素。

建筑学

WebDriver 最好用一个简单的架构图来解释,如下所示。

SeleniumIDE 92

Selenium RC 与 WebDriver

SeleniumRC Selenium网络驱动程序
Selenium RC 的架构很复杂,因为在开始测试之前需要启动并运行服务器。 WebDriver 的架构比 Selenium RC 更简单,因为它从操作系统级别控制浏览器。
Selenium 服务器充当浏览器和 Selenese 命令之间的中间人。 WebDriver直接与浏览器交互,并使用浏览器的引擎来控制它。
Selenium RC 脚本执行速度较慢,因为它使用 Javascript 与 RC 交互。 WebDriver 速度更快,因为它直接与浏览器交互。
Selenium RC 不支持无头执行,因为它需要真正的浏览器才能使用。 WebDriver可以支持无头执行。
这是一个简单而小的 API。 与 RC 相比,API 复杂且有点大。
较少面向对象的 API。 纯粹面向对象的API。
无法测试移动应用程序。 可以测试iPhone/Android应用程序。

使用 WebDriver 编写脚本

让我们了解如何使用 WebDriver。为了进行演示,我们将使用https://www.calculator.net/。我们将执行位于“数学计算器”下的“百分比计算器”。我们已经下载了所需的 WebDriver JAR。详细信息请参阅“环境设置”一章。

步骤 1 - 从提取的 Eclipse 文件夹中启动“Eclipse”。

SeleniumIDE 75

步骤 2 - 单击“浏览”按钮选择工作区。

SeleniumIDE 76

步骤 3 - 现在从“文件”菜单创建一个“新项目”。

SeleniumIDE 53

步骤 4 - 输入项目名称并单击“下一步”。

SeleniumIDE 77

步骤 5 - 转到“库”选项卡并选择我们已下载的所有 JAR。添加对 Selenium WebDriver Library 文件夹的所有 JAR 以及 selenium-java-2.42.2.jar 和 selenium-java-2.42.2-srcs.jar 的引用。

SeleniumIDE 78

步骤 6 - 创建包,如下所示。

SeleniumIDE 79

步骤 7 - 现在右键单击包并选择“新建”>>“类”以创建“类”。

SeleniumIDE 82

步骤 8 - 现在命名该类并使其成为主函数。

SeleniumIDE 80

步骤 9 - 课程大纲如下所示。

SeleniumIDE 81

步骤 10 - 现在是时候编码了。以下脚本更容易理解,因为它嵌入了注释来清楚地解释步骤。请查看“定位器”一章以了解如何捕获对象属性。

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;

public class webdriverdemo {
   public static void main(String[] args) {
   
      WebDriver driver = new FirefoxDriver();
      //Puts an Implicit wait, Will wait for 10 seconds before throwing exception
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      
      //Launch website
      driver.navigate().to("http://www.calculator.net/");
      
      //Maximize the browser
      driver.manage().window().maximize();
      
      // Click on Math Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[3]/a")).click();
      
      // Click on Percent Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[4]/div[3]/a")).click();
      
      // Enter value 10 in the first number of the percent Calculator
      driver.findElement(By.id("cpar1")).sendKeys("10");
      
      // Enter value 50 in the second number of the percent Calculator
      driver.findElement(By.id("cpar2")).sendKeys("50");
      
      // Click Calculate Button
      driver.findElement(By.xpath(".//*[@id = 'content']/table/tbody/tr[2]/td/input[2]")).click();

      
      // Get the Result Text based on its xpath
      String result =
         driver.findElement(By.xpath(".//*[@id = 'content']/p[2]/font/b")).getText();

      
      // Print a Log In message to the screen
      System.out.println(" The Result is " + result);
      
      //Close the Browser.
      driver.close();
   }
}

步骤 11 - 上述脚本的输出将打印在控制台中。

SeleniumIDE 83

最常用的命令

下表列出了 WebDriver 中一些最常用的命令及其语法。

先生。 命令与说明
1

驱动程序.get("URL")

导航到应用程序。

2

element.sendKeys("输入文本")

在输入框中输入一些文本。

3

元素.clear()

清除输入框中的内容。

4

select.取消全选()

取消选择页面上第一个 SELECT 中的所有 OPTION。

5

select.selectByVisibleText("一些文本")

选择具有用户指定输入的选项。

6

driver.switchTo().window("窗口名称")

将焦点从一个窗口移至另一个窗口。

7

driver.switchTo().frame("frameName")

从一个框架摆动到另一个框架。

8

driver.switchTo().alert()

帮助处理警报。

9

driver.navigate().to("URL")

导航至 URL。

10

driver.navigate().forward()

向前导航。

11

driver.navigate().back()

导航回来。

12

驱动程序.close()

关闭与驱动程序关联的当前浏览器。

13

驱动程序.quit()

退出驱动程序并关闭该驱动程序的所有关联窗口。

14

驱动程序.刷新()

刷新当前页面。

Selenium - 定位器

在 Selenium WebDriver 中定位元素是借助 WebDriver 和 WebElement 类提供的 findElement() 和 findElements() 方法来执行的。

  • findElement() 根据指定的搜索条件返回 WebElement 对象,如果找不到任何与搜索条件匹配的元素,则最终抛出异常。

  • findElements() 返回与搜索条件匹配的 WebElements 列表。如果没有找到元素,则返回一个空列表。

下表列出了在 Selenium WebDriver 中定位元素的所有 Java 语法。

方法 句法 描述
通过ID driver.findElement(By.id (<元素 ID>)) 使用 ID 属性定位元素
按名字 driver.findElement(By.name (<元素名称>)) 使用 Name 属性定位元素
按类名 driver.findElement(By.className (<元素类>)) 使用 Class 属性定位元素
按标签名称 driver.findElement(By.tagName (<htmltagname>)) 使用 HTML 标签定位元素
通过链接文本 driver.findElement(By.linkText (<linktext>)) 使用链接文本定位链接
通过部分链接文本 driver.findElement(By.partialLinkText (<linktext>)) 使用链接的部分文本定位链接
通过CSS driver.findElement(By.cssSelector (<css 选择器>)) 使用 CSS 选择器定位元素
通过 XPath driver.findElement(By.xpath (<xpath>)) 使用 XPath 查询定位元素

定位器的使用

现在让我们借助https://www.calculator.net了解每种定位器方法的实际用法

通过ID

这里借助 ID 来访问对象。在本例中,它是文本框的 ID。使用 sendkeys 方法在 ID(cdensent) 的帮助下将值输入到文本框中。

SeleniumIDE 84

driver.findElement(By.id("cdensity")).sendKeys("10");

按名字

这里借助名称来访问对象。在本例中,它是文本框的名称。使用 sendkeys 方法在 ID(cdensent) 的帮助下将值输入到文本框中。

SeleniumIDE 85

driver.findElement(By.name("cdensity")).sendKeys("10");

按类别名称

这里借助类名来访问对象。在本例中,它是 WebElement 的类名称。可以借助 gettext 方法访问该值。

SeleniumIDE 86

List<WebElement> byclass = driver.findElements(By.className("smalltext smtb"));

按标签名称

元素的 DOM 标签名称可用于在 WebDriver 中定位该特定元素。借助这种方法,处理表格非常容易。看看下面的代码。

WebElement table = driver.findElement(By.id("calctable"));
List<WebElement> row = table.findElements(By.tagName("tr"));
int rowcount = row.size();

通过链接文本

此方法有助于定位具有匹配可见文本的链接元素。

SeleniumIDE 87

driver.findElements(By.linkText("Volume")).click();

通过部分链接文本

此方法有助于定位具有部分匹配可见文本的链接元素。

SeleniumIDE 87

driver.findElement(By.partialLinkText("音量")).click();

通过CSS

CSS 被用作识别 Web 对象的方法,但并非所有浏览器都支持 CSS 识别。

WebElement loginButton = driver.findElement(By.cssSelector("input.login"));

通过 XPath

XPath 代表 XML 路径语言。它是一种用于从 XML 文档中选择节点的查询语言。XPath 基于 XML 文档的树表示,并提供通过使用各种标准选择节点来在树中导航的能力。

SeleniumIDE 88

driver.findElement(By.xpath(".//*[@id = 'content']/table[1]/tbody/tr/td/table/tbody/tr[2]/td[1]/input")).sendkeys("100");

Selenium - 用户交互

Selenium WebDriver 是 Selenium 工具集中所有可用工具中最常用的工具。因此,了解如何使用 Selenium 与 Web 应用程序交互非常重要。在本模块中,让我们了解如何使用 Selenium webDriver 与 GUI 对象交互。

我们需要通过开发没有预定义命令的用户定义函数,使用一些基本操作甚至一些高级用户操作与应用程序进行交互。

下面列出了针对这些 GUI 对象的不同类型的操作 -

Selenium - 测试设计技术

设计测试涉及各种组件。让我们了解设计框架所涉及的一些重要组件。我们将在本章中学习以下主题 -

Selenium-TestNG

TestNG是一个功能强大的测试框架,是JUnit的增强版本,在TestNG出现之前就已经使用了很长时间。NG 代表“下一代”。

TestNG 框架提供以下功能 -

  • 注释可以帮助我们轻松组织测试。
  • 灵活的测试配置。
  • 测试用例可以更容易地分组。
  • 测试的并行化可以使用 TestNG 来实现。
  • 支持数据驱动测试。
  • 内置报告。

为 Eclipse 安装 TestNG

步骤 1 - 启动 Eclipse 并选择“安装新软件”。

SeleniumIDE 93

步骤 2 - 输入 URL“http://beust.com/eclipse”,然后单击“添加”。

SeleniumIDE 94

步骤 3 - 将打开对话框“添加存储库”。输入名称“TestNG”,然后单击“确定”

SeleniumIDE 95

步骤 4 - 单击“全选”,将选择“TestNG”,如图所示。

SeleniumIDE 96

步骤 5 - 单击“下一步”继续。

SeleniumIDE 97

步骤 6 - 检查所选项目并单击“下一步”。

SeleniumIDE 98

步骤 7 - “接受许可协议”并单击“完成”。

SeleniumIDE 99

步骤 8 - TestNG 开始安装,进度如下所示。

SeleniumIDE 100

步骤 9 - 由于无法确定软件的有效性,因此弹出安全警告。单击“确定”。

SeleniumIDE 101

步骤 10 - 安装程序提示重新启动 Eclipse 以使更改生效。单击“是”。

SeleniumIDE 102

TestNG 中的注释

注解在 JDK 5 中正式添加到 Java 语言中,TestNG 选择使用注解来注解测试类。以下是使用注释的一些好处。有关 TestNG 的更多信息可以在这里找到

  • TestNG 通过查找注释来识别它感兴趣的方法。因此,方法名称不限于任何模式或格式。

  • 我们可以将附加参数传递给注释。

  • 注释是强类型的,因此编译器会立即标记任何错误。

  • 测试类不再需要扩展任何东西(例如 JUnit 3 的 TestCase)。

先生。 注释和描述
1

@BeforeSuite

在该套件中的所有测试运行之前,带注释的方法将仅运行一次。

2

@AfterSuite

带注释的方法将仅在该套件中的所有测试运行后运行一次。

3

@课前

在调用当前类中的第一个测试方法之前,带注释的方法将仅运行一次。

4

@下课以后

被注解的方法只会在当前类中的所有测试方法运行完毕后运行一次。

5

@测试前

带注释的方法将在运行属于 <test> 标记内的类的任何测试方法之前运行。

6

@测试后

带注释的方法将在属于 <test> 标记内的类的所有测试方法运行后运行。

7

@BeforeGroups

此配置方法之前将运行的组的列表。该方法保证在调用属于任何这些组的第一个测试方法之前不久运行。

8

@AfterGroups

此配置方法将在其后运行的组列表。该方法保证在调用属于任何这些组的最后一个测试方法后不久运行。

9

@方法之前

带注释的方法将在每个测试方法之前运行。

10

@AfterMethod

带注释的方法将在每个测试方法之后运行。

11

@DataProvider

将方法标记为为测试方法提供数据。带注释的方法必须返回一个Object[][],其中每个Object[]可以分配测试方法的参数列表。想要从此 DataProvider 接收数据的 @Test 方法需要使用与该批注名称相同的 dataProvider 名称。

12

@工厂

将方法标记为工厂,该工厂返回将由 TestNG 作为测试类使用的对象。该方法必须返回 Object[ ]。

13

@听众

定义测试类的侦听器。

14

@参数

描述如何将参数传递给@Test方法。

15

@测试

将类或方法标记为测试的一部分。

TestNG-Eclipse 设置

步骤 1 - 启动 Eclipse 并创建一个“新 Java 项目”,如下所示。

SeleniumIDE 53

步骤 2 - 输入项目名称并单击“下一步”。

SeleniumIDE 103

步骤 3 - 导航到“库”选项卡,然后单击“添加外部 JAR”来添加 Selenium 远程控制服务器 JAR 文件,如下所示。

SeleniumIDE 113

步骤 4 - 添加的 JAR 文件显示在此处。单击“添加库”。

SeleniumIDE 104

步骤 5 - “添加库”对话框打开。选择“TestNG”,然后在“添加库”对话框中单击“下一步”。

SeleniumIDE 105

步骤 6 - 添加添加的“TestNG”库,并显示如下。

SeleniumIDE 106

步骤 7 - 创建项目后,项目的结构如下所示。

SeleniumIDE 107

步骤 8 - 右键单击​​“src”文件夹并选择“新建>>其他”。

SeleniumIDE 108

步骤 9 - 选择“TestNG”并单击“下一步”。

SeleniumIDE 109

步骤 10 - 选择“源文件夹”名称并单击“确定”。

SeleniumIDE 110

步骤 11 - 选择“包名称”、“类名称”,然后单击“完成”。

SeleniumIDE 111

步骤 12 - 将显示包资源管理器和创建的类。

SeleniumIDE 112

TestNG 中的第一次测试

现在让我们开始使用 TestNG 编写脚本。让我们为用于理解 WebDriver 的同一示例编写脚本。我们将使用演示应用程序www.calculator.net并执行百分比计算器。

在下面的测试中,您会注意到没有 main 方法,因为 testNG 将驱动程序执行流程。初始化驱动程序后,它将执行“@BeforeTest”方法,然后执行“@Test”,然后执行“@AfterTest”。请注意,一个类中可以有任意数量的“@Test”注释,但“@BeforeTest”和“@AfterTest”只能出现一次。

package TestNG;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class TestNGClass {
   WebDriver driver = new FirefoxDriver();
   
   @BeforeTest
   public void launchapp() {
      // Puts an Implicit wait, Will wait for 10 seconds before throwing exception
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      
      // Launch website
      driver.navigate().to("http://www.calculator.net");
      driver.manage().window().maximize();
   }
   
   @Test
   public void calculatepercent() {
      // Click on Math Calculators
      driver.findElement(By.xpath(".//*[@id='menu']/div[3]/a")).click();
      
      // Click on Percent Calculators
      driver.findElement(By.xpath(".//*[@id='menu']/div[4]/div[3]/a")).click();
      
      // Enter value 10 in the first number of the percent Calculator
      driver.findElement(By.id("cpar1")).sendKeys("10");
      
      // Enter value 50 in the second number of the percent Calculator
      driver.findElement(By.id("cpar2")).sendKeys("50");
      
      // Click Calculate Button
      driver.findElement(By.xpath(".//*[@id='content']/table/tbody/tr/td[2]/input")).click();
      
      // Get the Result Text based on its xpath
      String result =
         driver.findElement(By.xpath(".//*[@id='content']/p[2]/span/font/b")).getText();
      
      // Print a Log In message to the screen
      System.out.println(" The Result is " + result);
      
      if(result.equals("5")) {
         System.out.println(" The Result is Pass");
      } else {
         System.out.println(" The Result is Fail");
      }
   }
   
   @AfterTest
   public void terminatetest() {
      driver.close();
   }
}

执行

要执行,请右键单击创建的 XML 并选择“运行方式”>>“TestNG Suite”

SeleniumIDE 189

结果分析

输出被发送到控制台,如下所示。控制台输出还有执行摘要。

SeleniumIDE 114

TestNG 的结果也可以在不同的选项卡中看到。单击“HTML 报告视图”按钮,如下所示。

SeleniumIDE 115

HTML 结果将显示如下。

SeleniumIDE 117

Selenium - 网格

Selenium Grid 是一个将测试分布在多个物理机或虚拟机上的工具,以便我们可以并行(同时)执行脚本。它为我们提供快速、准确的反馈,极大地加快了跨浏览器和跨平台的测试过程。

Selenium Grid 允许我们并行执行 WebDriver 或 Selenium Remote Control 测试的多个实例,这些测试使用相同的代码库,因此代码不需要出现在它们执行的系统上。selenium-server-standalone 包包括 Hub、WebDriver 和 Selenium RC,用于在网格中执行脚本。

Selenium Grid 有一个集线器和一个节点。

  • 集线器- 集线器也可以理解为服务器,充当触发测试的中心点。Selenium Grid 只有一个 Hub,并且在一台机器上启动一次。

  • 节点- 节点是附加到执行测试的集线器的 Selenium 实例。网格中可以有一个或多个节点,这些节点可以是任何操作系统,并且可以包含任何 Selenium 支持的浏览器。

建筑学

下图展示了 Selenium Grid 的架构。

Selenium_ide_121

使用网格

为了与网格合作,我们需要遵循某些协议。下面是这个过程中涉及的主要步骤 -

  • 配置集线器
  • 配置节点
  • 开发脚本并准备 XML 文件
  • 测试执行
  • 结果分析

让我们详细讨论每个步骤。

配置集线器

步骤 1 - 从http://docs.seleniumhq.org/download/下载最新的 Selenium Server 独立 JAR 文件。单击版本即可下载,如下所示。

Selenium_ide_45

步骤 2 - 使用以下命令启动 Selenium 服务器来启动 Hub。现在我们将使用端口“4444”来启动集线器。

注意- 确保没有其他应用程序在端口# 4444 上运行。

java -jar selenium-server-standalone-2.25.0.jar -port 4444 -role hub -nodeTimeout 1000
Selenium_ide_122

步骤 3 - 现在打开浏览器并从集线器(您执行步骤#2 的系统)导航到 URL http://localhost:4444。

Selenium_ide_123

步骤 4 - 现在单击“控制台”链接,然后单击“查看配置”。集线器的配置将显示如下。截至目前,我们还没有任何节点,因此我们无法看到详细信息。

Selenium_ide_124

配置节点

步骤 1 - 登录到节点(您要执行脚本的位置)并将“selenium-server-standalone-2.42.2”放入文件夹中。我们需要在启动节点时指向 selenium-server-standalone JAR。

步骤 2 - 使用以下命令启动 FireFox 节点。

java -jar D:\JAR\selenium-server-standalone-2.42.2.jar
   -role node -hub http://10.30.217.157:4444/grid/register
   -browser browserName = firefox -port 5555

在哪里,

D:\JAR\selenium-server-standalone-2.42.2.jar = Selenium 服务器独立 Jar 文件的位置(在节点计算机上)

http://10.30.217.157:4444 = 集线器的 IP 地址,4444 是集线器的端口

browserName = firefox(用于指定节点上的浏览器名称的参数)

5555 = Firefox 节点启动并运行的端口。

Selenium_ide_125

步骤 3 - 执行命令后,返回集线器。导航到 URL - http://10.30.217.157:4444,集线器现在将显示附加到它的节点。

Selenium_ide_126

步骤 4 - 现在让我们启动 Internet Explorer 节点。为了启动 IE 节点,我们需要在节点计算机上下载 Internet Explorer 驱动程序。

步骤 5 - 要下载 Internet Explorer 驱动程序,请导航至http://docs.seleniumhq.org/download/并根据操作系统的体系结构下载适当的文件。下载后,解压 exe 文件并将其放入启动 IE 节点时必须引用的文件夹中。

Selenium_ide_131

步骤 6 - 使用以下命令启动 IE。

C:\>java -Dwebdriver.ie.driver = D:\IEDriverServer.exe
   -jar D:\JAR\selenium-server-standalone-2.42.2.jar
   -role webdriver -hub http://10.30.217.157:4444/grid/register
   -browser browserName = ie,platform = WINDOWS -port 5558

在哪里,

D:\IEDriverServer.exe = 下载的 IE 驱动程序的位置(在节点计算机上)

D:\JAR\selenium-server-standalone-2.42.2.jar = Selenium 服务器独立 Jar 文件的位置(在节点计算机上)

http://10.30.217.157:4444 = 集线器的 IP 地址,4444 是集线器的端口

browserName = ie(指定节点上浏览器名称的参数)

5558 = IE 节点启动并运行的端口。

Selenium_ide_127

步骤 7 - 执行命令后,返回集线器。导航到 URL - http://10.30.217.157:4444,集线器现在将显示附加到它的 IE 节点。

Selenium_ide_128

步骤 8 - 现在让我们启动 Chrome Node。为了启动 Chrome 节点,我们需要在节点计算机上下载 Chrome 驱动程序。

步骤 9 - 要下载 Chrome 驱动程序,请导航至http://docs.seleniumhq.org/download/,然后导航至第三方浏览器驱动程序区域并单击版本号“2.10”,如下所示。

Selenium_ide_132

步骤 10 - 根据您的操作系统类型下载驱动程序。我们将在Windows环境下执行它,因此我们将下载Windows Chrome驱动程序。下载后,解压 exe 文件并将其放置在启动 chrome 节点时必须引用的文件夹中。

Selenium_ide_133

步骤 11 - 使用以下命令启动 Chrome。

C:\>java -Dwebdriver.chrome.driver = D:\chromedriver.exe 
   -jar D:\JAR\selenium-server-standalone-2.42.2.jar 
   -role webdriver -hub  http://10.30.217.157:4444/grid/register 
   -browser browserName = chrome, platform = WINDOWS -port 5557

在哪里,

D:\chromedriver.exe = 下载的 chrome 驱动程序的位置(在节点计算机上)

D:\JAR\selenium-server-standalone-2.42.2.jar = Selenium 服务器独立 Jar 文件的位置(在节点计算机上)

http://10.30.217.157:4444 = 集线器的 IP 地址,4444 是集线器的端口

browserName = chrome(指定节点上浏览器名称的参数)

5557 = chrome 节点启动并运行的端口。

Selenium_ide_129

步骤 12 - 执行命令后,返回集线器。导航到 URL - http://10.30.217.157:4444,Hub 现在将显示附加到它的 chrome 节点。

Selenium_ide_130

开发脚本并准备 XML 文件

步骤 1 - 我们将使用 TestNG 开发测试。在下面的示例中,我们将使用远程 webDriver 启动每一个浏览器。它可以将它们的功能传递给驱动程序,以便驱动程序拥有在节点上执行的所有信息。

浏览器参数将从“XML”文件传递。

package TestNG;

import org.openqa.selenium.*;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import java.net.URL;
import java.util.concurrent.TimeUnit;
import java.net.MalformedURLException;

public class TestNGClass {
   public WebDriver driver;
   public String URL, Node;
   protected ThreadLocal<RemoteWebDriver> threadDriver = null;
   
   @Parameters("browser")
   @BeforeTest
   public void launchapp(String browser) throws MalformedURLException {
      String URL = "http://www.calculator.net";
      
      if (browser.equalsIgnoreCase("firefox")) {
         System.out.println(" Executing on FireFox");
         String Node = "http://10.112.66.52:5555/wd/hub";
         DesiredCapabilities cap = DesiredCapabilities.firefox();
         cap.setBrowserName("firefox");
         
         driver = new RemoteWebDriver(new URL(Node), cap);
         // Puts an Implicit wait, Will wait for 10 seconds before throwing exception
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         
         // Launch website
         driver.navigate().to(URL);
         driver.manage().window().maximize();
      } else if (browser.equalsIgnoreCase("chrome")) {
         System.out.println(" Executing on CHROME");
         DesiredCapabilities cap = DesiredCapabilities.chrome();
         cap.setBrowserName("chrome");
         String Node = "http://10.112.66.52:5557/wd/hub";
         driver = new RemoteWebDriver(new URL(Node), cap);
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         
         // Launch website
         driver.navigate().to(URL);
         driver.manage().window().maximize();
      } else if (browser.equalsIgnoreCase("ie")) {
         System.out.println(" Executing on IE");
         DesiredCapabilities cap = DesiredCapabilities.chrome();
         cap.setBrowserName("ie");
         String Node = "http://10.112.66.52:5558/wd/hub";
         driver = new RemoteWebDriver(new URL(Node), cap);
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         
         // Launch website
         driver.navigate().to(URL);
         driver.manage().window().maximize();
      } else {
         throw new IllegalArgumentException("The Browser Type is Undefined");
      }
   }
   
   @Test
   public void calculatepercent() {
      // Click on Math Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[3]/a")).click();     	
      
      // Click on Percent Calculators
      driver.findElement(By.xpath(".//*[@id = 'menu']/div[4]/div[3]/a")).click();
      
      // Enter value 10 in the first number of the percent Calculator
      driver.findElement(By.id("cpar1")).sendKeys("10");
      
      // Enter value 50 in the second number of the percent Calculator
      driver.findElement(By.id("cpar2")).sendKeys("50");
      
      // Click Calculate Button
      // driver.findElement(By.xpath(".//*[@id = 'content']/table/tbody/tr/td[2]/input")).click();
      // Get the Result Text based on its xpath
      String result =
         driver.findElement(By.xpath(".//*[@id = 'content']/p[2]/span/font/b")).getText();
      
      // Print a Log In message to the screen
      System.out.println(" The Result is " + result);
      
      if(result.equals("5")) {
         System.out.println(" The Result is Pass");
      } else {
         System.out.println(" The Result is Fail");
      }
   }
   
   @AfterTest
   public void closeBrowser() {
      driver.quit();
   }
}

步骤 2 - 将使用 XML 传递浏览器参数。在项目文件夹下创建一个 XML。

Selenium_ide_134

步骤 3 - 选择“文件”f