Возвращение JSONArray из JavascriptExecutor - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь вернуть JSONArray из JavascriptExecutor.Обычно я могу перейти в браузер chrome и в консоль разработчика goto chrome и набрать: "___grecaptcha_cfg.clients[0]", который возвращает что-то похожее на это:

enter image description here

Хотя, когда я пытаюсь это сделать:

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

Есть идеи, как мне это преодолеть?

Спасибо

ОБНОВЛЕНИЕ

Кажется, если я использую:

 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

Я предполагаю, что значение слишком длинное?Как я могу исправить эту проблему?

Обновление 2

с использованием:

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

возвращает меня unknown error: Converting circular structure to JSON

ОтПоиск вокруг кажется, что моя проблема может быть бесконечной рекурсии?Любые предложения о том, как обойти это?Мне не нужно, чтобы возвращаемый объект был в формате json, мне просто нужно иметь возможность разобрать, с помощью выражения регулярного выражения или чего-то еще: 'Cy.C', который я могу найти, ища callback={} или sitekey={}поэтому я могу построить строку для обратного вызова.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Причина unknown error: Maximum call stack size exceeded была в том, что объект, который я искал, был слишком сложным.

, так как я видел много оставшихся без ответа постов, связанных с подобными вещами, я опубликую то, что я сделал, чтобы решить это:

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);

Я только тяну первое свойство здесь .. И из чего явидел, если бы я не перебрал весь объект, я бы не получил правильный порядок.

0 голосов
/ 29 сентября 2018

Если возвращаемый объект JSON сложный, вы можете преобразовать его в строку и вернуть.Затем преобразуйте строку JSON в код JAVA.

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.
//
// 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...