【问题标题】:Selenium JavascriptExecutor doesnt return anythingSelenium JavascriptExecutor 不返回任何内容
【发布时间】:2020-12-20 12:09:40
【问题描述】:

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

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

这是它在控制台中给我的:

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

【问题讨论】:

  • 您是否仔细检查了___grecaptcha_cfg.clients[0] 以确保它返回不为空?
  • @elMeroMero 是的人

标签: javascript java selenium google-chrome


【解决方案1】:

您的 js 脚本应该返回它。尝试以下更改

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

这样你的代码就会像

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

由于是JS对象json所以抛出循环引用异常

你可以使用下面的js代码转换成json

const getCircularReplacer = () => {
  const seen = new WeakSet();
  return (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) {
        return;
      }
      seen.add(value);
    }
    return value;
  };
};
JSON.stringify(___grecaptcha_cfg.clients[0], getCircularReplacer());

由于它是跨源 iframe,您可以将其用作 chrome 块,如下图所示

【讨论】:

  • 给了我线程“主”org.openqa.selenium.JavascriptException 中的异常:javascript 错误:循环引用
  • 能否提供网址?
  • @AhmetAzizBeşli 这是 HTML Dom 循环引用,它不是有效的 json。您应该从 javascript 获取所需的值,然后将其返回给 java
  • 是否可以将该循环引用转换为 JSON 对象?
猜你喜欢
  • 2012-08-28
  • 2020-04-27
  • 2019-04-06
  • 2012-02-15
  • 2020-09-07
  • 2021-11-22
  • 2015-11-06
  • 2013-11-14
  • 2014-03-23
相关资源
最近更新 更多