如何使用Geb访问外部网站

时间:2018-05-14 14:06:10

标签: grails groovy geb gherkin

我正在使用Geb和Groovy自动化我的项目。例如:我正在登录Gmail,我将不同的页面定义为 - 收件箱,已发送邮件,已删除邮件,草稿等。现在,在我的规范中,我想访问yahoomail等外部网站。如何定义访问外部Webiste的规范。 我用"去"导航到我的规范中的雅虎邮件

    then: "I go to Yahoo mail page"
    go "https://login.yahoo.com/"

    and: "Signing into Yahoo mail "
    at YahooLoginPage

在YahooLoginPage.groovy中,它没有找到我定义为静态的Next按钮

static at = { $("#login-signin") }

我收到错误消息:

条件不满意:

去" https://login.yahoo.com/"

|

还有其他办法吗?

2 个答案:

答案 0 :(得分:3)

问题是您在then: Spock块中使用a method which has a void return type。每个语句都在then:块中声明,并且该方法调用的计算结果为null,因为它的返回类型因此导致失败。

基本上你不应该在go()中使用Geb的then:方法 - 而是在given:when:块中使用它。

答案 1 :(得分:0)

我认为Erdi和Jeff的答案在上面指出,但是因为我很想知道它是否可能,并且为了一个工作代码看起来如何的例子,我继续建立一个独立的运行geb规范的groovy脚本。以下脚本在yahoo登录流程中输入用户名并点击下一个按钮。

@Grapes([
  @Grab("org.gebish:geb-spock:2.1"),
  @Grab("org.spockframework:spock-core:1.1-groovy-2.4"),
  @Grab("org.seleniumhq.selenium:selenium-htmlunit-driver:2.52.0"),
  @GrabExclude('org.codehaus.groovy:groovy-all')
])

import geb.*
import geb.spock.*
import spock.util.EmbeddedSpecRunner
import java.util.logging.*
import org.w3c.css.sac.ErrorHandler
import com.gargoylesoftware.htmlunit.SilentCssErrorHandler

new EmbeddedSpecRunner().runClass(YahooSpec)

class YahooSpec extends GebReportingSpec {
    def setup()  {
      // disable css errors output - don't do this for real tests
      browser.driver.webClient.cssErrorHandler = new SilentCssErrorHandler()
    }

    def "should be able to enter username at yahoo"() {
      when: "I go to Yahoo mail page"
        to YahooLoginPage

      then: "there should be a button with value 'Next'"
        nextButton.value() == "Next"

      when: "I enter a username and click next"
        username = "BobbaFett"
        nextButton.click()

      then: "I should end up at the password page"
        at YahooPasswordPage
        greeting.text() == "Hello BobbaFett"
    }
}

class YahooPasswordPage extends Page { 
  static url = "https://login.yahoo.com/account/challenge/password"
  static at  = { title.trim() == "Yahoo" }

  static content = {
    greeting                          { $("h1", class: "username")}
  }
}

class YahooLoginPage extends Page { 
  static url = "https://login.yahoo.com/"
  static at  = { title == "Yahoo - login" }

  static content = {
    username                          { $("input#login-username")}
    nextButton(to: YahooPasswordPage) { $("input#login-signin")  }
  }
}

将上述内容保存在文件test.groovy中并运行:

~> groovy test.groovy

执行规范。应该注意的是,当脚本正在下载依赖项时,第一次运行将花费一些时间。还应该注意的是,使用不存在的用户名将打破测试,因为测试假设雅虎将在下一次打击后将您发送到密码页面。

经过测试:

Groovy Version: 2.4.15 JVM: 1.8.0_161 Vendor: Oracle Corporation OS: Mac OS X