在Geb测试中,我想在浏览器的历史记录中导航回来(即点击浏览器的后退按钮).我还没有找到使用Geb API的方法.
我所做的是:
driver.navigate().back() // usage of WebDriver API
browser.page(<<previous Page class>>) // this tells Geb that the page has changed
Run Code Online (Sandbox Code Playgroud)
代码有效,但我不喜欢这里使用WebDriver API.另一个想法是用JavaScript做,但这也是我想避免的.
是否有更多的Gebish方式在浏览器的历史中导航?
使用GEB我使用页面对象模式静态封装有关不同页面的信息.
然后,我重构了我的GEB代码,以便从一个单独的类中使用,因此我可以使用方法调用封装常用命令.
例如,我将有一个方法login(),它将调用相应的GEB代码登录我正在测试的网站.然后我会在TestHelper类上使用方法调用来使用其他常用函数.
我想将这些常用功能移动到他们所采用的页面上.例如,搜索页面将具有搜索方法,登录页面将具有登录方法.通过这种方式,我可以构建一个页面库,其中包含所有常用功能,以便在多个GEB项目中使用.现在要做到这一点,每个页面必须在geb.Browser上有一个句柄,因此我现在必须在测试设置中实例化每个页面.通过这样做,我不再能够使用标准页面对象模式.
to ReviewQueuePage
assert at(ReviewQueuePage)
Run Code Online (Sandbox Code Playgroud)
上面的代码将抛出一个空指针,因为对象不再能够以静态方式访问,这意味着我必须将代码更改为
go ReviewQueuePage.url
Run Code Online (Sandbox Code Playgroud)
这将删除将该类用作页面的所有功能.
有没有人有任何解决方案来封装每个页面的数据,因为它不会导致页面采取不同的行为.
我想我需要在GebSpec测试中刷新hibernate会话,所以我想得到sessionFactory.
它看起来应该注入,但当我做这样的事情: -
class MySpec extends GebSpec {
def sessionFactory
...
def "test session"(){
....do some setup
then:
assert sessionFactory != null
}
Run Code Online (Sandbox Code Playgroud)
它失败,sessionFactory为null.
在我的grails应用程序中,我使用Spock和Geb来执行功能测试.
由于所有测试都在同一个数据库上运行,因此我想提供正在执行CRUDSpec类的顺序.如何指定?
例
我正在进行测试geb,但我遇到了问题.我需要保存/打印当前页面的地址(功能SaveUrl()).
Spock测试:
class TestSpec extends GebReportingSpec {
def "Google"() {
given: "go to google.com"
to GooglePage
when: "we at Google home page"
at GooglePage
then: "Search Yahoo"
Search("Yahoo")
SaveUrl()
}
}
Run Code Online (Sandbox Code Playgroud)
GooglePage:
class GooglePage extends Page {
static url = "http://www.google.by"
static at = { $("title").text() == "Google"}
static content = {
theModule { module SearchModule }
}
def Search(String arg0) {
theModule.field.value(arg0)
theModule.search.click()
}
def SaveUrl() {
// need implement
}
}
Run Code Online (Sandbox Code Playgroud)
Modile:
class SearchModule …Run Code Online (Sandbox Code Playgroud) 我有点新的整个Selenium/ Geb事情,所以我可能会对此有点不对劲,但我试图让exists()下面的代码方法才能正常工作.
class Question extends Module {
static base = { $("fieldset") }
static content = {
input { $("input[type=text]") }
name { input.getAttribute("name").toString() }
}
boolean exists() {
return input.isPresent()
}
Run Code Online (Sandbox Code Playgroud)
令人沮丧的是,当我尝试执行该代码时(从Spock测试中,"转到"包含此模块的PageObjectm,我得到以下内容:
所需的页面内容'输入 - SimplePageContent(所有者:问题 - 问题(所有者:MyPage,args:[],值:null),args:[],值:null)'不存在
我尝试了很多其他的东西,包括:
if (input) return true; return false, ... input.size() == 0, static at = {...}(似乎不支持模块"有任何想法吗
有没有办法在测试之间等待一段时间?我需要一个解决方案来弥补服务器滞后.创建记录时,在我的环境中可以搜索记录之前需要一点时间.
在下面的代码示例中,如何在第一次测试和第二次测试之间等待30秒,并且在第二次测试和第三次测试之间没有等待时间?
class MySpec extends GebReportingSpec {
// First Test
def "should create a record named myRecord"() {
given:
to CreateRecordsPage
when:
name_field = "myRecord"
and:
saveButton.click()
then:
at IndexPage
}
// Second Test
def "should find record named myRecord"() {
given:
to SearchPage
when:
search_query = "myRecord"
and:
searchButton.click()
then:
// haven't figured this part out yet, but would look for "myRecord" on the results page
}
// Third Test
def "should delete the record named myRecord"() {
// …Run Code Online (Sandbox Code Playgroud) 根据"Book of Geb",我开始绘制门户网站的网页.我更喜欢使用静态内容闭包块中定义的变量,然后在页面方法中访问它们:
static content = {
buttonSend { $("input", type: "submit", nicetitle: "Senden") }
}
def sendLetter() {
waitFor { buttonSend.isDisplayed() }
buttonSend.click()
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,有时候我会得到Geb等待超时异常(60秒后),甚至更糟糕的是我收到了众所周知的"StaleElementReferenceException".
使用"isEnabled"代替"isDisplayed"时可以避免等待超时,但对于"StaleElementReferenceException",我只能应用以下解决方案:
def sendLetter() {
waitFor { buttonSend.isEnabled() }
try {
buttonSend.click()
} catch (StaleElementReferenceException e) {
log.info(e.getMessage())
buttonSend.click()
}
}
Run Code Online (Sandbox Code Playgroud)
我想,这个解决方案并不是很好,但我无法应用另一篇文章中描述的明确等待.因此,我有一些一般性的问题:
我希望每一个有助于理解或解决这个问题的提示.最好的方法是拥有一个简单的代码示例,因为我还是初学者.谢谢!
假设我有登录的多个Geb/Spock测试.例如:
@Stepwise
Class AddNewPictureSpec extends GebSpec {
def "User at login page"() {
given: "User beings from login page"
to LoginPage
}
def "User gets redirected to Main page"() {
given: "User at Login page"
at LoginPage
when: "User signs in"
signIn "username", "pw"
to MainPage
then:
at MainPage
def "other test sequences follow...."() {
}
}
Run Code Online (Sandbox Code Playgroud)
另一个测试规范具有完全相同的启动顺序:
@Stepwise
Class EditPictureSpec extends GebSpec {
def "User at login page"() {
given: "User beings from login page"
to LoginPage
}
def …Run Code Online (Sandbox Code Playgroud) 我一直在Grails上用Geb弄湿了,但是没有很多关于它如何表现的文档.例如,geb如何处理回滚?根据我的观察,它运行应用程序并在浏览器上运行测试,而不会在测试之间关闭它.
当一个规范(规范A)改变一个对象(对象Z)时,数据库数据会发生什么,稍后一些测试,另一个规范(规范B)改变同一个对象?每次运行规范时,geb是否将数据库回滚到它的处女状态?我正在努力确认,因为我有单独执行时运行良好的geb测试,但是当我将它们作为套件运行时,其中一些失败了,我能想出的最好的理由是数据不是原始状态当对它进行第二次测试时.有什么想法吗?