如何从任何其他页面调用方法而不使用GEB和Spock将方法声明为静态?

时间:2016-04-20 05:05:15

标签: groovy spock geb

我想在2-3页中使用以下功能,所以我想调用该函数但是需要异常"需要静态方法..."

这里的Code CommonFunction是一个扩展Page Class

的类
def  "User clicks on My Account Link"(){

    CommonFunction."User clicks on My Account Link"()   
}

我也尝试了以下方法,但仍然遇到异常" geb.error.PageInstanceNotInitializedException:页面类com.casestudy.util.CommonFunctions的实例尚未初始化。请在使用之前将其传递给Browser.to(),Browser.via(),Browser.page()或Browser.at()。"

CommonFunctions commonfunction= new CommonFunctions()
def  "User clicks on My Account Link"(){

     commonfunction."User clicks on My Account Link"()  
}

这是用户点击我的帐户链接()

的功能代码
def  "User clicks on My Account Link"(){
    def actions = new Actions(driver)
    myaccountMenu.displayed
    WebElement myaccountMenu = myaccountMenu.firstElement()
    actions.click(myaccountMenu).build().perform()

}

3 个答案:

答案 0 :(得分:1)

您有点不清楚自己要做什么,但看起来您有一个"我的帐户"链接在几个页面上,并且您希望有一种方法可以单击此页面而不必在每个页面上重复代码。如果是这样的话,你应该这样做:

创建一个" BasePage"所有其他页面都包含您的"我的帐户"功能应该扩展。

class BasePage extends Page{

  static content = {
    myAccountLink { $("#myAccountLink") } //CSS selector for the link you want on your page
  }

  //You don't actually need this method. In your tests you can just say myAccountLink.click() and it'll still work.
  def "User clicks on My Account Link"(){
    myAccountLink.click()
  }
}

然后您的其他页面可以定义为:

class HomePage extends BasePage {
  ... 
}

在测试中,只要浏览器位于从BasePage扩展的页面,您就可以调用该方法:

def "User can go to my account page"(){
 setup:
    to HomePage

 when: "The user clicks the MyAccount link"
   "User clicks on My Account Link"()

 then:
   at MyAccountPage
}

答案 1 :(得分:0)

我在子类中更改了函数名,然后在子函数内调用函数(此处父函数名称现在与子函数名不同)

谢谢Jk你的建议,这也正常工作

答案 2 :(得分:0)

如果您有一个可以存在于多个页面上的公共组件,那么您要做的是创建一个带有控件访问器的Geb“模块”,然后将该模块包含在包含该模块的页面中。

class moduleName extends Module {
    static clickUserLink() { userLink.click() }
    static content = {
        userLink = {$(locator)}
    }
}

class pageName extends Page {
    static content = {
        localName { module moduleName }
    }
}

这样,您的clickUserLink将通过localName.clickUserLink迁移到您导入模块的任何页面。您还可以考虑在clickUserLink方法或帮助方法中添加waitFor(userLink)。