WebDriver提供了方法來(lái)同步/異步執(zhí)行JavaScript代碼,這是因?yàn)镴avaScript可以完成一些WebDriver本身所不能完成的功能,從而讓W(xué)ebDriver更加靈活和強(qiáng)大。
本文中所提到的都是JAVA代碼。
1. 在WebDriver中如何執(zhí)行JavaScript代碼
JavaScript代碼總是以字符串的形式傳遞給WebDriver,不管你的JavaScript代碼是一行還是多行,WebDriver都可以用executeScript方法來(lái)執(zhí)行字符串中包含的所有JavaScript代碼。
WebDriver driver = new FirefoxDriver();
JavascriptExecutor driver_js=(JavascriptExecutor)driver;
String js = "alert("Hello World!");";
driver_js.executeScript( js);
2.同步執(zhí)行JavaScript和異步執(zhí)行JavaScript的區(qū)別
同步執(zhí)行:driver_js.executeScript( js)
如果JavaScript代碼的執(zhí)行時(shí)間較短,可以選擇同步執(zhí)行,因?yàn)閃ebdriver會(huì)等待同步執(zhí)行的結(jié)果,然后再運(yùn)行其它的代碼。
異步執(zhí)行:driver_js.executeAsyncScript(js)
如果JavaScript代碼的執(zhí)行時(shí)間較長(zhǎng),可以選擇異步執(zhí)行,因?yàn)閃ebdriver不會(huì)等待其執(zhí)行結(jié)果,而是直接執(zhí)行下面的代碼。
3. 用Javascript實(shí)現(xiàn)等待頁(yè)面加載的功能
public void waitForPageLoad() {
While(driver_js.executeScript("return document.readyState" ).equals ("complete")){
Thread.sleep(500);
}
}
這樣做的缺點(diǎn)是,沒(méi)有設(shè)定timeout時(shí)間,如果頁(yè)面加載一直不能完成的話,那么代碼也會(huì)一直等待。當(dāng)然你也可以為while循環(huán)設(shè)定循環(huán)次數(shù),或者直接采用下面的代碼:
protected Function<WebDriver, Boolean> isPageLoaded() {
return new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor) driver).executeScript("returndocument.readyState").equals("complete");
}
};
}
public voidwaitForPageLoad() {
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(isPageLoaded());
}
需要指出的是單純的JavaScript是很難實(shí)現(xiàn)等待功能的,因?yàn)镴avaScript的執(zhí)行是不阻塞主線程的,你可以為指定代碼的執(zhí)行設(shè)定等待時(shí)間,但是卻無(wú)法達(dá)到為其它WebDriver代碼設(shè)定等待時(shí)間的目的。有興趣的同學(xué)可以研究一下。
4. Javascrpt模擬點(diǎn)擊操作,并觸發(fā)相應(yīng)事件
String js ="$("button.ui-multiselect.ui-widget").trigger("focus");"
+"$("button.ui-multiselect.ui-widget").click();"
+"$("button.ui-multiselect.ui-widget").trigger("open");";
((JavascriptExecutor)driver).executeScript( js);
5. Javacript scrollbar的操作
String js ="var obj = document.getElementsById(“div_scroll”);”
+”obj.scrollTop= obj.scrollHeight/2;”
((JavascriptExecutor)driver).executeScript(js);