我有以下代码,但无法正常工作
public static String getHTMLResponse(String url){
String body = (String) js.executeScript("$.ajax({url:\""+ url + "\", success:function(result){ return result;}});");
return body;
}
由于某种原因,它总是返回null。
有没有人试图从webdriver的ajax获得CURL响应?我以前在Java中这样做,但是我不断收到证书错误,只是想要更可靠的东西。
提前谢谢!
最佳答案
好的,Jason Smiley发布了一个解决方案,但没有说明问题是什么以及解决方案如何工作。
第一个问题是传递给executeScript
的脚本在句点期间不返回任何内容。 executeScript
所做的是将传递给它的脚本包装在function () { ... }
中。因此,$.ajax(...)
形式的内容将在浏览器中按以下方式执行:
function () {
$.ajax(...);
}
显然,它不会以与脚本
2 + 2
相同的方式返回任何内容,而不会返回4
,因为它将执行为:function () {
2 + 2;
}
传递给
executeScript
的脚本必须为return 2 + 2
。但是,在这里,仅添加此
return
并不能解决问题。另外一个问题是$.ajax
是异步函数。当$.ajax
执行时,它立即返回。存储传递给它的函数以供将来执行。如果$.ajax
立即返回,则它返回的值不可能是赋予它的任何函数的返回值,因为这些函数尚未执行。相反,传递给$.ajax
的函数确实会执行,而赋予它们return
的任何内容都无法被您的代码检索。您唯一可以做的就是在函数本身内部使用您关心的值,或者将其传递给另一个函数。解决方案是使用专为异步执行而设计的
executeAsyncScript
。该函数就像executeScript
一样,但是添加了一个参数,它是一个回调,在脚本执行完毕后应调用该回调,并应使用您希望executeAsyncScript
返回的值来调用它。请注意,绝对没有必要放弃
$.ajax
。以下应该工作:public static String getHTMLResponse(String url){
String body = (String) js.executeAsyncScript(
"var url = arguments[0];" +
"var callback = arguments[1];" +
"$.ajax({url: url, success: callback});",
url);
return body;
}
请注意,我已经设置了此代码,以使
url
作为参数传递,而不是被串联到脚本中。我发现这比串联更干净。如果需要对此进行说明,则arguments
是JavaScript虚拟机自动提供的对象。它保存了提供给函数的参数列表。无论使用
$.ajax
还是直接使用XMLHttpRequest
,原理都是相同的。关于java - Selenium从WebDriver获取HTML(或JSON)响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26221530/