J'essaie de récupérer la valeur de en utilisant Google-chrome-devtools Je suis capable de récupérer mais en utilisant selenium em> s bloc de code: p>
Sortie de la console: P>
navigator.plugins code> à partir d'un sélénium conduit Chromedriver initié Google-Chrome Contexte de navigation em>.
navigator.useragent code> et
navigator.plugins code> comme suit: P>
exécuté Te_script () Code> Méthode suis capable d'extraire le
navigator.useragent code> mais
navigator.plugins code> lève la référence référence em> orthographe: p>
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)
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;"))
3 Réponses :
Il peut y avoir une question de sérialisation lorsque vous interrogez une structure de données non primitive d'un royaume de navigateur. En inspectant de près la hiérarchie d'un seul plugin, nous pouvons la voir posséder une structure récursive qui est un problème pour le sérialisateur.
Si vous avez besoin d'une liste de plugins, essayez de renvoyer une chaîne Serialized, nouvelle chaîne séparée, puis divisez-la par un symbole Newline dans le royaume Python. P>
Par exemple: P>
plugins = driver.execute_script("return Array.from(navigator.plugins).map(({name}) => name).join('\n');").split('\n')
Avec Imprimer ("Plugins-> Nom:" + pilote.execute_script ("renvoyer array.from (navigator.plugins) .map (((nom}) => Nom);")) code> i ' m Voyant TypeError: Doit être STR, pas la liste i>
OK, alors retournez-le comme une chaîne séparée de nouvelle ligne. Par exemple: retour Array.from (Navigator.plugins) .map (({nom}) => nom) .join ('\ n'); Ensuite, il suffit de la diviser par \ n dans votre code Python pour obtenir une liste de Stirngs.
Avec impression ("plugins-> nom:" + pilote.execute_script ("renvoyer array.from (navigator.plugins) .map (((nom}) => nom);") [0]) code > Je récupère Chrome PDF Plugin I>, Chrome PDF Viewer i> et ainsi de suite.
Ce n'est pas ce que j'ai suggéré ci-dessus. Dans votre cas, vous venez de retourner le nom d'un premier plugin disponible. Ce que j'ai suggéré de faire, c'est de retourner une nouvelle chaîne séparée de votre appel à Execute_script, puis de la trancher par "\ n" dans votre code Python pour obtenir une liste de Stirngs. Par exemple: plugins = pilote.execute_script ("renvoyer array.from (navigator.plugins) .map (((nom}) => nom) .join ('\ n')"). Split ('\ n') ('Plugins-> Nom:' + plugins)
@Viacheslavmoskalenko Tout ce que vous devez ajouter est .join () code> à la fin et il retournera une chaîne de noms délimitée par des virgules,
renvoyer array.from (Navigator.plugins) .map ((( {nom}) => nom) .join () code>
@Jeffcc, le séparateur pourrait être n'importe quoi. Une nouvelle ligne n'est qu'un exemple. Si un plugin a "", "dans le nom du nom, nous ne devrions pas compter sur le séparateur par défaut, qui est une virgule.
Compris mais vous prenez une gamme de ficelles, y rejoignant, puis la divonorciant. Je ne comprends pas le but. Votre réponse retourne un tableau, ce qui est probablement un problème. Si vous ajoutez juste .join () code> il retournera une chaîne tout ira bien.
Je vais ajuster ma réponse parce que je n'étais pas au courant exécutant_script ne peut que renvoyer une chaîne. Si vous examinez mes commentaires ci-dessus, j'ai suggéré de colliver une liste de chaînes (les noms de plug-in) pour être divisés ultérieurement dans le domaine Python. L'auteur a besoin d'une liste de plugins disponibles, pourquoi nous devons diviser une chaîne renvoyée par EXECUTE_Script.
@Debanjanb, cela correspond-il en résultat que vous avez initialement été envisagé?
@Viacheslavmoskalenko Votre réponse initiale m'a emmené à un point où je suis capable de creuser davantage. Certainement, cela a été utile. J'essaie toujours de récupérer les valeurs plugin i>.
@Viacheslavmoskalenko La version précédente de votre réponse fonctionnait. Pouvez-vous mettre à jour la ligne de code selon la version précédente s'il vous plaît?
@Debanjanb, pourriez-vous, s'il vous plaît, clarifier? Qu'est-ce qui ne fonctionne pas pour le moment?
Je suppose que cela a quelque chose à voir avec le fait que navigatator.plugins code>
renvoie un PlugInarray .
La page Pluginarray code> Code> répertorie les méthodes et les propriétés disponibles et avec qui j'ai écrit ce code qui renvoie la liste des noms. Vous pouvez l'adapter à tout ce dont vous avez besoin. P>
Certainement, cette réponse aide à faire avancer un pas en avant. D'une manière ou d'une autre, j'ai besoin d'obtenir les valeurs plugin i>.
Quelles valeurs de plugin recherchez-vous spécifiquement?
Je cherchais à extraire les valeurs de 1) Chrome PDF Plugin 2) Chrome PDF Viewer 3) Client natif
Quelles valeurs recherchez-vous? Avez-vous regardé la page pluginarray que j'ai liée dans ma réponse? Il relie la page du plug-in qui possède les différentes propriétés que vous pouvez accéder: Description, Nom de fichier et version. Est-ce ce que vous cherchez ou?
Alors, quel est le but global ici? Vous devriez probablement mettre à jour votre question avec cela. Essayez-vous de localiser un plugin spécifique, assurez-vous qu'un plugin spécifique n'est pas installé, etc.? Une fois que nous aurons cela, nous pouvons mieux créer une réponse.
A Référence circulaire A > Se produit si deux objets distincts transmettent des références les unes sur les autres. Le référencement circulaire implique que les 2 objets référencés sont étroitement couplés et les modifications apportées à un objet peuvent nécessiter des modifications dans d'autres aussi. P> Navigatorplugins.plugins renvoie un PlugInarray objet, répertoriant le Plugin Objets décrivant les plugins installés dans l'application. Pour extraire les propriétés Navigator.Plugins Code> Vous pouvez utiliser les solutions suivantes: P> Pour obtenir la liste des noms em> des plugins Sortie de la console: P>
Pour obtenir la liste des nom nom em> des plugins Sortie de la console: P>
Pour obtenir la liste des em> description em> des plugins Sortie de la console: P>
NAVIGATORPUNS.PLUGINS H2>
Plugins Code> est
PlugInarray CODE> Objet utilisé pour accéder au plug-in code> Objets par nom ou comme liste d'éléments. La valeur renvoyée a la propriété de longueur et prend en charge l'accès à des éléments individuels à l'aide de la notation de support (par exemple,
plugins [2] code>), ainsi que via l'élément
(index) code> et
namedItem ("Nom") Code> Méthodes. P>
code>: p>
['Portable Document Format', '', '']
print(driver.execute_script("return Array.from(navigator.plugins).map(({description}) => description);"))
code>: p>
['internal-pdf-viewer', 'mhjfbmdgcfjbbpaeojofohoefgiehjai', 'internal-nacl-plugin']
print(driver.execute_script("return Array.from(navigator.plugins).map(({filename}) => filename);"))
code>: p>
['Chrome PDF Plugin', 'Chrome PDF Viewer', 'Native Client']
print(driver.execute_script("return Array.from(navigator.plugins).map(({name}) => name);"))