1

私たちはレガシーコードで作業しており、不安定なテストに問題があります。

デフォルトのタイムアウトを増やしたいのですが、driver.findElementは多くの場所で使用されています。WebDriverWaitを使用するために各呼び出しをオーバーライドするのは大きな作業です。

暗黙の待機を使用することをお勧めします。これは、一度設定するだけでよいため、理想的に見えました。

getDriver().manage().timeouts().implicitlyWait(5000, TimeUnit.MILLISECONDS);

これを初期化コードブロックに追加しました。残念ながら、1つのテストケース(50テスト)を実行すると、パフォーマンス爆弾が30秒から600秒に増加します。

なぜパフォーマンスがこれほど悪化したのかわかりません。要素が存在しない場合(テストに合格した場合)にのみ最大の時間がかかると思いました。この呼び出しで状態をポーリングすると思いました。しかし、ポーリング間隔をどこに設定するかもわかりません...ドキュメントには、慎重に使用する必要があると記載されていますが、これは完全に使用できません。

私たちはimplicitlyWait()を使用して正しい方向に進んでいますか?テストを強化する別の方法はありますか?

更新調査の結果、implicitlyWait()とdriver.getElements()を使用しているため、速度が低下しているようです。implicitwaitを無効にして、呼び出しの直後に再適用すると、テストの実行速度が大幅に向上します。400か所以上でgetElementsinを使用しています(!)-続行する方法に関する推奨事項はありますか?

4

1 に答える 1

0

これが暗黙的にWaitで発生した理由を突き止めることができませんでした。ビルドの信頼性を高めるために、ポーリング間隔をかなり短く(100ms)、独自のポーリングメカニズムを使用してoverrodegetElementを作成しました。

これにより、ビルド期間に影響を与えることなく、テストの精度が向上しました。

override def findElement(selector: By): WebElement = {
      val timeoutTime = System.currentTimeMillis() + timeout
      def helper(): WebElement = {
        try {
          super.findElement(selector)
        } catch {
          case exception: NoSuchElementException => {
            if (System.currentTimeMillis() >= timeoutTime) {
              throw exception
            } else {
              Thread.sleep(pollInterval)
              helper()
            }
          }
        }
      }
      helper()
    }
于 2012-12-06T17:47:58.857 に答える