Java/Kotlin Selenium Chromedriver 2Captcha

Я пытаюсь узнать о 2Captcha nad, в качестве примера я хотел создать учетную запись Spotify. Мне нужно правильно заполнить форму, но единственная проблема - это 2Captcha. Я пробовал все способы, найденные здесь, но ни один из них не работал. Я пытался:

  • ___grecaptcha_cfg.clients[0].bL.K.callback('токен');
  • window.captchaSuccessCallback(); (это было найдено в методе grecaptcha.render)
  • И это был мой последний подход:
    val captcha = driver.findElement(By.id("captcha-div"))
    val siteKey = captcha?.getAttribute("data-sitekey") ?: ""
    println("Site key: $siteKey")

    val solvedCaptcha = getCaptcha(siteKey, "2captchaKey", driver.currentUrl)
    val js = driver as JavascriptExecutor
    println(solvedCaptcha)
    js.executeScript("document.getElementById('g-recaptcha-response').innerHTML='$solvedCaptcha';")
    Thread.sleep(500)

    val iframe = driver.findElement(By.xpath("//iframe[@title='recaptcha challenge']"))
    println(iframe.toString())
    driver.switchTo().frame(iframe)
    js.executeScript("document.getElementById('recaptcha-verify-button').click();")

URL, который я использую, здесь

В обновленном коде (все еще не работающем) добавлено моделирование нажатий клавиш в надежде, что обратный вызов сработает после обнаружения любых нажатий клавиш:

val captcha = driver.findElement(By.id("captcha-div"))
    val siteKey = captcha?.getAttribute("data-sitekey") ?: ""
    println("Site key: $siteKey")

    val js = driver as JavascriptExecutor

    val findElement = driver.findElement(By.id("g-recaptcha-response"))
    js.executeScript("document.getElementById(\"g-recaptcha-response\").style.display = \"inline\";")
    val solvedCaptcha = getCaptcha(siteKey, "captchaKey", driver.currentUrl)
    println(solvedCaptcha)
    solvedCaptcha?.forEach {
        findElement.sendKeys(it.toString())
        Thread.sleep(Random.nextLong(5L, 30L))
    }
    Thread.sleep(10000)

2 ответа

Это выглядит неправильно:

js.executeScript("document.getElementById('g-recaptcha-response').innerHTML='$solvedCaptcha';")

Я не уверен, как интерполяция строк работает в java, но я не думаю, что это работает так.

Убедитесь, что значение установлено, затем нажмите зеленую кнопку, и это должно сработать.

Чтобы click()на флажок, связанный с рекапчи, так как требуемые элементы находятся в пределах<iframe> так что вам нужно:

  • Вызвать WebDriverWait, чтобы нужный фрейм был доступен, и переключиться на него.
  • Вызвать WebDriverWait, чтобы нужный элемент стал интерактивным.
  • Вы можете использовать следующие стратегии локатора:

    • Блок кода:

      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.spotify.com/gr/signup/")
      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()
      
  • Снимок браузера:

Другие вопросы по тегам