2017-01-09 11 views
0

JavaScriptの結果が文字列またはブール値と一致するまで待つ必要があります。このJavaScriptでSelenium - 返されるまで待つjavascriptスクリプトの値が一致する値

document.getElementById('video_html5').seeking; 

私は「偽」/「真」の値を取得し、私は値が「偽」になるまで待機する必要があるので、私は、ビデオではないことを確信していますしかし、私はjavascriptのコマンド値を待つ方法しか見つけず、値がテキストと一致するかどうかをチェックする方法ではありませんでした。

new WebDriverWait(driver, 30) 
    .until(ExpectedConditions.jsReturnsValue("return document.getElementById('video_html5').seeking;")); 

場合によっては、ブール値以外の文字列を取得し、それらの文字列を比較する必要があるためです。

私はRubyでなく、Javaでそれを行う方法を発見した:

wait_element = @wait.until { @driver.execute_script("return document.getElementById('vid1_html5_api_Shaka_api').seeking;").eql? false } 
+0

これは機能しますか? Seeking === 'false'? 'true':undefined; ")'シークがtrueの場合は 'undefined'を返し、JavaScriptの値を直接比較します。 –

答えて

2

あなたは、独自のカスタム期待される条件を書くことができます。

public class MyCustomConditions { 

    public static ExpectedCondition<Boolean> myCustomCondition() { 
    return new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver driver) { 
     return (Boolean) ((JavascriptExecutor) driver) 
      .executeScript("return document.getElementById('video_html5').seeking === 'string_value' || ... "); 
     } 
    }; 
    } 
} 

そして、あなたのテストでは次のような条件を使うことができます。

WebDriverWait wait = new WebDriverWait(driver, 30); 
wait.until(MyCustomConditions.myCustomCondition()); 
+0

私はJavaScriptの結果と文字列の多くの比較をする必要があるので、私はそれを行う普遍的な方法のいくつかの並べ替えを好むことですので、可能であれば、すべての比較のcustomConditionを追加する必要はありません。 –

+0

おそらく、ジェネリックロジックを使用して単一の条件を作成し、必要に応じて特定のパラメータを渡すことができます。 – cjungel

1

それを行うための汎用的な方法(commandではJavaScriptここであなたがtimeout秒でwebdriverを実行したい):

public Object executeScriptAndWaitOutput(WebDriver driver, long timeout, final String command) { 
    WebDriverWait wait = new WebDriverWait(driver, timeout); 
    wait.withMessage("Timeout executing script: " + command); 

    final Object[] out = new Object[1]; 
    wait.until(new ExpectedCondition<Boolean>() { 
    @Override 
    public Boolean apply(WebDriver d) { 
     try { 
     out[0] = executeScript(command); 
     } catch (WebDriverException we) { 
     log.warn("Exception executing script", we); 
     out[0] = null; 
     } 
     return out[0] != null; 
    } 
    }); 
    return out[0]; 
} 
0

は最終的に私は次のことをやったと働いていた、別の答えからアイデアを得て:

public Boolean checkStateSeeking() throws InterruptedException { 
     JavascriptExecutor js = (JavascriptExecutor) driver; 
     Boolean seekingState = (Boolean) js 
       .executeScript("return document.getElementById('vid1_html5').seeking;"); 

     while (seekingState) { 
      // System.out.println(seekingState); 
      seekingState = (Boolean) js 
        .executeScript("return document.getElementById('vid1_html5').seeking;"); 
     } 

     return seekingState; 
    } 
関連する問題