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()
Снимок браузера: