2

非表示の要素を探す通常の JavaScript を次に示します。

   private RemoteWebElement getItemInSubmenu(WebElement parent, String itemName) {
        String script = "var el = jQuery(arguments[0].getElementsBySelector('div.rich-menu-list-bg>div.rich-menu-item>.rich-menu-item-label')).filter(function() {"
                + "return jQuery(this).text().trim() === '" + itemName + "'});"
                + "jQuery(el).parents('div.rich-menu-list-border:hide').show();"
                + "return el.get(0);";
        return (RemoteWebElement) browser.executeScript(script, parent);
    }

非同期にしたい。コールバックを実装するには?

4

1 に答える 1

1

これらは、ここで入手できる Selenium JavaDoc から直接取得されます。

http://selenium.googlecode.com/git/docs/api/java/index.html

例 #1: テスト中のブラウザーでスリープを実行します。

long start = System.currentTimeMillis();
((JavascriptExecutor) driver).executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 500);");
System.out.println("Elapsed time: " + System.currentTimeMillis() - start);

例 #2: テストを AJAX アプリケーションと同期する

WebElement composeButton = driver.findElement(By.id("compose-button"));
composeButton.click();
((JavascriptExecutor) driver).executeAsyncScript(
  "var callback = arguments[arguments.length - 1];" +
  "mailClient.getComposeWindowWidget().onload(callback);");
driver.switchTo().frame("composeWidget");
driver.findElement(By.id("to")).sendKeys("bog@example.com");

例 #3: XMLHttpRequest を挿入して結果を待つ:

Object response = ((JavascriptExecutor) driver).executeAsyncScript(
    "var callback = arguments[arguments.length - 1];" +
    "var xhr = new XMLHttpRequest();" +
    "xhr.open('GET', '/resource/data.json', true);" +
    "xhr.onreadystatechange = function() {" +
    "  if (xhr.readyState == 4) {" +
    "    callback(xhr.responseText);" +
    "  }" +
    "}" +
    "xhr.send();");
JSONObject json = new JSONObject((String) response);
assertEquals("cheese", json.getString("food"));
于 2013-04-16T12:23:09.943 に答える