极佳的 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
}
}