2016-10-12 19 views
2

から未定義の復帰は、私が分度器要素(..)私は分度器のテストを書いて、私のtest.step.jsにしています別のファイル

element(by.css('...')).getText().then(function (text) { 
    expect(text).to.equal('expectedText'); 
}); 

をしたファイルこれは期待どおりに動作して渡します。

は、代わりに私がtest.page.jsファイルを作成し、そこにthis.field = element(by.css('...'));を入れた後、私のステップファイルで

"use strict" 

module.exports = function exampleTest() { 
    var TestPage = require("..."); 
    var testPage = new TestPage; 
    ... 
    test.Then(..., function (next) { 
     testPage.field.getText().then(function (text) { 
      expect(text).to.equal('expectedText'); 
     }); 
    }); 
} 

を持っていたそのフィールドは未定義です。私はまた、ページファイルにgetText()を追加しようとしましたが、再び未定義になるか、未定義で 'then'を呼び出すことができないと言われます。

私の考えでは、これは最初の例とまったく同じですが、私はAngularまたはJavaScriptの専門家ではありません。

test.page.jsのようになります。誰かがこれが起こって、何私は再用のページファイル内のCSSセレクタを置くことができるように代わりに行う必要がありますされている理由にいくつかの光を当てることができます願って

"use strict"; 

module.exports = (function() { 
    function TestPage() { 
     this.field = element(by.css('...')); 
    } 

    return TestPage; 
}); 

-つかいます。あなたは再利用可能な要素のロケータを定義し

おかげ

+0

あなたは 'module.exports'の下でそれを定義しているあなたは、クラスを返すことができ

? test.page.jsの内容を追加できますか? – AdityaReddy

+0

test.page.jsの内容を追加しました。私はそれがmodule.exportsの下でそれを定義する方法だと信じています。 – hello123

+0

'HomePage'とは何ですか?あなたは 'TestPage'を返すべきです。また、 'var testPage = new TestPage();'を実行する必要があります。 – taguenizy

答えて

3

あなたのコードnew TestPage;コンストラクタTestPageを返しますが、それが呼び出されることはありませんです。

function TestPage() { 
    this.field = element(by.css('...')); 
} 

module.exports = TestPage; 
var TestPage = require("..."); 
var testPage = new TestPage; 
testPage.field.getText().then(... 

またはクラスのインスタンス:

function TestPage() { 
    this.field = element(by.css('...')); 
} 

module.exports = new TestPage(); 
var testPage = require("..."); 
testPage.field.getText().then(... 
+0

最初の提案(クラスを返す)はうまくいきましたが、なぜこれが以前の 'module.exports =と違うのか分かりません'と'関数TestPage(){...}; testPage;を返します。 – hello123

+1

あなたのコードでは、 'new TestPage;を実行すると、' module.exports'に割り当てられた無名関数が実行されます。実行されていないコンストラクタ/関数 'TestPage'を返します。だから 'this.field'は存在しません。 –

1

方法が異なって見えます。ロケータオブジェクトが含まれている必要があり.jsファイルを定義し、再利用可能な方法

var Login = { 

    PageElements: { 
     emailInput: element(by.css('#email')), 
     passwordInput: element(by.css('#password')), 
     loginForm: element(by.css('#form')), 
    }, 
    doLogin: function doLogin() { 
     this.PageElements.emailInput.sendKeys('[email protected]'); 
     this.PageElements.passwordInput.sendKeys('blahblah'); 
     this.PageElements.loginForm.submit(); 
    }, 
}; 

module.exports = Login; 

ステップ2:テストクラスでこれらのページオブジェクトを呼び出し、私は

以下のステップ1のようないくつかのことを次のようしています。

var LoginPage = require('../pageobjects/LoginPage.js'); 
it('Scenario1_Login',function(){ 
LoginPage.PageElements.emailInput.sendKeys('blahblah'); 
}); 

もっとdetails here

+0

あなたの 'loginPage'はオブジェクトですが、loginPageが関数としてエクスポートされたときの質問です。 @Florent Bの答えは、エクスポートされたpageObject関数をインスタンス化して使用する正しい方法です! –

+0

それは良いことがありますか? – AdityaReddy

関連する問題