2016-04-20 3 views
3

私はので、私はその関数を呼び出すしたいが取得例外2-3ページに次の関数を使用したい「静的メソッドが必要とされて...」GEBとSpockを使って静的メソッドを宣言せずに他のページからメソッドを呼び出す方法はありますか?

ここでは、コードCommonFunctionでページクラス

を拡張するクラスです
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() 

} 
+0

ページとやりとりする前にページに移動する必要があります –

+0

はい、このようなコードを書いています:class HomePage extends CommonFunctions {CommonFunction。 "ユーザーがMy Account Link"()}をクリックしてCommonFunctionクラスに持っています拡張されたページクラスとインポートされたこのクラスgeb.page –

答えて

1

それはあなたが正確に何をしようとして少しは不明だ上でクリックされていますが、「持っているように見えますいくつかのページに「マイアカウント」リンクがあり、すべてのページでコードを繰り返さずにこれをクリックする方法があります。その場合は、これを行う必要があります:

「マイアカウント」機能を持つ他のすべてのページが拡張されるべき「ベースページ」クラスを作成します。

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() 
    } 
} 

次に、あなたの他のページは次のように定義することができますブラウザがBasePageクラスから延びているページである時はいつでも

class HomePage extends 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 
} 
+0

実際に私はすべてのページでこのコード行を使用していただきありがとうございます:def "ユーザーが私のアカウントリンクをクリックします"(\t \t def actions = new Actions(driver) \t \t \t \t WebElement myaccountMenu = myaccountMenu.firstElement() \t \tをmyaccountMenu.displayed actions.click(myaccountMenu).build()。 \t \t \t} –

+0

こんにちは、あなたが理解できることを願って編集した質問を見てください。Javaのセレンでは、別のページやクラスに共通の機能を記述していましたが、そのobject.functionの名前はこのようにして、私たちのコードは冗長なものでした。 –

+0

Geb/Groovyでこれを行う必要はありません。私の解決策を試しましたか? – jk47

0

子クラス内で関数名を変更してから、子関数内の関数を呼び出しました(ここでは、親関数名は子関数名と異なります) は、あなたがあなたが複数のページに存在することができ、共通のコンポーネントを使用している場合も正常に動作していること、そして、あなたが何をしたいのか、その制御アクセサとゲブ「Module」を作成するために

0

であることが示唆された何Jkをありがとうございましたそのモジュールを含むページにそのモジュールを含めます。

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)を追加することを検討することもできます。