web-dev-qa-db-fra.com

Impossible d'utiliser Selenium pour automatiser la connexion au site Chase

Lorsque j'essaie de me connecter au site Web Chase à l'aide de Selenium (Python), je reçois le message d'erreur suivant:

Chase Login Failure Image

Cependant, l'utilisation d'une connexion "humaine" fonctionne correctement. Il semble que lorsque Selenium trouve un élément, il déclenche le problème.

Suis-je en train de manquer quelque chose? J'ai essayé de trouver la réponse sur stackoverflow mais en vain.

Mettre à jour:

Le résultat attendu est que le script me permettrait avec succès de me connecter par programmation.

Voici l'exemple de code ci-dessous:

import time
import os

from Selenium import webdriver

CHASE_USER_ID = os.getenv('CHASE_USER_ID', None)
CHASE_PASSWORD = os.getenv('CHASE_PASSWORD', None)

assert CHASE_USER_ID is not None, 'Chase user id not set'
assert CHASE_PASSWORD is not None, ' Chase password not set'


def main():
    chrome_options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(r'./chromedriver', chrome_options=chrome_options)

    try:
        driver.get('https://secure07c.chase.com/web/auth/#/logon/logon/chaseOnline?')

        time.sleep(2)

        user_element = driver.find_element_by_id('userId-input-field')  # Finding an element here seems to make the login process fail 
        user_element.send_keys(CHASE_USER_ID)

        password_element = driver.find_element_by_id('password-input-field')
        password_element.send_keys(CHASE_PASSWORD)

        time.sleep(2)

        password_element.submit()

        time.sleep(10)
    finally:
        driver.quit()


if __name__ == '__main__':
    main()
15
jsmiao

J'ai pris votre code et simplifié la structure et exécuté le test avec un minimum de lignes de code comme suit:

from Selenium import webdriver
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.webdriver.support.ui import WebDriverWait


options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://secure07c.chase.com/web/auth/#/logon/logon/chaseOnline?")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.jpui.input.logon-xs-toggle.clientSideError"))).send_keys("jsmiao")
driver.find_element_by_css_selector("input.jpui.input.logon-xs-toggle#password-input-field").send_keys("hello")
driver.find_element_by_css_selector("button#signin-button>span.label").click()

De même, selon votre observation, j'ai frappé le même barrage routier avec l'erreur que:

Chase Login Failure Image

Il semble que la click() sur l'élément avec du texte comme Connexion se produit. Bien que la recherche nom d'utilisateur/ mot de passe soit lancée mais le processus est interrompu. En inspectant la arborescence DOM de la page Web, vous constaterez qu'une partie de la balise <script> Fait référence à JavaScripts ayant le mot clé dist . Par exemple:

  • <script src="https://static.chasecdn.com/web/library/blue-boot/dist/2.20.3/blue-boot/js/main-ver.js"></script>
  • <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="blue-vendor/main" src="https://static.chasecdn.com/web/library/blue-vendor/dist/2.11.1/blue-vendor/js/main.js"></script>
  • <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="blue/main" src="https://static.chasecdn.com/web/library/blue-core/dist/2.16.3/blue/js/main.js"></script>
  • <script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="blue-app/main" src="https://static.chasecdn.com/web/library/blue-app/dist/2.15.1/blue-app/js/main.js"></script>

Ce qui indique clairement que le site Web est protégé par Bot Management prestataire de services Distil Networks et la navigation par ChromeDriver est détectée puis bloquée .


Distiller

Selon l'article Il y a vraiment quelque chose à propos de Distil.it ... :

Distil protège les sites contre les robots de grattage de contenu automatique en observant le comportement du site et en identifiant les modèles propres aux grattoirs. Lorsque Distil identifie un bot malveillant sur un site, il crée un profil comportemental sur liste noire qui est déployé pour tous ses clients. Quelque chose comme un pare-feu de bot, Distil détecte les modèles et réagit.

Plus loin,

"One pattern with Selenium was automating the theft of Web content", A déclaré Rami Essaid, PDG de Distil, dans une interview la semaine dernière. "Even though they can create new bots, we figured out a way to identify Selenium the a tool they're using, so we're blocking Selenium no matter how many times they iterate on that bot. We're doing that now with Python and a lot of different technologies. Once we see a pattern emerge from one type of bot, then we work to reverse engineer the technology they use and identify it as malicious".


Référence

Vous pouvez trouver quelques discussions détaillées dans:

10
DebanjanB