如何使用Selenium从JavaScript返回值?

carvr3hs  于 2022-11-24  发布在  Java
关注(0)|答案(4)|浏览(233)

我使用这个建议执行了JavaScript,并希望从该脚本返回一个值。

qfe3c7zg

qfe3c7zg1#

您可以像这样返回值:
java 语:

JavascriptExecutor js = (JavascriptExecutor) driver;         
js.executeScript("return document.title");

巨蟒:

driver.execute_script("return document.title")
driver.execute_script("return document.querySelector('.somecssclass')")
2admgd59

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

ie3xauqp3#

如果您要执行的Javascript是同步的,则javascript返回值将被赋给driver.execute_script()方法的结果-这可能是您所期望的,并遵循least surprise principle

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)
yfjy0ee7

yfjy0ee74#

对于异步,我使用了以下代码:

result = driver.executeAsyncScript(
  "var callback = arguments[arguments.length-1];" + 
  "$.ajax('someurl').success(function(data){ callback(data); });"
);

相关问题