Google電卓を自動化しています。また、サイプレスはボタンのクリックを実行できない場合があります。テストはボタン(0〜9)をクリックし、いくつかの簡単な数学演算を実行します。そして、30%の確率で要素をクリックできず、テストは失敗します。
問題が発生したときにもビデオを録画しました。
私のプロジェクトはここにあります: https://github.com/afiliptsov/test-project
To run the test run : "npm run test:e2e:functional"
別のロケーターを使用してみました。最初はID ex(#cwbt15)だけを使用していましたが、より具体的なロケーター(#cwbt15> .cwbtpl> .cwbts)を作成した後も同じです問題。
なぜそれが起こるのか、そしてそのような行動を避ける方法を誰かが知っていますか?
プロジェクトの構造は次のとおりです。
私にとってこのコードは機能しました:
クリックメソッド内にadd:_{ force: true }
_強制的にクリックします。
また、cy.wait(150)
をbeforeEachまたはに追加してから、テストが失敗する場所をクリックします。
これは解決策ではなく単なる回避策です。
また、私はこの代替案を見ました:
_cy.get('#query-btn').invoke('width').should('be.gt', 0)
cy.get('#query-btn').invoke('width').should('be. greaterThan', 0)
_
しかし、それは私にはうまくいきませんでした。多分誰かのために役立つでしょう!
これは、アプリケーションがJavaScriptを介してボタンにビヘイビアーをアタッチしていることが原因である可能性があります。そのスクリプトの実行に長い時間がかかる場合、サイプレスはボタンをクリックするbeforeことができ、OnClickイベントがそこにあります。
参照: https://www.cypress.io/blog/2018/02/05/when-can-the-test-start/
サイプレスは、基になるJSが次のように配置されているときに追跡することをお勧めします。
function waitForAppStart() {
// keeps rechecking "appHasStarted" variable
return new Cypress.Promise((resolve, reject) => {
const isReady = () => {
if (appHasStarted) {
return resolve()
}
setTimeout(isReady, 0)
}
isReady()
})
}
it('greets', () => {
cy.visit('app.html', {
onBeforeLoad: spyOnAddEventListener
}).then(waitForAppStart)
// all other assertion will run only when
// the application has started
cy.get('#name').type('Cypress{enter}')
cy.contains('#answer', 'Cypress')
})
この問題を見つけた人は誰でも、それを処理する公式の方法がここに記載されています: https://www.cypress.io/blog/2019/01/22/when-can-the-test-click/
TLDR:@jpvantuylによると、サイプレスはonclickイベントが発生する前にボタンをクリックします。 lib cypress-pipe
は.pipe
メソッドを追加します。このメソッドの後に.should
が続く場合は、条件が真になるかタイムアウトになるまで関数を再試行します。
例:
cy
.get(numbers.result.idLocator)
.pipe($el => $el.click()) // try this
.pipe(
// next line will make assertions on the element returned by this pipe
() => cy.get(calculatorScreen.resultOutput.idLocator)
)
.should("contain", "0"); // until this happens or times out
https://github.com/cypress-io/cypress/issues/2928 が役に立ちました。
cy.get('[data-qa="select_workers-list"]'.contains('+ New Worker').trigger('mouseover').click();