开发者问题收集

从 JavascriptExecutor 返回 JSONArray

2018-09-29
699

我正在尝试从 JavascriptExecutor 返回一个 JSONArray。通常,我可以转到 chrome 浏览器并转到 chrome 的开发控制台并输入: “___grecaptcha_cfg.clients[0]” ,它返回类似于以下内容的内容:

在此处输入图像描述

但是当我尝试这个时:

JavascriptExecutor js = (JavascriptExecutor) Browser;         
Object  o = (Object) js.executeScript("return ___grecaptcha_cfg.clients[0];");

我得到了:

Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Maximum call stack size exceeded (Session info: chrome=69.0.3497.100) (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),
platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 0 milliseconds

有什么想法可以克服这个问题吗?

谢谢

UPDATE

似乎如果我使用:

 Object o = (Object) js.executeScript("return ___grecaptcha_cfg.clients[0].Cy.C;");

我得到了返回:

{action=null, badge=bottomright, bind=null, callback={}, content-binding=null, pool=null, preload=null, s=null, sitekey=flkgjsfldkjgsfdg, size=invisible, stoken=null, tabindex=null, theme=null, type=image}

这正是我要找的,但 Cy.C 一直在变化。我需要能够解析出可能发生变化的正确值,当前值为:

Cy.C

我假设该值太长?我该如何纠正这个问题?

Update 2

使用:

String script = "return JSON.stringify(___grecaptcha_cfg.clients[0]);";
String str = (String) js.executeScript(script);

返回 未知错误:将循环结构转换为 JSON

从搜索来看,我的问题可能是无限递归?有什么关于如何解决这个问题的建议吗?我不需要返回的对象是 JSON 格式,我只需要能够通过正则表达式或其他方式解析出来: 我可以通过查找 callback={sitekey={ 找到'Cy.C',这样我就可以构建一个字符串来调用回调。

2个回答

如果返回的JSON对象比较复杂,可以先将其转换为字符串再返回,然后再用JAVA代码转换JSON字符串。

String script = "return JSON.stringify(___grecaptcha_cfg.clients[0].Cy.C);";
String str = (String) js.executeScript(script);

// Using JSON-Java lib to convert JSON string to JSON Java Object.
//
// 
yong
2018-09-29

抛出 未知错误:超出最大调用堆栈大小 的原因是因为我搜索的对象太复杂了。

因为我看到很多与类似事情有关的未答复帖子,所以我将发布我为解决该问题所做的事情:

String script = "for (var prop in ___grecaptcha_cfg.clients[0])" 
               +"{"
               +" return '___grecaptcha_cfg.clients[0].' + prop"
               +"}";
System.out.println(script);
Object objects = (Object) js.executeScript(script);
System.out.printl(objects);

我在这里只提取第一个属性。从我所看到的,除非我迭代整个对象,否则我不会得到正确的顺序。

Kabone
2018-09-30