2016-09-13 17 views
1

私はすべてのロケータを1つの場所、jsonファイルtest.jsonに保管するフレームワークを開発したいと考えています。このような。分度器のjsonファイルからロケータを読み取る方法は?

{ 
    "yourName": "by.model('yourName')" 
} 

そして、私はこの仕様を以下のように読んでいます。

​​

しかしが失敗したとして、私はこのエラーを取得してください:次のエラーのトレースと無効なロケータ

Failures: 
1) angularjs homepage todo list should add a todo 
    Message: 
    Failed: Invalid locator 
    Stack: 
    TypeError: Invalid locator 
     at Object.check [as checkedLocator] (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\by.js:267:9) 
     at WebDriver.findElements (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:919:18) 
     at C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:159:44 
     at ManagedPromise.invokeCallback_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1379:14) 
     at TaskQueue.execute_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14) 
     at TaskQueue.executeNext_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21) 
     at asyncRun (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2775:27) 
     at C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:639:7 
     at process._tickCallback (internal/process/next_tick.js:103:7)Error 
     at ElementArrayFinder.applyAction_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:396:27) 
     at ElementArrayFinder._this.(anonymous function) [as sendKeys] (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:99:30) 
     at ElementFinder.(anonymous function) [as sendKeys] (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\built\element.js:730:22) 
     at Object.<anonymous> (E:\ui\TestTest\todo-spec.js:9:20) 
     at C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:94:23 
     at new ManagedPromise (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1082:7) 
     at controlFlowExecute (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:80:18) 
     at TaskQueue.execute_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2913:14) 
     at TaskQueue.executeNext_ (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2896:21) 
     at asyncRun (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2820:25) 
    From: Task: Run it("should add a todo") in control flow 
     at Object.<anonymous> (C:\Users\karunakaralchala\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:79:14) 
    From asynchronous test: 
    Error 
     at Suite.<anonymous> (E:\ui\TestTest\todo-spec.js:4:7) 
     at Object.<anonymous> (E:\ui\TestTest\todo-spec.js:3:5) 
     at Module._compile (module.js:541:32) 
     at Object.Module._extensions..js (module.js:550:10) 
     at Module.load (module.js:458:32) 
     at tryModuleLoad (module.js:417:12) 

これを実行する方法はありますか?それを動作させるためには何が必要なのでしょうか?

+0

JSONの代わりにページオブジェクト形式を使用してみませんか? http://www.protractort.org/#/page-objects – Gunderson

+0

コメントをいただきありがとうございます。私も同じことを試みましたが、私はコードを整備する上で上記を達成したいと思います。 –

+0

OK ...分度器ガイドは、ページオブジェクトを使用することを示唆していますが、それはあなたのコードです。すべてのファイルを1つのファイルに保存すると、最終的に大量になり、ナビゲートやデバッグが非常に困難になります。 – Gunderson

答えて

1

おそらく質問への直接の回答ではありませんが、私はあなたが伝統的な方法で問題を試していないと思って、部分的に車輪を再発明しています。

ロケータを別々のJSON構造に保つ代わりに、別々のページまたはページの一部のために、個別のページオブジェクト(要素ロケータとページとやり取りするメソッドを含む)をPage Objectsに整理します。

+0

私の意図は、すべてのフィールド(私は100以上のフィールドがページにあります)を書くことではなく、これを達成したいと思います.I_Enter_Text = function(locator、expectedText){\t \t \t var webElement = elementロケータ); \t \t webElement.sendKeys(expectedText); \t}; –

+0

アレクセ...なぜ両方のアプローチを組み合わせて、オブジェクト定義をロードする独自の小さなjsonを持つページオブジェクトを用意して、疎結合を保つのはなぜでしょうか。 –

1

これは動作するはずです。 BDDキュウリ、ここではJSONとPageオブジェクトモデルを使用して

test.json

{ 
    "siteURL": "https://angularjs.org", 
    "locators": { 
    "todoText": { 
     "model": "todoList.todoText" 
    } 
    } 
} 

spec.js

var test = require('./test.json'); 

    describe('angularjs homepage todo list', function() { 
     it('should add a todo', function() { 
     browser.get(test.siteURL); 

     var webElement = element(by.model(test.locators.todoText.model)); 

     webElement.sendKeys('write first protractor test'); 
    }); 
}); 

完全な1例。 https://github.com/aluzardo/protractor-cucumber-tests/

0

あなたのアプローチでは簡単な間違いが1つあります。

JSONからの値を文字列として読み込まれ、あなたがロケータ(ないbyオブジェクト)element()に文字列を渡すとされていません

var webElement = element(test.yourName); // Incorrect. test.yourName returns string 

変更それ道と出来上がり!あなたはよかったはずです。 eval()を使用します。参照してくださいhere

var webElement = element(eval(test.yourName)); 
+0

あなたのコメントをありがとう、残念ながらそれは動作していないようです、今私は少し異なるアプローチ –

関連する問題