ProtractorからNightwatchへの移行
はじめに
Protractorは、AngularおよびAngularJSアプリケーション向けの一般的なエンドツーエンドテストフレームワークでした。ただし、ProtractorはAngular 12以降の新しいAngularプロジェクトに同梱されなくなります。この移行ガイドは、チームでのProtractorからNightwatchへの移行を容易にするのに役立ちます。
はじめに
AngularプロジェクトにNightwatchを追加するには、Nightwatch Angular schematicをインストールします。
ng add @nightwatch/schematics
これにより、Nightwatchがインストールされ、Nightwatchを実行するためのさまざまなスクリプトが追加され、Nightwatch構成とテストファイルが足場されます。また、プロジェクトからProtractorを削除し、デフォルトのng e2e
コマンドを使用してNightwatchを使用するように再構成するように求められます。
これで、次のコマンドでNightwatchを実行できます。
ng e2e
また、次のコマンドを使用してNightwatchを代替実行することもできます。
ng run {your-project-name}:nightwatch-run
次のステップ
既存のe2eテストは、Protractor
という新しい場所に移行されます。サンプルテストは、Nightwatchでの最初のテストを開始するために、Nightwatch
フォルダーに追加されます。
プロジェクトでschematicを実行すると、プロジェクトでこれらの変更が表示されます。
次に、既存のテストをNightwatchに変更する必要があります。まず、アサーション、Expect、ページオブジェクト、およびAPIコマンドから始めることができます。
このガイドにはいくつかの例を追加しましたが、詳細については、/api/をご覧ください。
特定のブラウザでテストを実行するなど、詳細については、Nightwatch Schematicドキュメントをご覧ください。
DOMの操作
DOM要素の取得
単一要素の取得
e2eテストでは、Webページで最も一般的な操作の1つは、1つ以上のHTML要素を取得することです。Nightwatchでは、すべてが以前と同じように機能するため、ここで変更を加える必要はありません。
以前:Protractor
// Find an element using a css selector.
element(by.css('.myclass'))
以後:Nightwatch v2
// Find an element using a css selector.
element(by.css('.myclass'))
複数要素の取得
ページ上の複数の要素にアクセスする必要がある場合は、.all()メソッドを連鎖させる必要があります。ただし、Nightwatchでは、browser.findElements
を使用できます。
以前:Protractor
// Find elements using a css selector.
element.all(by.css('.myclass'))
以後:Nightwatch v2
// Find mulltiple elements using a css selector.
browser.findElements(by.css('.myclass'))
// or simply:
browser.findElements('.myclass')
DOM要素とのインタラクション
以前:Protractor
// Click on the element
element(by.css('button')).click()
// Clear the text in an element (usually an input).
element(by.css('input')).clear()
// Check the first checkbox on a page
element.all(by.css('[type="checkbox"]')).first().click()
// Scroll an element into view
browser
.actions()
.mouseMove(element(by.id('my-id')))
.perform()
以後:Nightwatch v2
// Click on the element
browser.click(element(by.css('button')))
// or with default css selector as locate strategy:
browser.click('button')
// Clear the text in an element (usually an input).
browser.clearValue('input')
// Check the first checkbox on a page
// Nightwatch by default search for first element, and perform click event if there are multiple element present
browser.click('[type="checkbox"]')
// Scroll an element into view
browser.moveToElement(element(by.id('my-id'), 0, 0))
// or, using the actions api:
browser
.perform(function() {
return this.actions().mouseMove(element(by.id('my-id')))
})
DOM要素の操作の詳細については、公式ドキュメントをご覧ください。
アサーション
長さ
以前:Protractor
const list = element.all(by.css('.custom-class'))
expect(list.count()).toBe(3)
以後:Nightwatch v2
expect.elements('.custom-class').count.to.equal(3);
値
以前:Protractor
expect(element(by.css('input[name="first_name"]'))).getAttribute('value').toBe('foo')
以後:Nightwatch v2
expect(element('input[name="first_name"]')).attribute('value').toEqual('foo');
テキストコンテンツ
以前:Protractor
// assert the element\'s text content is exactly the given text
expect(element(by.id('user-name')).getText()).toBe('John Doe')
以後:Nightwatch v2
expect.element(by.id('user-name')).text.toEqual('John Doe');
可視性
以前:Protractor
// assert button is visible
expect(element(by.css('#main ul li a.first')).isDisplayed()).toBe(true)
以後:Nightwatch v2
expect('#main ul li a.first').to.be.visible;
// The following will end the test:
browser.assert.visible('#main ul li a.first');
// However this will just log the failure and continue:
browser.verify.visible('#main ul li a.first');
存在
以前:Protractor
// assert the spinner no longer exists
expect(element(by.id('loading')).isPresent()).toBe(false)
以後:Nightwatch v2
browser.assert.not.elementPresent(by.id('loading'))
CSS
以前:Protractor
// assert #main ul li a.first has css style "block" for "display" property
expect(element(by.css('#main ul li a.first')).getCssValue('display')).toBe('block')
以後:Nightwatch v2
browser.assert.cssProperty(by.css('#main ul li a.first'), 'display', 'block');
Webサイトのナビゲーション
テストでページにアクセスする必要がある場合は、次のコードを使用できます。
以前:Protractor
it('visits a page', () => {
browser.get('/about')
browser.navigate().forward()
browser.navigate().back()
})
以後:Nightwatch v2
it('visits a page', () => {
browser
.navigateTo('/about')
.forward()
.back()
})
質問または問題がある場合
Nightwatch Angular Schematicに関する質問をしたり、問題を報告したりする最適な方法は、issueを開くことです。