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.
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 surtrue
lorsque le l'agent utilisateur est sous la télécommande qui est initialement définie surfalse
.
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.
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