2
votes

Gérer reCAPTCHA dans Python Selenium

J'ai besoin d'automatiser une page Web à l'aide de python sélénium, mais elle rencontre un reCaptcha, qui est dans un autre cadre. Je veux résoudre le captcha et continuer le script en cliquant sur le bouton de connexion, lorsque le reCaptcha a été résolu; Cependant, cela devient délicat, car un cadre est impliqué et le cadre doit revenir au contenu par défaut. Quelqu'un peut-il m'aider à cet égard?

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time
browser = webdriver.Chrome()
browser.delete_all_cookies()    
browser.maximize_window()
browser.get("https://developer.syntecx.org/ptcl_ebills/signin.php")
browser.switch_to.frame(browser.find_element_by_tag_name("iframe"))
browser.find_element_by_xpath("//*[@id='recaptcha-anchor']/div[1]").click()
time.sleep(20)
browser.switch_to_default_content()
browser.find_element_by_xpath("//*[@id='login']/button").click()


0 commentaires

3 Réponses :


1
votes

Une fois que vous avez rempli le champ Email et mot de passe pour cliquer sur le vous pouvez utiliser les stratégies de localisation suivantes:

  • Bloc de code:

    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://developer.syntecx.org/ptcl_ebills/signin.php")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#email"))).send_keys("Asad_Ullah@stackoverflow.com")
    driver.find_element_by_css_selector("input#password").send_keys("Asad_Ullah")
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[src^='https://www.google.com/recaptcha/api2/anchor?']")))
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.recaptcha-checkbox.goog-inline-block.recaptcha-checkbox-unchecked.rc-anchor-checkbox"))).click()
    driver.switch_to_default_content()
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-primary.block.full-width.m-b"))).click()
    
  • Instantané du navigateur:

reCAPTCHA


3 commentaires

Merci pour l'aide. Comment revenir au cadre principal et continuer le script après avoir résolu le reCaptcha? C'est là que j'ai des ennuis.


@AsadUllah Mise à jour de la réponse avec l'étape pour revenir au cadre principal et cliquer sur le bouton Connexion . Consultez la réponse mise à jour et faites-moi savoir le statut.


Attend-il que je résolve le captcha, puis continue automatiquement le script? Parce que j'ai exécuté cela dans mon compilateur python, et qu'il clique simplement sur le bouton de connexion après avoir cliqué sur le captcha.



0
votes

Ne passez pas à l'iframe.

Tout ce dont vous avez besoin est dans #g-recaptcha-response et [data-sitekey] qui sont tous deux dans le contexte principal.


5 commentaires

Comment les utiliser pour cliquer sur recaptcha et continuer le script?


définissez le #g-recaptcha-response innerText et cliquez sur le bouton. Reportez-vous à la documentation de 2captcha pour plus d'informations.


Attendrait-il que je termine le captcha, puis que je continue le script également?


Vous devez résoudre le captcha, puis le saisir, puis le soumettre.


Merci. J'espérais un moyen de continuer à fonctionner lorsque j'aurai terminé manuellement le captcha.



0
votes

Vous pouvez simplement attendre que la case à cocher affiche l'icône Terminé, puis l'attente sera terminée

Comme dans le code ci-dessous

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit() here


0 commentaires