我有以下代码,但无法正常工作

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/

10-09 18:20
查看更多