Selenium的JavascriptExecutor没有返回任何内容。

huangapple go评论114阅读模式
英文:

Selenium JavascriptExecutor doesnt return anything

问题

我初始化了一个JavascriptExecutor,但它没有返回我想要的内容。对象始终为空。

  1. SeleniumDriver driver = new SeleniumDriver(DriverType.ChromeDriver);
  2. driver.get("https://www.xxxxxx.info/");
  3. driver.waitForPageToBeLoaded();
  4. JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
  5. Object ob = js.executeScript("___grecaptcha_cfg.clients[0]");

这是控制台中显示的内容:

Selenium的JavascriptExecutor没有返回任何内容。

为什么我无法通过JavascriptExecutor获取它?

英文:

I initialized a JavascriptExecutor but it doesn't return me what I want. Object is always null.

  1. SeleniumDriver driver = new SeleniumDriver(DriverType.ChromeDriver);
  2. driver.get("https://www.xxxxxx.info/");
  3. driver.waitForPageToBeLoaded();
  4. JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
  5. Object ob = js.executeScript("___grecaptcha_cfg.clients[0]");

Here what it gives me in console:

Selenium的JavascriptExecutor没有返回任何内容。

Why am I not able to get it via JavascriptExecutor?

答案1

得分: 2

  1. // 你的 JS 脚本应该返回它。尝试以下更改
  2. Object ob = js.executeScript("return ___grecaptcha_cfg.clients[0];");
  3. 所以你的代码将会是这样的
  4. SeleniumDriver driver = new SeleniumDriver(DriverType.ChromeDriver);
  5. driver.get("https://www.xxxxxx.info/");
  6. driver.waitForPageToBeLoaded();
  7. JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
  8. Object ob = js.executeScript("return ___grecaptcha_cfg.clients[0];");
  9. 因为它是一个 JS 对象 JSON所以它会抛出循环引用异常
  10. 你可以使用以下 JS 代码将其转换为 JSON
  11. const getCircularReplacer = () => {
  12. const seen = new WeakSet();
  13. return (key, value) => {
  14. if (typeof value === "object" && value !== null) {
  15. if (seen.has(value)) {
  16. return;
  17. }
  18. seen.add(value);
  19. }
  20. return value;
  21. };
  22. };
  23. JSON.stringify(___grecaptcha_cfg.clients[0], getCircularReplacer());
  24. 由于它是跨域 iframe你可以像下面的代码一样使用它因为 Chrome 会阻止它如下面的图片所示
  25. [![enter image description here][1]][1]
英文:

Your js script should return it.try the below changes

Object ob = js.executeScript("return ___grecaptcha_cfg.clients[0]");

so that your code will be like

  1. SeleniumDriver driver = new SeleniumDriver(DriverType.ChromeDriver);
  2. driver.get("https://www.xxxxxx.info/");
  3. driver.waitForPageToBeLoaded();
  4. JavascriptExecutor js = (JavascriptExecutor) driver.getWebDriver();
  5. Object ob = js.executeScript("return ___grecaptcha_cfg.clients[0]");

Since it is the JS object json it throws circular reference exception

You can convert to json using below js code

  1. const getCircularReplacer = () => {
  2. const seen = new WeakSet();
  3. return (key, value) => {
  4. if (typeof value === "object" && value !== null) {
  5. if (seen.has(value)) {
  6. return;
  7. }
  8. seen.add(value);
  9. }
  10. return value;
  11. };
  12. };
  13. JSON.stringify(___grecaptcha_cfg.clients[0], getCircularReplacer());

Since it is cross origin iframe you can use it as chrome blocks it as shown in image below

Selenium的JavascriptExecutor没有返回任何内容。

huangapple
  • 本文由 发表于 2020年9月1日 19:18:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/63686622.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定