2013-04-16 64 views
2

这里是通常的javascript,它寻找隐藏的元素。在webDriver中执行异步脚本

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

我想使它异步。如何实现回调?

+0

什么是你想怎么办?用JavaScript返回一个元素?任何你无法直接获得'WebElement'的理由? – NilsH

+0

而上面的代码是Java,您所看到的JavaScript是Java String变量的值。 – Ardesco

+0

@NilsH,元素不可见。我无法获得他们的文本。 –

回答

1

这些是直接从硒的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("[email protected]"); 

例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"));