ScalaTest + Selenium 集成测试

在 Play 1 和 Play 2 中都内置了 Selenium 集成测试工具, 这里自己尝试自己单独测试用 ScalaTest + Selenium 来做简单的集成测试. Selenium 可以支持内置的无界面 Java 实现的浏览器, 也可以用外部浏览器, 如 Safari, Firefox, Chrome, IE, Opera 或移动设备的浏览器. 使用不同外部浏览的方式或用插件(Safari/Firefox 等) 或是像借助于 Chromium 来驾驭 Chrome 浏览器.

而我们这里要用的 ScalaTest 2.2.6 在包 org.scalatest.selenium 有以下几个特质 Chrome, Driver, Firefox, HtmlUnit, InternetExplorer, Page, Safari 和  WebBrowser. 由此可以看出 ScalaTest 默认支持的浏览器. 若单论 Selenium 本身, 它可强大的暂时超乎我的想像, 可以自建服务器, 选择浏览器分发测试任务. 我们知道使用 Selenium 的好处是不光可以像通常那样断言页面静态文本, 还能执行 Javascript 脚本, 所以可断言动态内容.

本人开发环境为 Mac OS, 可以成功让 Selenium 测试跑在内置 Java 浏览器, 和外置的  Safari, Chrome 浏览器中, Firefox 的插件未安装成功.

让事实说话, 仍然让一个最简单的例子自己说话, 创建的是一个 sbt 项目, 尽量把目录最简化, 只有 build.sbt 文件和 test/IntegrationTest.scala 测试代码, 内容分别为

build.sbt

libraryDependencies ++= Seq(
    "org.scalatest" %% "scalatest" % "2.2.6" % "test",
    "org.seleniumhq.selenium" % "selenium-java" % "2.35.0" % "test"
)

scalaSource in Test := baseDirectory.value / "test"

上面引入了必须的 scalatest 和 selenium-java 包, 并且只关心 Scala 测试代码在 test 目录中, 其他目录随意.

test/IntegrationTest.scala

import java.util.concurrent.TimeUnit

import org.openqa.selenium.By
import org.scalatest.selenium._
import org.scalatest.{BeforeAndAfterAll, FlatSpec, ShouldMatchers}

class IntegrationTest extends FlatSpec with ShouldMatchers with Chrome with BeforeAndAfterAll {

  override def afterAll() {
    webDriver.quit()
  }

  "Short google url" should "redirect to www subdomain" in {
     go to "http://google.com"
     currentUrl should startWith ("https://www.google.com/")
  }

  "My Blog pages" should "have different titles" in {
    go to "http://unmi.cc"
    webDriver.getTitle should equal("隔叶黄莺 Unmi Blog - 软件编程实践")
    webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS)
    webDriver.findElement(By.partialLinkText("一样的目录布局")).click()
    webDriver.getTitle should include("建立 Play 2 框架一样的目录布局")
  }

  it should "contain archive dropdown list" in {
    go to "http://unmi.cc"
    find(xpath("//select[@name='archive-dropdown']")).isDefined shouldBe true 
  }
}

上面 with Chrome 部分想用什么浏览器就 with 什么, 当然是从 ScalaTest 已支持的 Firefox, InternetExplorer, Safari, HtmlUnit 中选. HtmlUnit 的功能很弱, 就是用它来跑上面的代码都有问题, 因我的博客中还是很多的 Javascript, 还有 Ajax 的请求.

我们这里来测试外部的  Chrome 和  Safari

Chrome 中跑 Selenium 测试

如果直接 sbt test 跑上面的测试, 将会收到消息

[info] Exception encountered when attempting to run a suite with class name: org.scalatest.DeferredAbortedSuite *** ABORTED ***
[info]   java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see http://code.google.com/p/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://code.google.com/p/chromedriver/downloads/list

它告诉我们要下载 ChromeDriver 并用 webdriver.chrome.driver 系统属性指定 ChromeDriver. 可以从这个页面 https://sites.google.com/a/chromium.org/chromedriver/ 找到当前最新版 chromedriver_mac32.zip 下载, 居然还只是 32 位的, 下载后假设解压在 /opt/chromedriver 目录, 那么就可以用 sbt -Dwebdriver.chrome.driver=/opt/chromedriver test 运行上面的测试.

执行效果这里用一个视频展示出来, 为方便更多的国内的同学观看还是把视频放在了 Youku 上, 如果你是肉身在外的话可以直接访问这个 Youtube 上的 chrome selenium 视频.

命令行信息如下

➜  ✗ sbt -Dwebdriver.chrome.driver=/Users/uqiu/Downloads/chromedriver
[info] Set current project to test_selenium (in build file:/Users/uqiu/Workspaces/test_selenium/)
> test
Starting ChromeDriver 2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4) on port 15045
Only local connections are allowed.
[info] IntegrationTest:
[info] Short google url
[info] - should redirect to www subdomain
[info] My Blog pages
[info] - should have different titles
[info] - should contain archive dropdown list
[info] Run completed in 12 seconds, 253 milliseconds.
[info] Total number of tests run: 3
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 3, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 13 s, completed Apr 20, 2016 1:41:32 AM

Safari 上跑 Selenium 测试

把前面代码的  with Chrome 部分改为 with Safari 尝试跑一下测试, 如果 Safari 尚未安装相应的扩展的话, 能看到它打开一个 Safari 浏览器, 但无法通信

Safari_Selenium

因为需要给 Safari 安装 WebDriver 扩展, 也可以从这个页面 http://www.seleniumhq.org/download/ 找到当前版本的下载链接 http://selenium-release.storage.googleapis.com/2.48/SafariDriver.safariextz, 下载后打开即关联用 Safari 来安装. 并提示该扩展非经官方, 是否信任

Safari_trust_extention

这里可能要点技巧了, 如果直接用鼠标点击 Trust 按钮可能什么也不会发生, 可以试用用 Tab 聚焦到 Trust 按钮, 然后按空格来信任, 安装好后就像我的 Safari 扩展里会显示出 WebDriver 了.

再次执行下 sbt 的 test 就能看到像操作  Chrome 那样打开 Safari 测试完后关闭, 执行结果未必和使用 Chrome 是一样的, 因为浏览器的行为是有差异, 也是为什么我们需要选择多种浏览器进行集成测试的原因.

另外尝试安装 Firefox 的  Selenium IDE 插件未能成功, 在 Firefox 为未验证的插件, 被强迫禁用. 不知为何这种类型的 Firefox 插件都不能发布到 Firefox 的官方插件库中. 应该可以尝试打开 Firefox

再其他就是 Selenium 的 API 的使用技巧了, 如何操作事件, 输入, 定位元素等. 而且 Selenium 还有截屏的功能, 或把访问数据保存, 甚至是可以把整个测试过程录制下来.

类别: Scala. 标签: , , . 阅读(61). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz