如何使用Selenium从JavaScript返回值?

r_D*_*r_D 5 javascript selenium selenium-webdriver

我使用这个建议执行JavaScript ,我想从这个脚本返回一个值.

Joc*_*hen 16

您可以像这样返回值:

Java的:

JavascriptExecutor js = (JavascriptExecutor) driver;         
js.executeScript("return document.title");
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

driver.execute_script("return document.title")
Run Code Online (Sandbox Code Playgroud)


ccp*_*zza 8

如果您要执行的 Javascript 是同步的,那么 javascript 返回值将被分配给方法 \xe2\x80\x94 的结果driver.execute_script(),这可能是您所期望的,并遵循最不令人意外的原则

\n\n
from selenium import webdriver\n\ndriver = webdriver.Chrome()\n\n# make sure you have a `return` in the js code\njs_url = driver.execute_script("return window.location.href")\nprint(js_url)\n
Run Code Online (Sandbox Code Playgroud)\n

对于异步调用,请使用driver.execute_async_script

\n
from selenium import webdriver\n\ndriver = webdriver.Chrome()\n\nprint(driver.execute_async_script(\'\'\'\n    fetch(\'http://httpbin.org/get\')\n         .then(resp=>resp.json())\n         .then(data=>{alert(JSON.stringify(data)\n         )});\n\'\'\'))\n
Run Code Online (Sandbox Code Playgroud)\n

对于jQuery.ajax()的具体情况,您还可以通过传递强制调用同步async: false(默认情况下是异步的),例如以下代码将同步返回 http 响应文本:

\n
from selenium import webdriver\n\ndriver = webdriver.Chrome()\n\nhttp_response = driver.execute_script("""\nreturn $.ajax({\n    url: \'http://httpbin.org/get\', \n    async: false\n}).responseText""")\n\nprint(http_response)\n
Run Code Online (Sandbox Code Playgroud)\n


r_D*_*r_D 6

我使用(在.js文件中)附加要返回的值:

document.body.innerHTML += '<div style="display:none;" id="some_id">' + value_to_be_returned + '</div>';
Run Code Online (Sandbox Code Playgroud)

并使用(在.java文件中)访问java中的值:

String return_value = (String) js.executeScript("return document.getElementById('some_id').innerHTML");
Run Code Online (Sandbox Code Playgroud)