javascript 错误:尝试使用 Selenium 和 Python 检索 navigator.plugins 时出现循环引用错误

问题描述 投票:0回答:4

我正在尝试从

Selenium
驱动的ChromeDriver启动google-chrome中检索navigator.plugins的值。

使用 我可以检索

navigator.userAgent
navigator.plugins
,如下所示:

但是使用Selenium

execute_script()
方法我可以提取
navigator.userAgent
但是
navigator.plugins
会引发以下循环引用错误:

  • 代码块:

    from selenium import webdriver 
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://www.google.com/")
    print("userAgent: "+driver.execute_script("return navigator.userAgent;"))
    print("plugins: "+driver.execute_script("return navigator.plugins;"))
    
  • 控制台输出:

    userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
    Traceback (most recent call last):
      File "C:\Users\Soma Bhattacharjee\Desktop\Debanjan\PyPrograms\navigator_properties.py", line 19, in <module>
        print("vendor: "+driver.execute_script("return navigator.plugins;"))
      File "C:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 636, in execute_script
        'args': converted_args})['value']
      File "C:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
      File "C:\Python\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.JavascriptException: Message: javascript error: circular reference
      (Session info: chrome=83.0.4103.116)
    

我已经经历了以下关于“循环引用”的讨论,我理解了这个概念。但我不知道应该如何解决这里的问题。

    Javascript 中循环引用的示例?
  • 检测并修复 JavaScript 中的循环引用
  • 对象之间的循环引用是一种不好的做法吗?
  • 有人可以帮我找回
navigator.plugins

吗?

    

javascript selenium selenium-webdriver navigator circular-reference
4个回答
3
投票

如果您需要插件列表,请尝试仅返回序列化的、换行符分隔的字符串,然后在 Python 领域中用换行符分隔它。

例如:

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



2
投票

navigator.plugins

 返回一个 
PluginArray 有关。

PluginArray

页面列出了可用的方法和属性,我用它们编写了返回名称列表的代码。您可以根据需要进行调整。

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



0
投票
如果两个单独的对象相互传递引用,就会发生

循环引用

。循环引用意味着相互引用的 2 个对象紧密耦合,对一个对象的更改可能也需要对其他对象进行更改。

NavigatorPlugins.plugins


NavigatorPlugins.plugins

返回一个

PluginArray 对象,列出描述应用程序中安装的插件的 Plugin 对象。 pluginsPluginArray

 对象,用于通过名称或项目列表访问 
Plugin
 对象。返回的值具有 length 属性,并支持使用括号表示法(例如 
plugins[2]
)以及通过 
item(index)
namedItem("name")
 方法访问单个项目。
要提取 

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

要获取
    plugins
  • names 列表:

    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', '', '']

      
      
只需放弃可执行脚本中的

0
投票
关键字即可。这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.