21

以下のコードを使用して、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']")));

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

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

4

2 に答える 2

42

ここでは何かが欠けているため、要素がない場合は待機しています。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 が将来暗黙的に待機するようにします。

于 2013-04-18T09:20:13.677 に答える
0

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

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

于 2013-04-18T06:53:06.230 に答える