-1
votes

Erreur JavaScript: erreur de référence circulaire en essayant de récupérer Navigator.plugins à l'aide de sélénium et de python

J'essaie de récupérer la valeur de navigator.plugins code> à partir d'un sélénium conduit Chromedriver initié Contexte de navigation em>.

en utilisant Je suis capable de récupérer navigator.useragent code> et navigator.plugins code> comme suit: P>

 navigator_useragent_plugins p>

mais en utilisant selenium em> s 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>

  • bloc de code: 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)
    
  • Sortie de la console: P>

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


0 commentaires

3 Réponses :


2
votes

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. Entrez la description de l'image ici

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')


12 commentaires

Avec Imprimer ("Plugins-> Nom:" + pilote.execute_script ("renvoyer array.from (navigator.plugins) .map (((nom}) => Nom);")) i ' m Voyant TypeError: Doit être STR, pas la liste


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]) Je récupère Chrome PDF Plugin , Chrome PDF Viewer 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 () à 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 ()


@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 () 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 .


@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?



1
votes

Je suppose que cela a quelque chose à voir avec le fait que navigatator.plugins renvoie un PlugInarray .

La page Pluginarray 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. xxx


5 commentaires

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 .


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.



0
votes

Référence circulaire

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>

NAVIGATORPUNS.PLUGINS H2>

Navigatorplugins.plugins renvoie un PlugInarray objet, répertoriant le Plugin Objets décrivant les plugins installés dans l'application. 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>


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 code>: p>

    ['Portable Document Format', '', '']
    
    • Sortie de la console: P>

      print(driver.execute_script("return Array.from(navigator.plugins).map(({description}) => description);"))
      
    • Pour obtenir la liste des nom nom em> des plugins code>: p>

      ['internal-pdf-viewer', 'mhjfbmdgcfjbbpaeojofohoefgiehjai', 'internal-nacl-plugin']
      
      • Sortie de la console: P>

        print(driver.execute_script("return Array.from(navigator.plugins).map(({filename}) => filename);"))
        
      • Pour obtenir la liste des em> description em> des plugins code>: p>

        ['Chrome PDF Plugin', 'Chrome PDF Viewer', 'Native Client']
        
        • Sortie de la console: P>

          print(driver.execute_script("return Array.from(navigator.plugins).map(({name}) => name);"))
          


0 commentaires