GEB

极佳的 Groovy 浏览器自动化。Web 测试屏幕抓取等等

7.0
最新发布
-
星标
-
分支
-
关注者

它是什么?

Geb 是一个浏览器自动化解决方案。

它将 WebDriver 的强大功能、jQuery 内容选择的优雅性、页面对象建模的健壮性以及 Groovy 语言的表达力结合在一起。

它可以用于脚本编写、抓取和一般自动化——或者同样可以通过与 SpockJUnitTestNG 等测试框架集成,作为功能/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 为流行的测试框架(如 SpockJUnitTestNGCucumber(通过 Cucumber JVM))提供集成模块

虽然 Geb 与所有这些框架都配合得很好,但它与 Spock 结合使用时尤其出色。Spock 是一个创新的测试框架,非常适合与 Geb 一起使用。使用 Spock + Geb 可以轻松地获得非常清晰、简洁且易于理解的测试规范。

Spock
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
    }
}
                            

构建系统集成

Geb 易于集成到任何构建系统中,并且提供了有关与以下构建/项目系统集成的的信息和示例