如何使用Selenium Ruby进行自动化测试?(附教程)

574 阅读18分钟

Selenium WebDriver是一个可以用来驱动浏览器的工具,它在网页上执行动作。它已经与selenium-webdriver项目捆绑在一起,使其易于被Ruby访问。它还包括驱动任何一种selenium-webdriver支持的浏览器的代码。

Ruby是一种编程语言,很适合用于网络自动化。Ruby是一个很好的选择,因为它的语法简洁,专注于内置库的集成,以及活跃的社区。 Ruby的另一个好处是,它也允许使用其他编程语言,如Java、Python等,以实现以任何其他框架编写的应用程序的自动化。因此,你可以使用Selenium Ruby来自动化你系统中的任何类型的应用程序,并在任何类型的测试环境中测试其结果。

在这个Selenium Ruby教程中,我们将看看如何使用Selenium Ruby进行自动化测试,并通过一些示例代码来演示这一技术。在这篇文章结束时,你应该对Selenium Ruby的工作原理和作用有一个很好的了解。此外,你还将了解从哪里开始用基于Selenium的框架编写自己的测试,以及如何在云Selenium网格上运行测试。

目录

什么是Selenium?

Selenium是一个基于浏览器的测试框架,允许人们将用户的操作和与网络应用的互动自动化。你可以使用Selenium WebDriver APIs来设计测试代码,使用Selenium支持的语言如Ruby、Java、JavaScript、C#和Python。

Selenium和Ruby可以一起使用,其中一个最好的方法是通过使用一个叫做selenium-webdriver的宝石。有了这个宝石,你可以轻松地使用其他Ruby支持的框架来自动化你的测试案例--我们将在下面介绍这些框架。在我们的例子中,我们将使用Ruby on Selenium,但你也可以使用你喜欢的语言与Selenium进行自动化。

Selenium是一个强大的工具,因为它支持大多数主要的网络浏览器,并支持几乎所有的操作系统平台--Windows、Linux和Mac。Selenium可以用来建立自动化和手动测试案例。

因此,让我们开始用Selenium Ruby进行自动化测试

Ruby中的Selenium WebDriver是如何工作的?

Selenium WebDriver是一个Gem,它包装了WebDriver服务器,使其更容易驱动浏览器。WebDriver是一个可以控制网络浏览器的程序。

Selenium WebDriver用于驱动浏览器并对网页进行操作。这个工具与selenium-webdriver项目捆绑在一起,它由一个Ruby Gem组成,以确保它能被Ruby轻松消费。它还包括驱动Selenium所支持的任何一种浏览器的代码,如Firefox、Chrome、Safari、Opera和Internet Explorer。

如果你想了解更多关于Selenium Selenium WebDriver的信息,你可以阅读这个Selenium WebDriver教程。

还有其他几个用于Ruby自动化测试的Ruby Gems,如Capybara,它运行在Selenium之上;然而我们将在本博客中讨论Selenium。

安装Selenium WebDriver

你可以通过两种常见的方式安装Selenium WebDriver。

  • 使用Gemfile

由于它是以Gem的形式存在的,你也可以使用Gemfile来安装它,如下面所示。

gem 'selenium-webdriver', '>= 3.142.7'

然后在你的终端上运行bundle install

  • 通过Gem安装

你也可以通过在终端上以命令形式运行它来安装它。只需运行。

gem install selenium-webdriver

如何在Ruby中使用Selenium?

在Ruby中,你可以通过实例化一个对象或启动一个会话来创建WebDriver类的实例。实例化的对象会返回WebDriver的一个会话对象。

为了用会话对象实例化一个驱动程序,我们需要做以下工作

@my_driver = Selenium::WebDriver.for :firefox

@my_driver此时有一个Firefox的实例。有了会话对象,我们现在可以执行某些命令。让我们尝试一些。

基本的Selenium Ruby方法

  1. 选择元素
  • @my_driver.find_element(:name, "elementName") - 通过其名称选择一个元素。
  • @my_driver.find_element(:id, "textBox1") - 所选元素的ID为textBox1。
  1. 复选框
  • @my_driver.get(1).is_checked? - 如果复选框被选中,返回true。否则为假。
  1. 单选按钮
  • @my_driver.find_element(:name, "radio2").click- 选择一个单选按钮,然后点击它,以便选择它。
  1. 下拉列表
  • @my_driver.find_element(:name, "dropdown1").click - 选择一个下拉菜单,然后点击它以选择它。
  1. 提交按钮
  • @my_driver.find_element(:name, "submit").click- 选择一个提交按钮,然后点击它以选择它。
  1. 表格元素
  • text_box = @my_driver.find_element(:name, "textBox1")- 通过其名称选择元素 "textBox1"。
  • text_box.send_keys("hello") - 输入单词 "hello"。
  1. 窗口
  • @my_driver.execute_script('window.open()')- 这将打开一个新窗口。
  • @my_driver.quit_now- 立即关闭当前的浏览器窗口。
  1. 超时
  • @my_driver.implicitly_wait(0)- 这是在没有指定时间的情况下等待元素。
  • @my_driver.implicitly_wait(30)- 这是等待30秒来加载一个元素,例如,窗口/框架,等等。
  • @my_driver.implicitly_wait(10, TimeUnit::SECONDS)- 这是为了等待10秒内的元素,而TimeUnit::SECONDS是Ruby自带的一个类。

这些只是其中的几个。还有更多的方法和参数,你可以使用Selenium Ruby来开发你的自动测试。我将在这个Selenium Ruby教程系列的后续博客中介绍这些。

你可以使用任何与Selenium兼容的库轻松地编写Selenium Ruby测试。我们将使用Test::Unit框架在Ruby中实现一个简单的Selenium自动化测试。

对于希望将自己的Ruby技能提升到新水平的开发者或测试人员来说,LambdaTest的这个Selenium Ruby 101认证可以满足你的需要。

下面是LambdaTest的Selenium Ruby 101认证的一个简短介绍。

如何使用Test::Unit运行Selenium测试?

在这篇关于Selenium Ruby的文章中,我们将学习如何使用最流行的Ruby框架之一Test::Unit来运行Selenium测试。在开始之前,让我们了解更多关于Test::Unit框架的信息。

什么是Test::Unit?

Test::Unit是Ruby的一个基本单元测试框架。Test::Unit最初被设计用来测试Ruby标准库,后来扩展到几乎所有的标准Ruby类和模块。

Test::Unit对测试使用子类,这样你就可以对你的测试类使用继承性。一个测试类最基本的骨架如下图所示。

一个Selenium脚本是一个Ruby类,它继承了Ruby库 "Builder "的代码,包含了实现你的测试计划的方法。

前提条件

  1. 红宝石

我正在使用Ruby 3.0.3和Selenium WebDriver 4.1.0。如果你使用的是旧版本的Ruby或Selenium WebDriver,你可以通过打开终端并输入以下内容来检查Ruby版本。

ruby -v

你应该能看到与下面类似或接近的结果。

Ruby version

***注意:*如果你没有安装Ruby,你可以从Ruby官方文档中下载Ruby。你可以使用旧版本的Selenium和Ruby--不过,可能有一些小的变化需要注意。

  1. Selenium WebDriver

首先,通过在终端键入以下内容来检查你是否安装了Selenium WebDriver。

gem list selenium-webdriver

在我的例子中,你可以看到我已经在本地安装了Selenium WebDriver(4.1.0)。

SeleniumWebDriver Version

  1. 浏览器

在这个例子中,我们将使用Firefox。其他支持并可用于测试的浏览器包括Chrome、Microsoft Edge和Opera。

  1. 集成开发环境

我们将使用Visual Studio Code,但你也可以使用你选择的IDE。其他流行的文本编辑器包括RubyMine, Sublime, Atom等。

在3000多个浏览器上运行Selenium Ruby测试。现在就试试LambdaTest吧

示范:用Selenium Ruby进行自动化测试

假设你有一个电子商务网站,我们有一组测试用于演示目的。

问题情景

我们首先要定义我们想要覆盖的测试案例。一个测试用例基本上是对一组预期行为的定义,以及我们期望测试的预期输出。

测试用例

测试描述测试步骤预期结果
测试你能到达主页。访问基础页面并断言主页已被加载。主页应该加载该页面。
测试你可以在过滤框中过滤一个项目。访问基本页面,在搜索框中搜索一个项目,并断言搜索过滤器页面已经加载。预期的搜索过滤器页面应该加载。

实施

代码

代码演练

在我们的类的顶部,我们定义了测试案例的名称。然后我们定义一个变量,用来覆盖WebDriver的一个方法(驱动程序)。这就是我们创建WebDriver实例并将其传递给Selenium类的地方,我们从Test::Unit::TestCase继承。

Selenium Ruby Automatton - Define a Variable Used

接下来,你需要设置Selenium服务器。这一步与其他测试框架类似,涉及安装Selenium服务器。它可以通过包括Selenium Gem来完成。

Automation with Selenium Ruby- Set up the Selenium Server

在EcommerceTests类中,我们首先定义了一个新的空白测试案例,它继承了Test::Unit::TestCase类。

EcommerceTests class

然后我们初始化我们的变量,在其中我们定义了要访问的URL和期望的内容。

这时我们创建一个Selenium::WebDriver的实例,并用@my_driver的名字把它传给我们的类。

然后我们使用Selenium::WebDriver的get方法调用baseUrl方法,该方法返回一个URL,本例中是ecommerce-playground.lambdatest.com。

baseUrl method

在页面完全加载后,我们根据搜索框元素的名称搜索它,并使用断言进行第一次测试。

这也适用于第二个断言,我们为过滤的项目元素添加assert_equal。

结束浏览器会话

拆分方法是Selenium WebDriver实现的一种方法,用于终止浏览器会话或运行需要在测试运行结束时完成的方法。这一点很重要,因为浏览器会话的数量受驱动实现的限制。

如果在所有旧会话的撕裂方法被执行之前调用撕裂方法,那么撕裂方法将被丢弃。如果两个或更多的拆解方法同时被调用,只有一个会被执行,而其他的会被丢弃。

在这个方法中,我们调用@my_driver.quit,以终止浏览器会话。

这里我们要终止三个浏览器会话。这可以在第57行显示:关闭的浏览器会话。

Ending the browser session

执行

运行该脚本后,我们应该观察到以下情况。

Execution

正如你所看到的,我们有两个断言通过,有0个错误和0个失败。

什么是Selenium Ruby中的断言?

测试断言是我们可以测试的关键代码的一个点。通常,断言被用来验证一些条件,但它们也可以用来验证某些值。

  • assert_true用来测试一个条件是否为真,而assert_match用来验证一个值。
  • assert**_match**用于验证一个值。例如,我们可以给一个变量分配一个整数值,将其递增1,然后使用assert_match断言来验证其值是否等于初始状态的值。
  • assert_not_find是用来验证一个查找操作没有找到任何东西。它对测试查找操作是否正常工作特别有用,但我们不能测试它,因为它可能对某些值失败。
  • assert_exception方法用于验证一个测试案例中的失败。如果失败发生,Exception对象将被抛出,并在断言中给出消息。当检查这个方法时,我们也应该确保所有预期的异常类都存在。
  • assert_not_send是用来查询一个函数调用没有启动。在这个断言中,我们检查所调用的函数没有被作为参数发送。一旦执行查找操作而没有找到任何东西,将抛出一个异常。为了检查预期的异常是否存在,我们可以使用 expect_exception 方法。
  • assert_no_error指定在你的测试用例中应呈现指定数量的错误或不产生任何错误。一旦在你的Selenium WebDriver测试用例中显示了一个错误,当它在同一测试用例的另一个实例中再次出现时,这个异常将被assert no error条件所忽略。
  • assert_raise 是用来断言代码会引发一个特定的异常。

这些只是我们在Ruby Test::Unit中可以使用的几个断言,但还有很多,你可以查看一下。

当测试失败时会发生什么?

如果我们的断言失败了,我们会得到一个非常描述性的错误信息,告诉我们到底哪里出了问题。它甚至会指出在我们的测试文件中发生这种情况的确切行。

此外,失败也会告诉我们什么地方出错了,以及其他东西是否按预期工作。它还会提供自测试运行开始以来调用的所有方法的堆栈跟踪,所以我们可以通过查看它们的调用堆栈来找出哪个方法失败。

让我们看看下面这个失败的例子。

作为一个例子,让我们在上面的例子中改变一个断言,使其具有不同的值,这样我们就可以期待一个失败。

注意:在第22行,我们的新断言现在读作 "Nothing Here",而不是 "Your Store" - 因此,我们正在设置我们的测试失败。

when the test fails

在运行时,我们得到以下结果。

Running Selenium Ruby Test

解释失败的原因

在第23行我们可以看到:有一个失败,用鲜红的颜色表示,在它下面,我们看到是预期字符串和实际字符串之间的不匹配。

我们可以在脚本的结尾处进一步看到失败的总结。

在云网格上运行Selenium Ruby测试

许多Selenium云网格服务被提供。然而,对于用户来说,要选择一个最好的服务并不容易。这里列出了人们在选择任何特定服务之前应该考虑的一些主要事项。

  • 支持跨浏览器测试- 对于跨浏览器测试,你需要有一个可以使用任何最新和传统浏览器的网格。你还应该检查任何特定的云解决方案所支持的浏览器和浏览器版本的列表。
  • 保证质量- 用户应该检查云解决方案的评论和评级,以了解它们是否运行良好。为了保证质量,他们还应该检查他们是否与有经验的工作人员一起工作,因为有经验的人比没有经验的人更能保证测试质量。
  • 支持并行测试执行- 要做并行测试,用户应该能够选择任何数量的浏览器,他们可以同时运行。在云网格解决方案的情况下,你会得到许多选项,如设置平行的实例数量或选择一个特定的云,可以快速创建实例。你可以根据自己的需要设置平行数,以同时用多个浏览器测试你的产品。
  • 在分布式环境中运行- 为了在分布式环境中运行这种工作,用户应该有能力选择任何数量的服务器,这些服务器将用于在该特定服务器上运行测试。他们应该能够将他们的脚本部署在多个服务器上,以便进行分布式测试。
  • 易于使用且不复杂- 使用简单易行的解决方案。任何用户都应该能够毫无困难地使用该解决方案。他们应该避免选择任何复杂的服务,因为这可能给他们带来很多问题。
  • 日志- 应该容易被用户看到和阅读。它还应该存储大量的用户日志
  • 报告 - 用户应该做自动报告,以便跟踪他们。他们应该能够使报告自动化。用户应该能够通过使其自动化看到很多关于他们工作的信息。
  • 可扩展性- 他们的云网格应该有很多实例,你可以根据你的要求添加和删除。实例的数量也应该是可扩展的,如果需要,你可以为你的网格增加更多的容量,如果不再需要,就关闭实例。
  • 安全和效率 - 一个好的云解决方案供应商将有一个坚实的安全系统,以保护他们的用户的数据。这可能包括安全登录、防火墙、加密的数据存储和使用SSL和类似协议的安全交易。一个全职的安全团队将被分配来监控任何黑客攻击或滥用数据的迹象。

基于云的自动化浏览器测试平台,如LambdaTest,允许你使用不同的测试框架运行你的脚本,例如 - Selenium、Cypress、Playwright、Puppeteer、Appium等,并同时在多个浏览器中执行 - 按需使用各种设备。

像LambdaTest这样的自动化测试工具提供了一个由超过3000台运行真实操作系统的真实设备组成的在线设备场,可以大规模地进行Selenium Ruby测试。下面是LambdaTest在线Selenium网格的一瞥。

您还可以订阅LambdaTest的YouTube频道,了解围绕Selenium测试Cypress E2E测试、CI/CD等的最新教程。

如何在LambdaTest上运行Selenium Ruby测试?

在LambdaTest上运行你的Selenium Ruby测试是非常快速和简单的。按照下面提到的步骤开始吧。

  1. 在LambdaTest登录/注册
  2. 通过选择Automation选项并点击右上角的Access Key来获得你的LambdaTest凭证。

Run Selenium Ruby Tests

  1. 使用LambdaTest期望能力生成器来生成期望能力。

    Desired Capabilities Generator

    请确保选择Ruby,因为我们在这个例子中使用Ruby。我们将使用目前选择的基本配置,并在另一个教程中讨论其他设置。

  2. 在环境变量中导出你的用户名和访问密钥。

For Linux/macOS: 
export LAMDATEST_USERNAME="YOUR_USERNAME"
export LAMDATEST_ACCESS_KEY="YOUR ACCESS KEY"

For Windows: set LT_USERNAME="YOUR_USERNAME"
set LT_ACCESS_KEY="YOUR ACCESS KEY"

修改代码以在LambdaTest上运行测试

为了在LambdaTest上运行你的测试,你需要用RemoteWebdriver代替你的远程本地Webdriver。

因此,我们的新变化应该如下面的代码所定义。

注意:记得把你的LAMBDATEST_USERNAMELAMBDATEST_ACCESS_KEY换成你在LambdaTest上注册后获得的。

LambdaTest上的测试结果

正如你所看到的,结果在左边的标签上运行,并将最新的运行结果放在顶部,如下图所示。

我们现在点击最新版本的Build,我们现在看到这个的测试结果。

评估LambdaTest仪表板上运行的结果

Evaluating Selenium Ruby Test Results

在这里,你可以看到左边的一个视频--它显示了在LambdaTest仪表板上运行的测试结果。

在这个视图中,你可以检查你的脚本是否通过了所有的执行,你还可以检查一些与你的测试实例相关的参数,如:执行状态、浏览器视图、浏览器版本、设备类型、设备能力等。

  • 所有命令标签- 这显示了测试脚本所执行的所有命令。
  • Selenium Logs Tab- 这显示了WebDriver的日志,如配置、能力等,如下图所示。

Evaluating the Results Run

在Selenium Ruby仪表盘中,你还会看到一些视图和标签,显示关于你的测试脚本的全部执行过程的更多细节。

你可以导航到LambdaTest分析仪表板,查看你的测试性能。从测试摘要部分,你可以看到通过或失败的测试总数,从测试概述部分,你可以看到一致测试的快照。

LambdaTest Analytics Dashboard

你还会注意到,有一些选项可以运行并行测试--这将有助于你通过并行运行测试并在此过程中使用不同的配置来节省时间,这一点可以在另一篇文章中介绍。

总结

像Java和Python一样,Ruby是一种通用的编程语言;然而,它专注于简单性、精确性和生产力。作为一种基于数组的语言,Ruby在特定的用途上非常强大,在处理有序的数据集时效果特别好。此外,由于Ruby具有较短的学习曲线,并能为你所需要的测试自动化提供专门的工具,因此它是许多开发人员的首选。

在这个Selenium Ruby教程中,我们已经看到Selenium Ruby如何通过代码实例用于自动化测试。现在,你一定能自如地编写自己的Selenium Ruby测试,并在LambdaTest这样的云Selenium网格上运行它们。

常见问题(FAQ)

Selenium支持Ruby吗?

是的,Selenium支持广泛的编程语言,包括C#、Java、JavaScript、PHP、Python和Ruby。

什么是selenium WebDriver Ruby?

Selenium WebDriver是一个可以用来驱动浏览器的工具,它在网页上执行动作。它已经与selenium-webdriver项目捆绑在一起,使其易于被Ruby访问。它还包括驱动任何一种selenium-webdriver支持的浏览器的代码。这可能是Firefox、Chrome、Safari、Opera和Internet explorer。