web-dev-qa-db-ja.com

要素が存在しない場合、isElementPresentは非常に遅くなります。

以下のコードを使用して、Webページの要素を確認しています

private boolean isElementPresent(By by) {
try {       
      driver.findElement(by);
      return true;
    } catch (NoSuchElementException e) {
        return false;
    }
    catch (Exception e)
    {       
        return false;
    }

  }

特定の地域が以下のような結果に表示されるかどうかをプログラムでチェックインする必要があります

isElementPresent(By.xpath(".//*[@id='header']")));

これが存在する場合、この関数はすぐに完了しますが、上記が存在しない場合、非常に長い時間実行されます。

このチェックを迅速に実行できるように、誰かがこの問題の解決を手伝ってくれませんか?

19
user419534

ここで何かが足りないので、要素がない場合は待機しています。 findElementは、暗黙的に指定された時間要素を待機します。そのため、そのメソッドではその時間をゼロに設定する必要があります。

isElementPresent(WebDriver driver, By by) {  
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);  
    try {  
        driver.findElement(by);  
        return true;  
    } catch (NoSuchElementException e) {  
        return false;  
    } finally {  
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);  
    }  
}

ここで起こっている4つの重要なことがあります。順番に:

  1. WebDriverが暗黙的に待機しないように、implicity_waitを0に設定します。

  2. 要素が見つかったときにTrueを返します。

  3. NoSuchElementExceptionをキャッチし、要素が存在しないことが判明した場合は、例外でテストを停止する代わりにFalseを返します。

  4. アクションの完了後にimplicitly_waitを30に戻し、WebDriverが将来暗黙的に待機するようにします。

38
Santoshsarma

どうやら、DOMが大きく、xpathが要素を取得する最速の方法ではないため、例外を送信するのに時間がかかるようです。ただし、xpathを使用する場合は、最適なパスを配置し、部分文字列チェックが行われるような関数は避けてください。

実際のxpath:.//*[@id='header'] DOMのすべてのタグをチェックするため、非常に時間がかかります。したがって、探しているものにタグを付けると、たとえば、入力をキャッチしたいとします。 xpathはそのように開始する必要があります//input[@id='1234']そしてそれはすべてのタグを見るよりも短くなります。

0
e1che