javascript error: circular reference error while trying to retrieve navigator.plugins using Selenium and Python

javascript error: circular reference error while trying to retrieve navigator.plugins using Selenium and Python

我正在尝试从 driven initiated 浏览上下文 .

中检索 navigator.plugins 的值

使用 我能够检索 navigator.userAgentnavigator.plugins 如下:

但是使用 Seleniumexecute_script() 方法我能够提取 navigator.userAgent 但是 navigator.plugins 引发以下 循环引用错误:

我已经完成了以下关于 循环引用 的讨论,我理解了这个概念。但是我不确定我应该如何解决这里的问题。

有人可以帮我取回 navigator.plugins 吗?

当您从浏览器领域查询非原始数据结构时,可能会出现序列化问题。 通过仔细检查单个插件的层次结构,我们可以看到它具有递归结构,这是序列化程序的问题。

如果您需要一个插件列表,请尝试只返回一个序列化的、以换行符分隔的字符串,然后在 Python 领域中用换行符将其拆分。

例如:

plugins = driver.execute_script("return Array.from(navigator.plugins).map(({name}) => name).join('\n');").split('\n')

我假设它与 navigator.plugins returns a PluginArray.

这一事实有关

PluginArray 页面列出了可用的方法和属性,并且我编写了这段代码 returns 名称列表。您可以根据需要调整它。

print("plugins: " + driver.execute_script("var list = [];for(var i = 0; i < navigator.plugins.length; i++) { list.push(navigator.plugins[i].name); }; return list.join();"))

循环引用

如果两个单独的对象相互传递引用,则会出现 circular reference。循环引用意味着相互引用的 2 个对象紧密耦合,对一个对象的更改可能也需要更改其他对象。


NavigatorPlugins.plugins

NavigatorPlugins.plugins returns a PluginArray object, listing the Plugin 个描述应用程序中安装的插件的对象。 pluginsPluginArray 对象,用于通过名称或项目列表访问 Plugin 对象。返回值的长度为 属性 并支持使用括号表示法(例如 plugins[2])以及通过 item(index)namedItem("name") 方法访问单个项目。


要提取 navigator.plugins 属性,您可以使用以下解决方案:

  • 获取plugins名字的列表:

    print(driver.execute_script("return Array.from(navigator.plugins).map(({name}) => name);"))
    
    • 控制台输出:

      ['Chrome PDF Plugin', 'Chrome PDF Viewer', 'Native Client']
      
  • 获取plugins文件名的列表:

    print(driver.execute_script("return Array.from(navigator.plugins).map(({filename}) => filename);"))
    
    • 控制台输出:

      ['internal-pdf-viewer', 'mhjfbmdgcfjbbpaeojofohoefgiehjai', 'internal-nacl-plugin']
      
  • 获取plugins描述列表:

    print(driver.execute_script("return Array.from(navigator.plugins).map(({description}) => description);"))
    
    • 控制台输出:

      ['Portable Document Format', '', '']