我使用这个建议执行了JavaScript,并希望从该脚本返回一个值。
qfe3c7zg1#
您可以像这样返回值:java 语:
JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("return document.title");
巨蟒:
driver.execute_script("return document.title") driver.execute_script("return document.querySelector('.somecssclass')")
2admgd592#
我使用(在.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");
ie3xauqp3#
如果您要执行的Javascript是同步的,则javascript返回值将被赋给driver.execute_script()方法的结果-这可能是您所期望的,并遵循least surprise principle:
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:
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响应文本:
async: false
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)
yfjy0ee74#
对于异步,我使用了以下代码:
result = driver.executeAsyncScript( "var callback = arguments[arguments.length-1];" + "$.ajax('someurl').success(function(data){ callback(data); });" );
4条答案
按热度按时间qfe3c7zg1#
您可以像这样返回值:
java 语:
巨蟒:
2admgd592#
我使用(在.js文件中)追加了要返回的值:
并使用以下代码访问java中的值(在.java文件中):
ie3xauqp3#
如果您要执行的Javascript是同步的,则javascript返回值将被赋给
driver.execute_script()
方法的结果-这可能是您所期望的,并遵循least surprise principle:对于异步调用,请使用
driver.execute_async_script
:对于jQuery.ajax()的特定情况,您还可以通过传递
async: false
(默认情况下是异步的)来强制调用同步,例如以下代码将同步返回http响应文本:yfjy0ee74#
对于异步,我使用了以下代码: