Skip to content Skip to sidebar Skip to footer

Dealing With Recaptcha In Python Selenium

I need to automate a web page using python selenium, but it encounters a reCaptcha, which is in another frame. I want to solve the captcha, and continue the script by clicking the

Solution 1:

Once you fill in the Email and Password field to click on the you can use the following Locator Strategies:

  • Code Block:

    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()
    
  • Browser Snapshot:

reCAPTCHA

Solution 2:

Don't switch to the iframe.

Everything you need is in #g-recaptcha-response and [data-sitekey] which are both in main context.

Solution 3:

You can simply wait for the checkbox to show the done icon and then the wait will be over

Like in the code below

from selenium import webdriver
from selenium.webdriver.common.by import Byfrom 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

Solution 4:

Here I found a solution when you encounter a reCaptcha in a login page. Simple approach that works very good for me. Check out for login button in a login page. If it lost it's existance, than you can proceed to the next stage. So, my solution does not require any timeout. Happy automating your stuff :)

defcheck_exists_by_xpath(xpath):
        try:
            self.driver.find_element_by_xpath(xpath)
        except NoSuchElementException:
            returnFalsereturnTrue

    login_btn_xpath = 'your login button xpath'whileTrue:
        print('You can solve recaptcha during this period and hit the login button.')
        if check_exists_by_xpath(login_btn_xpath) isFalse:
            break# TODO: you can go along from here!

Solution 5:

Try do it:

Create a variable that get the main window:

mainWin = driver.current_window_handle

When u need to switch to main window:

driver.switch_to.window(mainWin)

Post a Comment for "Dealing With Recaptcha In Python Selenium"