web-dev-qa-db-ja.com

サイプレスは常に要素のクリックを実行するわけではありません

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)を作成した後も同じです問題。

なぜそれが起こるのか、そしてそのような行動を避ける方法を誰かが知っていますか?

プロジェクトの構造は次のとおりです。

  • cypress/PageObject.js-すべての要素が宣言されている場所。
  • cypress/support/commands.js-関数クリックが作成され、値の検証が更新される場所。
  • cypress/integration/functional/delete.spec.js-ビデオにあったテスト
5
Anton

私にとってこのコードは機能しました:

クリックメソッド内に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)
_

しかし、それは私にはうまくいきませんでした。多分誰かのために役立つでしょう!

5
Anton

これは、アプリケーションが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')
})
1
jpvantuyl

この問題を見つけた人は誰でも、それを処理する公式の方法がここに記載されています: 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
0
Ian

https://github.com/cypress-io/cypress/issues/2928 が役に立ちました。

cy.get('[data-qa="select_workers-list"]'.contains('+ New Worker').trigger('mouseover').click();
0
Misha