Python + Selenium + 2Captcha
Я пытаюсь решить повторную капчу на сайте, использующем сервис 2captcha, но всегда возвращает мне ошибку:
Traceback (последний вызов последним): файл "C:\Users\pablo\Desktop\selenium\MercBitk.py", строка 48, в GChrome.find_element_by_xpath("//*[@id='g-recaptcha-response']").send_keys(соответственно текст [3:])
Файл "C:\Python34\lib\site-packages\selenium\webdriver\remote\webelement.py", строка 479, в send_keys 'value': keys_to_typing(value)})
Файл "C: \ Python34 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py", строка 633, в _execute return self._parent.execute(command, params)
Файл"C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", строка 321, в файле execute self.error_handler.check_response(ответ)
"C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", строка 242, в check_response поднять класс_исключения (сообщение, экран, трассировка стека)selenium.common.exceptions.ElementNotInteractableException: сообщение: элемент не взаимодействует (информация о сеансе: chrome=77.0.3865.90)
но я не нахожу, где я ошибаюсь... Код правильно вставляет CPF и пароль, код отправляет captcha и получает код на сайт 2captcha тоже правильно, но не может отправить его...
Код такой:
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
import requests
import getpass
import json
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
GChrome = webdriver.Chrome()
GChrome.get('https://www.mercadobitcoin.com.br/conta/login/')
box_login = GChrome.find_element_by_name('cpfcnpj')
box_login.send_keys('my_cpf')
box_pass = GChrome.find_element_by_name('password')
box_pass.send_keys('my_pass')
box_pass.send_keys(Keys.ENTER)
# 2Captcha service
service_key = 'fa...d4' # 2captcha service key
google_site_key = '6LfIxCoUAAAAAEEW7DQK_gj3pzzeJz82dTW_SMNH'
pageurl = 'https://www.mercadobitcoin.com.br/conta/login/'
url = "http://2captcha.com/in.php?key=" + service_key + "&method=userrecaptcha&googlekey=" + google_site_key + "&pageurl=" + pageurl
resp = requests.get(url)
if resp.text[0:2] != 'OK':
quit('Service error. Error code:' + resp.text)
captcha_id = resp.text[3:]
fetch_url = "http://2captcha.com/res.php?key="+ service_key + "&action=get&id=" + captcha_id
for i in range(1, 10):
time.sleep(5) # wait 5 sec.
resp = requests.get(fetch_url)
if resp.text[0:2] == 'OK':
break
GChrome.execute_script('var element=document.getElementById("g-recaptcha-response"); element.style.display="";')
GChrome.find_element_by_xpath("//*[@id='g-recaptcha-response']").send_keys(resp.text[3:]) #ERROR HERE <<<<<<
Кто-нибудь может мне помочь, пожалуйста? Я уже 3 дня пытаюсь решить эту ошибку
3 ответа
После звонка от pguardiario сделайте следующее:
driver.execute_script("""
onSubmit(arguments[0])
""", resp.text[3:])
Это невидимая рекапча, которая использует функцию обратного вызова, а имя функции в вашем случае - onSubmit.
Я думаю, это потому, что это скрыто. Попробуйте так:
driver.execute_script("""
document.getElementById("g-recaptcha-response").innerHTML = arguments[0]
""", resp.text[3:])
Замените драйвер на GChrome в вашем случае.
Продолжая pguardiario блестящий ответ, и, как многие из вас заметили, он заполняет текстовое поле, но не отправляет его, однако, из-за обстоятельств, мы оказались там, где текстовое поле теперь видно, просто отправить ответ должно быть достаточно (это было для меня):
driver.execute_script('var element=document.getElementById("g-recaptcha-response"); element.style.display="";')
driver.execute_script('document.getElementById("g-recaptcha-response").innerHTML = arguments[0]', resp.text[3:])
driver.find_element_by_id("g-recaptcha-response").submit()