我使用此建议执行了JavaScript,我想从此脚本返回一个值。
您可以像这样返回值:
java:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
python:
driver.execute_script("return document.title")
driver.execute_script("return document.querySelector('.somecssclass')")
我附加了使用(in .js file)返回的值:
document.body.innerHTML += '<div style="display:none;" id="some_id">' + value_to_be_returned + '</div>';
并使用(in .java文件)访问Java中的值:
String return_value = (String) js.executeScript("return document.getElementById('some_id').innerHTML");
如果要执行的JavaScript是同步的,则JavaScript返回值将分配给driver.execute_script()
方法的结果 - 这可能是您所期望的,并遵循最小令人惊讶的原则:
from selenium import webdriver
driver = webdriver.Chrome()
# make sure you have a `return` in the js code
js_url = driver.execute_script("return window.location.href")
print(js_url)
对于异步调用,使用driver.execute_async_script
:
from selenium import webdriver
driver = webdriver.Chrome()
print(driver.execute_async_script('''
fetch('http://httpbin.org/get')
.then(resp=>resp.json())
.then(data=>{alert(JSON.stringify(data)
)});
'''))
对于jquery.ajax()的特定情况,您也可以通过传递async: false
(默认情况下它是异步)强制呼叫进行同步的,例如,以下代码将同步返回HTTP响应文本:
from selenium import webdriver
driver = webdriver.Chrome()
http_response = driver.execute_script("""
return $.ajax({
url: 'http://httpbin.org/get',
async: false
}).responseText""")
print(http_response)
对于异步,我使用以下内容:
result = driver.executeAsyncScript(
"var callback = arguments[arguments.length-1];" +
"$.ajax('someurl').success(function(data){ callback(data); });"
);