I'm trying to interact with the recaptcha Solve the challenge button on image verification popup using Selenium and Python.
The xpath looks correct in dev tools but using Selenium unable to interact with it. What is the problem?
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[contains(@id, "solver-button")]'))).click()
Once you click on the recptcha and get redirected to the image challenges, the picture elements are within another sibling <iframe>
. So you have to:
Switch back to the default_content().
Induce WebDriverWait for the desired frame to be available and switch to it.
Induce WebDriverWait for the desired element to be clickable.
You can use the following Locator Strategies:
Code Block:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECoptions = 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:\WebDrivers\chromedriver.exe')
driver.get("https://www.google.com/recaptcha/api2/demo")
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-anchor"))).click()
driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"//iframe[@title='recaptcha challenge']")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[@id='solver-button']"))).click()
Browser Snapshot:
Reference
You can find a couple of relevant discussions in:
- How to interact with the reCAPTCHA audio element using Selenium and Python
- How to send text to the Password field within https://mail.protonmail.com registration page?
Outro
Ways to deal with #document under iframe