如何在 运行 GEB SPOCK 中的任何测试脚本之前导航到同一页面

How to navigate to same page before running any test script in GEB SPOCK

我正在使用 geb spock 和 groovy 创建一个自动化脚本。在我的测试中 class 我有多个测试,我想在 运行 任何测试意义

之前导航到主页
  1. 登录应用程序并导航至主页(登录后默认页面为主页)。
  2. 点击 Link1。检查Page.navigate到主页
  3. 点击 Link2。检查页面。导航到主页
  4. 点击 Link3。检查页面。导航到主页...

我创建了一个方法并尝试在我的 geb 测试中重用它,但出现以下错误:

geb.error.PageInstanceNotInitializedException: Instance of page class pages.Test_HomePage has not been initialized. Please pass it to Browser.to(), Browser.via(), Browser.page() or Browser.at() before using it.
at geb.Page.uninitializedException(Page.groovy:521)
        at geb.content.UninitializedPageContentSupport.getContent(UninitializedPageContentSupport.groovy:30)
        at geb.content.PageContentSupport.propertyMissing(PageContentSupport.groovy:39)
        at geb.Page.propertyMissing(Page.groovy:99)
        at pages.Test_HomePage.clickOnHomePage(Test_HomePage.groovy:46)
        at com.abc.vcctest.TestNavigationInitialTestSpec.Navigate to Home page of test portal(TestNavigationInitialTestSpec.groovy:44)

这是我的示例 geb 测试:

@TestMixin(GrailsUnitTestMixin)
    class TestNavigationInitialTestSpec extends LoginBaseTestSpec {
        @Shared
        Test_HomePage test_HomePage = new Test_HomePage()
        def cleanupSpec() {
            browser.close()
        }
        def setup() {
        }
        def cleanup() {
        }
        def navigateToHomePage() {
            Test_HomePage test_HomePage = at Test_HomePage
            test_HomePage.clickOnHomePage()
            at Test_HomePage
        }
        def "Navigate to Home page of test portal"() {
            given:
            HomePage homePage = at HomePage

            when: "Click on Home tab/link"
            navigateToHomePage()
            test_HomePage.clickOnHomePage()
            def crashDisplayed = test_HomePage.crashPageDisplayed()

            then: "You are on Home Page"
            !crashDisplayed || { at Test_HomePage } 
        }

            def "Navigate to Change Password page of testportal"() {
                given:
                at Test_HomePage

                when: "Click on Change Password"
                test_HomePage.clickOnChangePassword()
                Test_ChangePassword test_ChangePassword = at Test_ChangePassword
                def crashDisplayed1 = test_ChangePassword.crashPageDisplayed()

                then: "You are on Change Password Page"
                !crashDisplayed1 || { at Test_ChangePassword }
                at Test_ChangePassword
               
            } 

这是我的 Test_HomePage class:

class Test_HomePage extends HomePage2{
      static url = '/home'
      static at = {
        waitFor(message:"The Test Portal title is missing."){driver.title == "Test Portal"}
      }
      static content = {
        pageCrash(required: false, cache: false) { $("h1") }
        homePageLink {
          $("a[href = '/Link1']")
        }
       changePasswordLink{
          $("a[href='/Link2']")
        }
        updateEmailLink{
          $ ("a[href = '/Link3']")
        }
      }
      void crashPageDisplayed() {
        if (pageCrash.isDisplayed()) {
          driver.navigate().back()
        }
      }
      void clickOnHomePage() {
        homePageLink.click()
      }
      void clickOnChangePassword(){
        changePasswordLink.click()
      }
      void clickUpdateEmail(){
        updateEmailLink.click()
      }
    }

我是 geb 和 spock 的新手,我可能犯了一个非常愚蠢的错误,但非常感谢任何帮助或建议以有效的方式实现这一点。

你应该让你的功能方法彼此独立,这样它们就可以按任何顺序调用。你为什么不把 to Test_HomePage 之类的东西放到你的 setup() 方法中?然后它会在每个特征方法的开始被调用。即使您在每个单一特征方法的 given: 块中执行此操作,您仍然需要 to 才能检查 at。我认为你应该稍微研究一下 Geb 之书。顺便说一句,这就是错误消息试图向您解释的内容:

geb.error.PageInstanceNotInitializedException:
  Instance of page class pages.Test_HomePage has not been initialized.
  Please pass it to Browser.to(), Browser.via(), Browser.page() or Browser.at() before using it.

navigateToHomePage() 中,您的第一个命令因此应该是:

Test_HomePage test_HomePage = to Test_HomePage