-2

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()

enter image description here

enter image description here

enter image description here

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
MrKolia1_1
  • 27
  • 1
  • 1
  • 4
    ***Never post code, markup, or data as images!*** It frustrates searching, reproduction of problems, and verification of solutions. Post as text, formatted as code. You should [edit] your post and fix this ASAP. Thanks. – kjhughes Jun 30 '20 at 18:49

1 Answers1

2

Once you click on the 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 EC
    
    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:\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:

recaptcha_iframe


Reference

You can find a couple of relevant discussions in:


Outro

Ways to deal with #document under iframe

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352