如何使用Selenium从JavaScript返回值?

时间:2016-11-22 06:48:34

标签: javascript selenium selenium-webdriver

我使用this advice执行JavaScript,我想从此脚本返回一个值。

4 个答案:

答案 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秒检查一次异步回调是否已经执行,然后在超时后正常失败。