Rokuサービス
wdio-roku-serviceはサードパーティのパッケージです。詳細についてはGitHub | npmをご覧ください。 このサービスはWebdriverIOの多くの部分をオーバーライドし、Rokuアプリで使用できるようにするとともに、テスト中にRokuを制御するためのRoku ECPへのアクセスを提供します。
要件
Roku
テストチャンネル/channel.zipと、macと同じネットワーク上にある開発者モードが有効なRokuデバイスが必要です。
WebdriverIO
これはスタンドアロン製品ではなく、WebdriverIOテストフレームワークのプラグイン(またはサービス)として使用されます。使用する前に、npm init wdio@latest
を実行してWDIOのセットアップを完了させてください。
セットアップステップを進める際、すべての質問やオプションをナビゲートする必要がないように、初期化フェーズ中に以下の選択肢を選ぶことができます:
- Roku Testing(注:レポジトリがRokuテスト専用であれば、これがデフォルトかつ唯一のサービスとしてインストールされます。そうでない場合は、複数のサービスをインストールできるようにE2E Testingを選択してください)
- On my local machine(E2Eのみ)
- Web(E2Eのみ)
- Chrome(E2Eのみ)
- Mocha
- Typescript [modulesはTSとJSの両方で動作するので、どちらかを選択]
- autogenerate some test files (Y) -- デフォルトの場所
- page objects (Y) -- デフォルトの場所
- spec reporter
- additional plugins (N)
- Visual Testing (N)
- services (roku)
- npm install (Y)
Typescript設定
テストの記述にTypescriptを使用したい場合は、WebdriverIOによって生成されたtsconfig.jsonファイルに以下のオプションが設定されていることを確認する必要があります。
"moduleResolution": "nodenext",
"module": "NodeNext",
その後、以下に詳述するようにテストにサービスをインポートして使用できます。
WDIO設定
現在、テスト は単一のRokuデバイスのみをサポートしています。以下の設定更新が必要です:
maxInstances
とmaxInstancesPerCapability
は1にする必要があります。複数のデバイスでの自動テストはサポートされておらず、Rokuに重複したコマンドが送信される結果になります。capabilities は1つだけにしてください。
//wdio.conf.js
export const config: WebdriverIO.Config = {
maxInstances: 1,
capabilities: [{
browserName: 'chrome'
// またはヘッドレスモードを使用する場合:
browserName: 'chrome',
'goog:chromeOptions': {
args: ['--headless', '--disable-gpu']
}
}],
//...
}
- 各間隔でRokuからXMLをダウンロードするため、
waitforInterval
とwaitforTimeout
を増やすことをお勧めします。開発環境でbrowser.debug()
機能をより活用するために、mochaテストランナーのタイムアウトを5分以上に延長することもできます。
//wdio.conf.js
export const config: WebdriverIO.Config = {
waitforTimeout: 30000,
//オプション:
mochaOpts: {
ui: 'bdd',
timeout: 600000
},
//...
}
これで最初のテストを書く準備ができました!
import { installFromZip } from 'wdio-roku-service/install'
import { exitChannel } from 'wdio-roku-service/channel'
import { Buttons, keyPress, keySequence } from 'wdio-roku-service/controller'
describe('first test', () => {
before('On the landing screen of the test channel', async () => {
await installFromZip(process.env.ROKU_APP_PATH)
})
it('should launch to the homescreen without login', async () => {
await $("//LoadingIndicator").waitForDisplayed({ reverse: true })
await expect($("//ContentCarousel")).toBeDisplayed()
})
after('should return to home', async () => {
await exitChannel()
})
})
また、テストのデバッグやテスト作成のために、wdioのbrowser.debug()
機能を利用することをお勧めします:
// ...
it('should launch to the homescreen without login', async () => {
await $("//LoadingIndicator").waitForDisplayed({ reverse: true })
await expect($("//ContentCarousel")).toBeDisplayed()
await browser.debug()
// テストが停止し、コマンド用のREPLが利用可能になります
Chromeがヘッドレスモードでなければ、最後にopenRokuXML()
が呼び出された時点(おそらくwaitForX
またはexpect
を通じて)を確認できます。ターミナルのREPLを使用して、有効な$
コマンドと、追加されたいくつかのカスタムコマンド(browser.openRokuXML()
とbrowser.saveScreenshot('path/to/ss.jpg')
)を使用できます。controller
クラスはbrowser
オブジェクトにアタッチされていないため、現在それらを使用することはできません。幸いにも、おそらくあなたはRokuの隣に座っていて、アプリをナビゲートするためのリモコンを持っているでしょう。そして時々browser.openRokuXML()
を呼び出して、ページの状態がどうなったかを確認できます!また、XMLはChrome ブラウザ自体のXPathと自然に連携するため、デバッグ中にChrome コンソールで直接セレクタを評価/開発できることを覚えておいてください。
.env
.env.example
ファイルを参照してください。このファイルをコピーして、このサービスを使用するWebdriverIOプロジェクト内の.env
にリネームしてください。.gitignoreにも追加することをお勧めします。
ROKU_IP
はRokuのIPである必要があります。コマンドはこのIPを使用してRokuと通信します。これは必須です。ROKU_USER
とROKU_PW
:アーカイブのインストールやスクリーンショットの撮影には、ログイン認証情報が必要です。ROKU_APP_PATH
はRokuチャンネルのzipファイルの絶対パスである必要があります。ROKU_CHANNEL_ID
はRokuチャンネルのIDである必要があります(通常は「dev」)。DEBUG=wdio-roku-service
はデバッグメッセージを有効にします。それらを表示したい場合は、行の先頭にある「#」を削除してください。