Selenium - 等到返回的javascript脚本值匹配值

时间:2017-01-09 18:33:54

标签: javascript java selenium-webdriver

我需要等到javascript的结果与字符串或布尔值匹配。

使用此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 }

4 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

执行此操作的通用方法(其中command是您要在webdriver秒内使用timeout运行的JavaScript):

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];
}

答案 2 :(得分: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;
    }

答案 3 :(得分:0)

获取所有答案的想法,我使用该元素的xpath和期望值创建了一个函数,以等待元素更改每个元素并等待N秒。

 public static String checkValueChanged(WebDriver driver, String expectedValue, String path, int waitTime) throws InterruptedException {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    String elementValue = (String) js
            .executeScript("return document.evaluate(\""+path+"\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.value;");

    while (!(elementValue.equals(expectedValue)) && (waitTime>0)) {
        Thread.sleep(1000);
        waitTime--;
        elementValue = (String) js
                .executeScript("return document.evaluate(\""+path+"\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.value;");
    }
    return elementValue;
}