How do I create a "getter" for my modules (How do you instantiate a Module Object using a Navigator?)

How do I create a "getter" for my modules (How do you instantiate a Module Object using a Navigator?)

我正在努力使我的所有页面和 module 引用都可以在 intellij 中自动完成。

由于某种错误,我无法像往常一样执行此操作。 (详情请见此处:How to have geb static content recognized form test script

为了解决上述错误。我选择为所有静态内容创建 "getters"。

例如:

页面:

class MyPage extends Page{
    static content = { 
        tab {$(By.xpath("somexpath")}
    }

    Navigator tab(){
        return tab
    }
}

脚本:

//imagine we are in the middle of a feature method here
def test = at MyPage
test.tab().click()

所以上面的所有代码都按我预期的那样工作,我想像这样重做我​​的页面,这样我就可以从脚本端自动完成。当我尝试对 mod 规则使用相同的技术时出现问题。

例如:

class MyPage extends Page{
    static content = { 
        mod {module(new MyModule())}
    }

    MyModule mod(){
        return mod
    }
}

如果我尝试像这样从脚本访问 mod

//imagine we are in the middle of a feature method here
def test = at MyPage
test.mod().someModContentMaybe().click()

我收到以下错误:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'MyPage' -> mod: 'MyModule' with class 'geb.content.TemplateDerivedPageContent' to class 'MyModule'

如果我尝试在页面对象中执行以下操作:

class MyPage extends Page{
    static content = { 
        mod {module(new MyModule())}
    }

    MyModule mod(){
        return new MyModule()
    }
}

尝试从脚本访问 module 时出现以下错误:

geb.error.ModuleInstanceNotInitializedException: Instance of module class MyModule has not been initialized. Please pass it to Navigable.module() or Navigator.module() before using it.

我想它想让我获取一个实例化的导航器对象并调用 module(MyModule) 但我不确定它是如何工作的或者如何决定从哪个导航器对象调用 module .

总而言之,我只想能够从我的脚本中自动完成 module 名称和静态内容。

Book of Geb's section about modules 回答了您的问题。你不应该手动调用模块的构造函数,而是使用本章开头描述的语法。这个解决方案摆脱了异常,也为我解决了代码完成问题:

static content = { 
  mod { module MyModule }
}

现在异常已经消失,这里是如何添加您要求的 getter:

def myModule() { mod }

我认为问题是你 content 阻止了。 Modules 是通过 Navigators' module 方法定义的:

static content = {
    mod { $("div.module").module(MyModule)
}

因此不需要调用构造函数。

当 returning 包含来自 return 类型为 class 的方法的模块的内容时,您会得到一个 GroovyCastException 扩展 geb.Module 因为从内容定义中 return 导航器和模块被包裹在 geb.content.TemplateDerivedPageContent.

您可以使用 as 关键字解包它们,如有关 unwrapping modules returned from the content DSL 的手册部分所述。因此,对于您的一个示例,它看起来像这样:

MyModule mod(){
    mod as MyModule
}