我使用this advice执行JavaScript,我想从此脚本返回一个值。
答案 0 :(得分:14)
您可以像这样返回值:
爪哇:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
的Python:
driver.execute_script("return document.title")
答案 1 :(得分:6)
我使用(在.js文件中)附加要返回的值:
document.body.innerHTML += '<div style="display:none;" id="some_id">' + value_to_be_returned + '</div>';
并使用(在.java文件中)访问java中的值:
String return_value = (String) js.executeScript("return document.getElementById('some_id').innerHTML");
答案 2 :(得分:0)
对于异步,我使用了以下内容:
driver.executeAsyncScript(
"var callback = arguments[0];" +
"$.ajax('someurl')" +
".success(function(data){callbacks(data)});"
);
答案 3 :(得分:-1)
如果您要执行的Javascript是同步的,那么javascript返回值将被分配给driver.execute_script()
方法的结果 - 这可能是您所期望的,并且遵循least surprise principle:
js_url = driver.execute_script("return window.location.href")
print(js_url)
另一方面,如果您的Javascript代码是异步的,那么在回调中您可以在window
对象上分配结果,等待一些预定义的时间(例如,ajax reguest完成),然后读取全局js变量的结果:
driver.execute_script("""$.ajax({
url: 'http://httpbin.org/get',
complete: function(xhr, textStatus) {
window._xhr_status = xhr.status;
}
});
""")
time.sleep(5)
js_status = driver.execute_script('return window._xhr_status')
print(js_status)
在实际情况中,您可能需要轮询,例如每1秒检查一次异步回调是否已经执行,然后在超时后正常失败。