web-dev-qa-db-fra.com

Webdriver Selenium: modification de l'indicateur navigator.webdriver pour empêcher la détection du sélénium

J'essaie d'automatiser une tâche très basique dans un site Web en utilisant Selenium et chrome mais en quelque sorte le site Web détecte quand chrome est piloté par Selenium et bloque chaque demande) Je soupçonne que le site Web s'appuie sur une variable DOM exposée comme celle-ci https://stackoverflow.com/a/41904453/648236 pour détecter le navigateur piloté par Selenium.

Ma question est, est-il possible de rendre le drapeau navigator.webdriver faux? Je suis prêt à aller jusqu'à recompiler la source Selenium après avoir apporté des modifications, mais je n'arrive pas à trouver la source NavigatorAutomationInformation n'importe où dans le référentiel https://github.com/SeleniumHQ/Selenium

Toute aide est très appréciée

P.S: J'ai également essayé ce qui suit depuis https://w3c.github.io/webdriver/#interface

Object.defineProperty(navigator, 'webdriver', {
    get: () => false,
  });

Mais il ne met à jour la propriété qu'après le chargement initial de la page. Je pense que le site détecte la variable avant l'exécution de mon script.

8
Ajanth

Vous l'avez bien vu. La réponse que vous avez mentionnée fait référence à l'état de W3C Editor's Draft de 2017 qui a évolué au cours des deux dernières années. La mise en œuvre actuelle parle strictement que:

Le webdriver-active L'indicateur est défini sur true lorsque le l'agent utilisateur est sous la télécommande qui est initialement définie sur false.

Plus loin,

Navigator includes NavigatorAutomationInformation;

Il est à noter que:

L'interface NavigatorAutomationInformation ne doit pas être exposée sur WorkerNavigator.

L'interface NavigatorAutomationInformation est définie comme suit:

interface mixin NavigatorAutomationInformation {
    readonly attribute boolean webdriver;
};

qui retourne vrai si webdriver-active flag est défini, false sinon.

Finalement, le navigator.webdriver définit un moyen standard pour les agents utilisateurs coopérants d'informer le document qu'il est contrôlé par WebDriver , afin que d'autres chemins de code puissent être déclenchée pendant l'automatisation.

La modification de l'un de ces paramètres peut bloquer la navigation et obtenir l'instance WebDriver détectée.

4
DebanjanB

Avant (dans la fenêtre de la console du navigateur):

> navigator.webdriver
true

Changement (en sélénium):

// C#
var options = new ChromeOptions();
options.AddExcludedArguments(new List<string>() { "enable-automation" });

// Python
options.add_experimental_option("excludeSwitches", ['enable-automation'])

Après (dans la fenêtre de la console du navigateur):

> navigator.webdriver
undefined
11
someone else