极佳的 Groovy 浏览器自动化。Web 测试、屏幕抓取等等
Geb 是一个浏览器自动化解决方案。
它将 WebDriver 的强大功能、jQuery 内容选择的优雅性、页面对象建模的健壮性以及 Groovy 语言的表达力结合在一起。
它可以用于脚本编写、抓取和一般自动化——或者同样可以通过与 Spock、JUnit 和 TestNG 等测试框架集成,作为功能/Web/验收测试解决方案。
Geb 之书包含了您开始使用 Geb 所需的所有信息。
这是一个简单的 Geb 脚本,用于登录网站的管理部分,它可能看起来像这样……
这就是所谓的 Geb 脚本风格,它非常适合快速自动化。
import geb.Browser Browser.drive { go "http://myapp.com/login" assert $("h1").text() == "Please Login" $("form.login").with { username = "admin" password = "password" login().click() } assert $("h1").text() == "Admin Section" }
Geb 利用 WebDriver 库进行浏览器自动化。这意味着 Geb 可以与 WebDriver 支持的任何浏览器一起工作,并且 WebDriver 支持的浏览器列表一直在增长。
目前支持的浏览器有
WebDriver 还支持远程驱动程序。这允许您自动化在另一台机器上运行的浏览器!这意味着您可以轻松地在 Mac 或 Linux 机器上运行您的测试套件,以对抗 IE 浏览器(反之亦然)。
您还可以使用无头、进程内、Java 浏览器模拟器 HTMLUnit 与 WebDriver。
Geb 从 jQuery 中汲取灵感,提供了一种简洁有效的方式来获取内容。这被称为导航器 API。
美元函数可以在任何地方使用,根据 CSS 选择器、属性匹配器和/或索引选择内容。
// CSS 3 selectors $("div.some-class p:first[title='something']") // Find via index and/or attribute matching $("h1", 2, class: "heading") $("p", name: "description") $("ul.things li", 2) // 'text' is special attribute for the element text content $("h1", text: "All about Geb") // Use builtin matchers and regular expressions $("p", text: contains("Geb")) $("input", value: ~/\d{3,}-\d{3,}-\d{3,}/) // Chaining $("div").find(".b") $("div").filter(".c").parents() $("p.c").siblings()
Geb 具有方便的快捷方式,用于读取和写入表单控件值。
assert $("form").name == "Jeb" $("form").name = "Geb" assert $("form").name == "Geb"
现代网页充满了异步操作,例如 AJAX 请求和动画。Geb 为这种现实提供了内置支持。
任何内容查找或操作都可以封装在 waitFor
子句中。
waitFor { $("p.status").text() == "Async operation complete!" }
这将在一定时间内(可配置)持续测试条件,直到它通过。
同样的技术也可以用来仅仅等待内容,而不一定是等待内容具有某种特征。def dynamicParagraph = waitFor { $("p.dynamically-added") } dynamicParagraph.text() == "Added dynamically!"
您还可以定义在页面对象的内容 DSL 中应隐式等待内容
有了这个定义,当请求 dynamicParagraph
时,Geb 将隐式等待一段时间让它出现。
import geb.Page class DynamicPage extends Page { static content = { dynamicParagraph(wait: true) { $("p.dynamically-added") } } }
Geb 为流行的测试框架(如 Spock、JUnit、TestNG 和 Cucumber(通过 Cucumber JVM))提供集成模块
虽然 Geb 与所有这些框架都配合得很好,但它与 Spock 结合使用时尤其出色。Spock 是一个创新的测试框架,非常适合与 Geb 一起使用。使用 Spock + Geb 可以轻松地获得非常清晰、简洁且易于理解的测试规范。
import geb.Page import geb.spock.GebSpec class LoginSpec extends GebSpec { def "login to admin section"() { given: to LoginPage when: loginForm.with { username = "admin" password = "password" } and: loginButton.click() then: at AdminPage } }