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 google-chrome 浏览上下文 .
中检索 navigator.plugins
的值
使用 google-chrome-devtools 我能够检索 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)
我已经完成了以下关于 循环引用 的讨论,我理解了这个概念。但是我不确定我应该如何解决这里的问题。
- Example of a circular reference in Javascript?
- Detecting and fixing circular references in JavaScript
- Is circular reference between objects a bad practice?
有人可以帮我取回 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 个描述应用程序中安装的插件的对象。 plugins
是 PluginArray
对象,用于通过名称或项目列表访问 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', '', '']
我正在尝试从
navigator.plugins
的值
使用 google-chrome-devtools 我能够检索 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)
我已经完成了以下关于 循环引用 的讨论,我理解了这个概念。但是我不确定我应该如何解决这里的问题。
- Example of a circular reference in Javascript?
- Detecting and fixing circular references in JavaScript
- Is circular reference between objects a bad practice?
有人可以帮我取回 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 个描述应用程序中安装的插件的对象。 plugins
是 PluginArray
对象,用于通过名称或项目列表访问 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', '', '']