it-swarm.com.de

Kann eine Website erkennen, wenn Sie Selenium mit Chromdriver verwenden?

Ich habe Selenium mit Chromedriver getestet und habe festgestellt, dass einige Seiten erkennen können, dass Sie Selenium verwenden, obwohl es überhaupt keine Automatisierung gibt. Selbst wenn ich nur manuell mit Chrome durch Selenium und Xephyr browse, bekomme ich oft eine Seite, die besagt, dass verdächtige Aktivitäten entdeckt wurden. Ich habe mein User-Agent und meinen Browser-Fingerabdruck überprüft und sie sind alle identisch mit dem normalen Chrome-Browser.

Wenn ich zu diesen Sites in normalem Chrom browse, funktioniert alles gut, aber in dem Moment, in dem ich Selenium benutze, werde ich entdeckt.

Theoretisch sollten Chromedriver und Chrome für jeden Webserver genau gleich aussehen, aber irgendwie können sie ihn erkennen. 

Wenn Sie einen Testcode wünschen, probieren Sie folgendes aus:

from pyvirtualdisplay import Display
from Selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

Wenn Sie stubhub durchsuchen, werden Sie innerhalb einer oder zweier Anfragen umgeleitet und "blockiert". Ich habe dies untersucht und kann nicht herausfinden, wie sie feststellen können, dass ein Benutzer Selenium verwendet. 

Wie machen Sie das?

EDIT UPDATE:

Ich habe das Selenium IDE -Plugin in Firefox installiert und wurde gebannt, als ich mit dem zusätzlichen Firefox-Browser auf stubhub.com im normalen Firefox-Browser ging.

BEARBEITEN:

Bei der Verwendung von Fiddler zum Anzeigen der hin und her gesendeten HTTP-Anforderungen ist mir aufgefallen, dass die Anforderungen des gefälschten Browsers häufig "no-cache" im Antwortheader enthalten.

BEARBEITEN:

ergebnisse wie diese Gibt es eine Möglichkeit zu erkennen, dass ich mich auf einer Selenium Webdriver-Seite von Javascript befinde, schlagen Sie vor, dass es keine Möglichkeit geben sollte, festzustellen, wann Sie einen Webtreiber verwenden. Aber dieser Beweis legt etwas anderes nahe.

BEARBEITEN:

Die Website lädt einen Fingerabdruck auf ihre Server hoch, aber ich habe überprüft, und der Fingerabdruck von Selenium ist identisch mit dem Fingerabdruck bei der Verwendung von Chrome.

BEARBEITEN:

Dies ist eine der Fingerabdruck-Nutzdaten, die sie an ihre Server senden

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

Es ist identisch in Selenium und in Chrom

BEARBEITEN:

VPNs können nur einmal verwendet werden, werden jedoch nach dem Laden der ersten Seite erkannt. Offensichtlich wird Javascript ausgeführt, um Selenium zu erkennen.

220
Ryan Weinstein

Für Mac-Benutzer

Ersetzen der Variablen cdc_ Mit Vim oder Perl

Sie können vim verwenden oder, wie @Vic Seedoubleyew in der Antwort von @ Erti-Chris Eelmaa, Perl, darauf hingewiesen hat, die Variable cdc_ In chromedriver ( Weitere Informationen zu dieser Variablen finden Sie im Beitrag von @ Erti-Chris Eelmaa ). Die Verwendung von vim oder Perl verhindert, dass Sie den Quellcode neu kompilieren oder einen Hex-Editor verwenden müssen. Stellen Sie sicher, dass Sie eine Kopie des ursprünglichen chromedriver erstellen, bevor Sie versuchen, es zu bearbeiten. Die folgenden Methoden wurden auch mit chromedriver version 2.41.578706 Getestet.


sing Vim

vim /path/to/chromedriver

Nachdem Sie die obige Zeile durchlaufen haben, werden Sie wahrscheinlich eine Menge Kauderwelsch sehen. Mach Folgendes:

  1. Suchen Sie nach cdc_, Indem Sie /cdc_ Eingeben und return drücken.
  2. Aktivieren Sie die Bearbeitung durch Drücken von a.
  3. Löschen Sie eine beliebige Menge von $cdc_lasutopfhvcZLmcfl Und ersetzen Sie die gelöschte Menge durch die gleichen Zeichen. Andernfalls schlägt chromedriver fehl.
  4. Nachdem Sie die Bearbeitung abgeschlossen haben, drücken Sie esc.
  5. Um die Änderungen zu speichern und zu beenden, geben Sie :wq! Ein und drücken Sie return.
  6. Wenn Sie die Änderungen nicht speichern, aber beenden möchten, geben Sie :q! Ein und drücken Sie return.
  7. Sie sind fertig.

Gehen Sie zu dem geänderten chromedriver und doppelklicken Sie darauf. Ein terminal Fenster sollte sich öffnen. Wenn Sie killed nicht in der Ausgabe sehen, haben Sie den Treiber erfolgreich geändert.


mit Perl

Die folgende Zeile ersetzt cdc_ Durch dog_:

Perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

Stellen Sie sicher, dass die Ersatzzeichenfolge die gleiche Anzahl von Zeichen wie die Suchzeichenfolge enthält, da andernfalls das chromedriver fehlschlägt.

Perl Erklärung

s///g Gibt an, dass Sie nach einer Zeichenfolge suchen und diese global durch eine andere Zeichenfolge ersetzen möchten (ersetzt alle Vorkommen).

z. B. s/string/replacment/g

Damit,

s/// Bezeichnet das Suchen und Ersetzen eines Strings.

cdc_ Ist der Suchbegriff.

dog_ Ist die Ersatzzeichenfolge.

g ist der globale Schlüssel, der jedes Vorkommen der Zeichenfolge ersetzt.

So überprüfen Sie, ob der Perl-Ersatz funktioniert hat

Die folgende Zeile gibt jedes Vorkommen der Suchzeichenfolge cdc_ Aus:

Perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver

Wenn dies nichts zurückgibt, wurde cdc_ Ersetzt.

Umgekehrt können Sie dies verwenden:

Perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver

um zu sehen, ob sich Ihre Ersatzzeichenfolge dog_ jetzt in der Binärdatei chromedriver befindet. Wenn dies der Fall ist, wird die Ersatzzeichenfolge auf der Konsole gedruckt.

Gehen Sie zu dem geänderten chromedriver und doppelklicken Sie darauf. Ein terminal Fenster sollte sich öffnen. Wenn Sie killed nicht in der Ausgabe sehen, haben Sie den Treiber erfolgreich geändert.


Zusammenfassung

Stellen Sie nach dem Ändern der Binärdatei chromedriver sicher, dass der Name der geänderten Binärdatei chromedriverchromedriver lautet und dass die ursprüngliche Binärdatei entweder von ihrem ursprünglichen Speicherort verschoben oder umbenannt wird.


Meine Erfahrung mit dieser Methode

Ich wurde zuvor bei dem Versuch, mich anzumelden, auf einer Website entdeckt, aber nachdem ich cdc_ Durch eine Zeichenfolge gleicher Größe ersetzt hatte, konnte ich mich anmelden. Sie könnten aus einer Vielzahl anderer Gründe blockiert werden, selbst wenn Sie diese Methode anwenden. Daher müssen Sie möglicherweise versuchen, auf die Site zuzugreifen, die Sie über ein VPN, ein anderes Netzwerk oder über Ihre Daten erkannt hat.

18
colossatr0n

Grundsätzlich ist die Selenium-Erkennung so, dass sie auf vordefinierte Javascript-Variablen prüft, die beim Ausführen mit Selenium angezeigt werden. Die Bot-Erkennungsskripte sehen in der Regel in allen Variablen (im Fensterobjekt) alles aus, das Word "Selenium"/"Webdriver" enthält, sowie Dokumentvariablen mit den Namen $cdc_ und $wdc_. Natürlich hängt das alles davon ab, in welchem ​​Browser Sie sich befinden. Alle verschiedenen Browser zeigen verschiedene Dinge auf.

Für mich habe ich Chrome verwendet, also alles, was ich tun musste musste sicherstellen, dass $cdc_ nicht mehr als Dokumentvariable existierte, und voila (Chromedriver-Quellcode herunterladen, Chromedriver ändern und $cdc_ erneut kompilieren unter anderem Namen.)

dies ist die Funktion, die ich im Chromedriver modifiziert habe:

call_function.js:

function getPageCache(opt_doc) {
  var doc = opt_doc || document;
  //var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  var key = 'randomblabla_';
  if (!(key in doc))
    doc[key] = new Cache();
  return doc[key];
}

(Beachte den Kommentar, alles was ich getan habe, habe ich $cdc_ in randomblabla_ umgewandelt.

Hier ist ein Pseudo-Code, der einige der von Bot-Netzwerken verwendeten Techniken demonstriert:

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__Selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__Selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_Selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('Selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

laut Benutzer @szx ist es auch möglich, die Datei chromedriver.exe einfach im Hex-Editor zu öffnen und einfach manuell zu ersetzen, ohne das Kompilieren tatsächlich durchzuführen. 

107

Wie wir bereits in der Frage und den geposteten Antworten herausgefunden haben, gibt es hier einen Anti-Web-Scraping- und einen Bot-Erkennungsdienst namens "Distil Networks" . Und laut dem CEO des Unternehmens interview :

Obwohl sie neue Bots erstellen können, haben wir einen Weg gefunden, .__ zu identifizieren. Selen ist ein Werkzeug, das sie verwenden. Daher blockieren wir Selen Nr egal wie oft sie auf diesem Bot iterieren. Wir machen das jetzt. mit Python und vielen verschiedenen Technologien. Sobald wir ein Muster sehen, __. tauchen aus einem Bot-Typ auf, dann arbeiten wir daran, die. Technologie, die sie verwenden, und identifizieren sie als bösartig.

Es braucht Zeit und zusätzliche Herausforderungen, um zu verstehen, wie genau sie Selen erkennen, aber was können wir im Moment sicher sagen:

  • dies hat nichts mit den Aktionen zu tun, die Sie mit Selenium durchführen. Sobald Sie zu der Site navigieren, werden Sie sofort erkannt und verboten. Ich habe versucht, künstliche zufällige Verzögerungen zwischen den Aktionen hinzuzufügen. Nach dem Laden der Seite machen Sie eine Pause - nichts hat geholfen
  • es geht auch nicht um den Fingerabdruck des Browsers - es wurde in mehreren Browsern mit sauberen Profilen und nicht in inkognito-Modi versucht - nichts half
  • da es sich laut dem Hinweis im Interview um "Reverse Engineering" handelt, vermute ich, dass dies mit einigen JS-Codes ausgeführt wird, die im Browser ausgeführt werden. Dies zeigt, dass es sich um einen Browser handelt, der über den Selenium-Webtreiber automatisiert wird

Beschlossen, es als Antwort zu posten, da eindeutig:

Kann eine Website erkennen, wenn Sie Selenium mit Chromdriver verwenden?

Ja.


Was ich bisher noch nicht experimentiert habe, ist älteres Selenium und ältere Browserversionen. Theoretisch könnte Selenium an einem bestimmten Punkt implementiert/hinzugefügt werden, auf das sich der Distil Networks-Bot-Detektor derzeit verlässt. Wenn dies der Fall ist, können wir feststellen (ja, lassen Sie uns den Detektor erkennen), an welchem ​​Punkt/in welcher Version eine relevante Änderung vorgenommen wurde, und schauen Sie sich das Änderungsprotokoll und die Änderungssets an. Dies könnte uns weitere Informationen darüber geben, wo Sie suchen müssen und was ist es, was sie verwenden, um einen Web-Treiber-Browser zu erkennen. Es ist nur eine Theorie, die getestet werden muss.

71
alecxe

Beispiel für die Implementierung auf wellsfargo.com: 

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""
18
aianitro

partial interface Navigator { readonly attribute boolean webdriver; };

Das Webdriver-IDL-Attribut der Navigator-Schnittstelle muss den Wert des Flag für Webdriver-Aktiv zurückgeben, der anfangs falsch ist.

Mit dieser Eigenschaft können Websites feststellen, dass der Benutzeragent von WebDriver kontrolliert wird, und kann dazu verwendet werden, Denial-of-Service-Angriffe zu verringern.

Direkt aus dem 2017 W3C Editor's Draft of WebDriver entnommen. Dies impliziert stark, dass zumindest zukünftige Iterationen der Selenium-Fahrer identifiziert werden können, um Missbrauch zu verhindern. Letztendlich ist es ohne den Quellcode schwer zu sagen, was genau den Chrome-Treiber speziell erkennt. 

9
bryce

Versuchen Sie, Selenium mit einem bestimmten Benutzerprofil von Chrome zu verwenden. Auf diese Weise können Sie es als bestimmten Benutzer verwenden und definieren, was Sie möchten. Wenn dies der Fall ist, wird es als "echter" Benutzer verwendet Sie werden den Unterschied bei den Tags sehen.

Zum Beispiel:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# add here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

chrom-Tag-Liste hier

9
Kobi K

Ergebnis der Verschleierung von JavaScripts

Ich habe den Chromedriver-Quellcode überprüft. Dadurch werden einige Javascript-Dateien in den Browser eingefügt. 
Jede Javascript-Datei auf diesem Link wird in die Webseiten eingefügt:https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Also habe ich Reverse Engineering verwendet und die js-Dateien durch Hex-Bearbeitung obfuscated. Jetzt war ich mir sicher, dass keine Javascript-Variablen, Funktionsnamen und feste Zeichenfolgen verwendet wurden, um die Selen-Aktivität aufzudecken. Trotzdem erkennen einige Sites und reCaptcha Selen! 
Vielleicht überprüfen sie die Modifikationen, die durch die Ausführung von Chromedriver Js verursacht werden :) 


Edit 1:

Chrome-Navigator-Parameteränderung

Ich habe entdeckt, dass es einige Parameter in 'Navigator' gibt, die kurz die Verwendung von Chromdriver aufdecken. Dies sind die Parameter:

  • "navigator.webdriver" Im nicht automatisierten Modus ist es "undefiniert". Im automatisierten Modus ist es "wahr".
  • "navigator.plugins" Ein Headless hat 0 Länge. Also habe ich ein paar gefälschte Elemente hinzugefügt, um den Prozess der Längenprüfung des Plugins zu täuschen.
  • "navigator.languages" wurde auf den Standard-Chromwert "[" en-US "," en "," es "]" gesetzt.

Was ich brauchte, war eine Chrome-Erweiterung, um Javascript auf den Webseiten auszuführen. Ich habe eine Erweiterung mit dem js-Code erstellt, die im Artikel enthalten ist, und verwendete einen anderen Artikel , um die gezippte Erweiterung zu meinem Projekt hinzuzufügen. Ich habe die Werte erfolgreich geändert. Trotzdem hat sich nichts geändert!

Ich habe keine anderen Variablen wie diese gefunden, aber das bedeutet nicht, dass sie nicht existieren. ReCaptcha erkennt immer noch einen Chrom-Treiber. Es sollten also mehr Variablen zum Ändern vorhanden sein. Der nächste Schritt sollte Reverse Engineering der Detektordienste sein, die ich nicht machen möchte.

Now Ich bin mir nicht sicher, ob es sich lohnt, mehr Zeit für diesen Automatisierungsprozess aufzuwenden oder nach alternativen Methoden zu suchen!

7
ShayanKM

Selbst wenn Sie alle richtigen Daten senden (z. B. zeigt Selenium keine Erweiterung, haben Sie eine angemessene Auflösung/Bittiefe, & c), gibt es eine Reihe von Diensten und Tools, die das Besucherverhalten bestimmen, um zu bestimmen, ob die Akteur ist ein Benutzer oder ein automatisiertes System.

Wenn Sie zum Beispiel eine Website besuchen und dann sofort eine Aktion ausführen, indem Sie die Maus in weniger als einer Sekunde direkt auf die entsprechende Schaltfläche bewegen, ist dies kein Benutzer, der tatsächlich etwas tun würde.

Es kann auch als Debugging-Tool nützlich sein, wenn Sie eine Website wie https://panopticlick.eff.org/ verwenden, um zu überprüfen, wie einzigartig Ihr Browser ist. Es hilft Ihnen auch zu überprüfen, ob es bestimmte Parameter gibt, die angeben, dass Sie in Selenium laufen. 

5
lfaraone

Es hört sich an, als ob sie sich hinter einer Firewall für Webanwendungen befinden. Werfen Sie einen Blick auf modsecurity und owasp, um zu sehen, wie diese funktionieren. In der Realität fragen Sie sich, wie Sie die Umgehung der Bot-Erkennung durchführen können. Dafür ist der Selenium-Web-Treiber nicht gedacht. Es dient zum Testen Ihrer Webanwendung, die nicht auf andere Webanwendungen trifft. Es ist möglich, aber im Grunde müsste man sich ansehen, wonach eine WAF in ihrem Regelsatz sucht, und dies mit Selenium vermeiden, wenn man kann. Selbst dann funktioniert es immer noch nicht, weil Sie nicht wissen, welche WAF sie verwenden. Sie haben den richtigen ersten Schritt getan, nämlich den Benutzeragenten zu fälschen. Wenn das nicht funktioniert hat, ist eine WAF vorhanden und Sie müssen wahrscheinlich schwieriger werden.

Bearbeiten: Punkt aus anderer Antwort übernommen. Stellen Sie sicher, dass Ihr Benutzeragent zuerst richtig eingestellt ist. Vielleicht haben Sie einen lokalen Webserver angesprochen oder den Datenverkehr erfasst.

5
Bassel Samman

Firefox soll window.navigator.webdriver === true einstellen, wenn mit einem Web-Treiber gearbeitet wird. Dies entsprach einer der älteren Spezifikationen (z. B. archive.org ), aber ich konnte sie nicht in der new finden, abgesehen von einigen sehr vagen Formulierungen in den Anhängen.

Ein Test dafür ist im Selenium-Code in der Datei fingerprint_test.js , wo der Kommentar am Ende lautet "Derzeit nur in Firefox implementiert", aber ich konnte keinen Code in dieser Richtung mit einfachen greping identifizieren , weder im aktuellen (41.0.2) Firefox-Release-Baum noch im Chromium-Baum.

Ich habe auch einen Kommentar zu einem älteren Commit bezüglich Fingerprinting im Firefox-Treiber b82512999938 vom Januar 2015 gefunden . Dieser Code befindet sich noch im Selenium GIT-Master, der gestern unter javascript/firefox-driver/extension/content/server.js heruntergeladen wurde, mit einem Kommentar, der auf den etwas anders formulierten Anhang in der aktuellen Spezifikation des w3c-Webtreibers verweist.

5
deamentiaemundi

Die Bot-Erkennung, die ich gesehen habe, scheint komplexer oder zumindest anders zu sein als in den Antworten unten.

EXPERIMENT 1:

  1. Ich öffne einen Browser und eine Webseite mit Selenium von einer Python-Konsole aus. 
  2. Die Maus befindet sich bereits an einem bestimmten Ort, an dem ein Link angezeigt wird, sobald die Seite geladen wird. Ich bewege niemals die Maus.  
  3. Ich drücke einmal die linke Maustaste (dies ist notwendig, um den Fokus von der Konsole, auf der Python ausgeführt wird, zum Browser zu bringen). 
  4. Ich drücke die linke Maustaste erneut (denken Sie daran, dass sich der Cursor über einem bestimmten Link befindet).
  5. Der Link wird wie üblich geöffnet.

EXPERIMENT 2:

  1. Wie zuvor öffne ich einen Browser und die Webseite mit Selenium von einer Python-Konsole aus. 

  2. Dieses Mal verwende ich, anstatt mit der Maus zu klicken, Selenium (in der Python-Konsole), um dasselbe Element mit einem zufälligen Versatz anzuklicken. 

  3. Der Link wird nicht geöffnet, aber ich werde zu einer Anmeldeseite weitergeleitet.

AUSWIRKUNGEN:

  • das Öffnen eines Webbrowsers über Selenium schließt nicht aus, dass ich als Mensch erscheint
  • wenn Sie die Maus wie einen Menschen bewegen, müssen Sie nicht als Mensch eingestuft werden
  • wenn Sie über Selenium etwas mit Versatz anklicken, wird der Alarm ausgelöst

Scheint geheimnisvoll, aber ich denke, sie können nur feststellen, ob eine Aktion von Selenium ausgeht oder nicht, während es ihnen egal ist, ob der Browser selbst über Selenium geöffnet wurde oder nicht. Oder können sie feststellen, ob das Fenster den Fokus hat? Es wäre interessant zu erfahren, ob jemand Einblicke hat.

4
M3RS

Außerdem habe ich festgestellt, dass einige Websites eine Plattform verwenden, die den User Agent überprüft. Wenn der Wert "HeadlessChrome" enthält, kann das Verhalten bei Verwendung des Headless-Modus seltsam sein.

Die Problemumgehung besteht darin, den Benutzeragentenwert zu überschreiben, beispielsweise in Java: chromeOptions.addArguments ("- Benutzeragent = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/73.0.3683.86 Safari/537.36 ");

2
Adi Ohana

Einige Websites erkennen dies:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}
2
Néstor Lim

Schreiben Sie eine HTML-Seite mit dem folgenden Code. Sie werden sehen, dass Selenium im DOM ein Webdriver-Attribut in der outerHTML anwendet

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

2
PC3TJ

Am einfachsten scheint es mir bei Selenium zu sein, das XHR abzufangen, das den Browser-Fingerabdruck zurücksendet.

Da dies jedoch nur ein Problem mit Selen ist, ist es besser, etwas anderes zu verwenden. Selen soll solche Dinge leichter machen, nicht viel schwieriger.

1
pguardiario

Zusätzlich zu der großartigen Antwort von @ Erti-Chris Eelmaa gibt es ärgerlichen window.navigator.webdriver und er ist schreibgeschützt. Ereignis, wenn Sie den Wert in false ändern, hat es noch true. Deswegen kann der Browser, der von automatisierter Software gesteuert wird, immer noch erkannt werden . MDN

Die Variable wird durch das Flag --enable-automation in Chrome verwaltet. Der Chromdriver startet Chrom mit dieser Flagge und Chrom setzt den window.navigator.webdriver auf true. Sie finden es hier . Sie müssen das Flag zum Ausschließen von Schaltern hinzufügen. Zum Beispiel (Golang):

package main

import (
    "github.com/tebeka/Selenium"
    "github.com/tebeka/Selenium/chrome"
)

func main() {

caps := Selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := Selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}
0
FDG

Ich habe festgestellt, dass die JavaScript-Variable "key" folgendermaßen geändert wurde:

//Fools the website into believing a human is navigating it
        ((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

funktioniert für einige Websites, wenn Selenium Webdriver zusammen mit Google Chrome verwendet wird, da viele Websites nach dieser Variablen suchen, um zu verhindern, dass Selenium sie verschrottet.

0
Juliagu