Geb 是一个很好的测试 Web 应用程序的框架,因为它非常直接地支持检查浏览客户端所看到的特定 DOM 元素。但是,有时请求的预期结果是纯文本(或 csv、json 等)。
有什么方法可以获取结果的原始文本吗?我还可以获得响应代码(例如 200)和内容类型吗?
在其他一些测试框架中,我习惯于标记测试,例如@really_slow、@front_end
然后运行不同批次的测试,就像我可能想要设置一个构建从站来运行所有 real_slow 测试,并且可能想要运行标记为前端的所有测试,但没有一个被标记为非常慢。
目前,要在 grails 中运行 spock+geb 测试,我只需运行 grails test-app function:
我如何告诉它运行一个子集?
所以我正在尝试使用 Selenium/Geb 将以前保存的 cookie 加载到我的网络驱动程序中。首先我转到域,然后尝试添加 cookie。但是 cookie 域和 url 域不相互注册:
Caught: org.openqa.selenium.InvalidCookieDomainException:
You may only add cookies that would be visible to the current domain: .domain=.example.com => .www.example.com
Build info: version: '2.35.0', revision: '8df0c6bedf70ff9f22c647788f9fe9c8d22210e2', time: '2013-0 8-17 12:46:41'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '3.2.0-48-generic', java.version: '1.6.0_27'
Driver info: driver.version: unknown
Run Code Online (Sandbox Code Playgroud)
似乎 cookie 的域是.example.com
,而我去时访问的域http://example.com
是.www.example.com
. 我能想到的唯一解决方案是覆盖某种方法来欺骗我当前的域,但我不知道如何去做。
我在IntelliJ IDE中运行Geb测试时遇到以下错误.
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: features.step_definitions.MyHomeStepDef.to() is applicable for argument types: (java.lang.Class) values: [class geb.pages.MyLandingPage]
Possible solutions: is(java.lang.Object), run(), run(), any(), any(groovy.lang.Closure), with(groovy.lang.Closure)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:97)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:904)
at groovy.lang.Closure.call(Closure.java:415)
at cucumber.runtime.groovy.GroovyBackend.invoke(GroovyBackend.java:133)
at cucumber.runtime.groovy.GroovyStepDefinition.execute(GroovyStepDefinition.java:48)
at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:45)
at cucumber.runtime.Runtime.runStep(Runtime.java:248)
...
at cucumber.cli.Main.main(Main.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
at ?.Given I am on the My home page(D:\MyFolder\src\test\resources\features\my-login-page.feature:5)
Caused by: groovy.lang.MissingMethodException: No signature of method: features.step_definitions.MyHomeStepDef.to() is applicable for argument types: (java.lang.Class) values: [class geb.pages.MyLandingPage] …
Run Code Online (Sandbox Code Playgroud) 我正试图在jenkins上运行grails geb/spock测试.我安装Xvfb插件
https://wiki.jenkins-ci.org/display/JENKINS/Xvfb+Plugin.詹金斯配置:
在Spock规范中,期望的任何行:或者然后: block被评估并断言为boolean
,除非它具有返回类型的签名void
.
我注意到void
在继承的任何类Navigator
(例如Page
或Module
类)上声明的方法有些奇怪.
假设我们有这样的例子:
class NavigationSpec extends GebSpec {
def 'Collections page has a right header'() {
when:
to CollectionsPage
then:
hasHeaderText('Collections')
}
}
Run Code Online (Sandbox Code Playgroud)
该hasHeaderText()
方法在CollectionsPage
类中定义如下:
class CollectionsPage extends Page {
static url = 'movies/collections'
void hasHeaderText(String expectedText) {
assert true
}
}
Run Code Online (Sandbox Code Playgroud)
故意我只是true
在那里断言所以它永远不会失败.即使它失败并出现错误:
Condition not satisfied:
hasHeaderText('Collections')
|
null
Run Code Online (Sandbox Code Playgroud)
void
方法调用结果的评估方式和原因是null
什么?
我知道如何"修复它".将方法返回类型声明为return boolean
并返回就足够了true …
这就是我目前使用的Geb.我希望能够在页面中检索和设置组合框(或下拉列表)的值.我不太清楚怎么做,而且Geb书似乎没有涵盖这个.这是我正在尝试使用的HTML元素.
<select style="height: 22px; width: 370px;" id="ddlContactTypes" name="ddlContactTypes">
<option value="-1">--Please Select--</option>
<option value="18">Customer Hauler</option>
<option value="19">Customer General</option>
<option value="20">Rolloff</option>
<option value="21">Supplier</option>
<option value="22">Leads</option>
<option value="23">Competition</option>
<option value="24">Employees</option>
<option value="25">Customer Car</option>
<option value="26">Secondary Metals Recycler</option>
<option value="27">Mills</option>
<option value="28">Brokerage Customers</option>
<option value="29">Type Jon</option>
</select>
Run Code Online (Sandbox Code Playgroud)
这就是我到目前为止所做的.这当前将单击该元素,但我不知道如何实际选择一个.有任何想法吗?
static content = {
title {$("title")}
contactType { $("#ddlContactTypes") }
}
def addUser(){
contactType.click()
}
Run Code Online (Sandbox Code Playgroud) 在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,Selenium和Cucumber/Groovy.
Caused by: org.gradle.api.GradleException: Could not generate test report to 'D:\Folder\ABCD\Auto\build\reports\tests'.
at org.gradle.api.internal.tasks.testing.junit.report.DefaultTestReport.generateFiles(DefaultTestReport.java:84)
at org.gradle.api.internal.tasks.testing.junit.report.DefaultTestReport.generateReport(DefaultTestReport.java:48)
at org.gradle.api.tasks.testing.Test.executeTests(Test.java:482)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:219)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:212)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:201)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:530)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:513)
Run Code Online (Sandbox Code Playgroud)
添加了更多错误详情:
Caused by: java.io.FileNotFoundException: D:\Folder\ABCD\Auto\build\reports\tests\packages\When I enter valid registration details "d2bcons" and "fi rstdtwob" and "lastdtwob" and "d2bcons@trashcanmail.html (The filename, directory name, or volume label syntax is incorrect)
Run Code Online (Sandbox Code Playgroud)
什么可能导致错误?
谢谢
我想测试的网站有一个登陆页面,要求您选择一种语言.您可以通过在网址中添加额外参数来跳过此问题.我想,以测试这种行为Geb
,并Spock
为测试框架.
所以我有一个语言选择的登陆页面:
class LanguageSelectionPage extends Page {
static url = "http://localhost:8080/registration/"
static at = { $("form#languageForm") }
}
Run Code Online (Sandbox Code Playgroud)
它重定向到的第二个页面:
class InsertCardReaderPage extends Page {
static at = { welcomeTitle1 }
static content = {
welcomeTitle1(wait: true, cache: false) { $("#eidWelcomeTitle1") }
welcomeTitle2(wait: true, cache: false) { $("#eidWelcomeTitle2") }
}
}
Run Code Online (Sandbox Code Playgroud)
(我从粘贴的代码中删除了一些方法)
所以这是我的测试:
given:
to LanguageSelectionPage, "09";
expect:
at InsertCardReaderPage;
Run Code Online (Sandbox Code Playgroud)
"09"是网址中的一个额外参数,当这个参数可用时,您将立即被服务器重定向(http重定向,因此页面确实会更改)到InsertCardReaderPage
.现在,我的问题是该to
语句对at
闭包执行隐式断言.这个失败是因为您已经从页面重定向.
在这种情况下,有没有办法有条件地禁用这个隐式断言?或者任何其他提案如何设置页面?我很新,Geb
在这种情况下找不到任何似乎对我有用的文档.