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()
3 Réponses :
Une fois que vous avez rempli le champ Email et mot de passe pour cliquer sur le recaptcha, 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:
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.
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.
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.
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