Мне нужна помощь.
В моем коде Python с использованием модуля Selenium идентификатор mtcap-image-1 на сайте https://top-serveurs.net/gta/vote/midnight-rp не распознается Selenium.
Я хотел бы знать, можно ли заставить Selenium распознавать капчу MtCaptcha или мне нужно использовать для этого другой модуль.
Строка, вызывающая проблему:
captcha_img = driver.find_element(By.ID, "mtcap-image-1").
Selenium не может найти ID mtcap-image-1.
Я также пробовал использовать селекторы XPATH и CSS, но это тоже не сработало.






Причина проблемы в том, что элемент mtcap-image-1, который вы пытаетесь получить, находится внутри iframe с именем mtcaptcha-iframe-1. Поэтому, прежде чем вы сможете получить элемент, вам сначала нужно переключиться на этот iframe, используя:
# Wait for the mtcaptache iframe to be available and switch into the iframe
iframe = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "mtcaptcha-iframe-1"))
)
driver.switch_to.frame(iframe)
Во время тестирования кода, представленного в ответе, я также понял, что страница открывает всплывающее окно с согласием на использование файлов cookie при загрузке страницы, что может вызвать проблемы в будущем. Чтобы обойти это, вы можете использовать следующий код:
# Bypass cookie popup by clicking on accept button
popup = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "/html/body/div[7]/div[2]/div[1]/div[2]/div[2]/button[1]/p"))
)
popup.click()
Теперь для полноты полный код, который я использовал для решения проблемы с вашим кодом:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Define the driver and navigate to the captcha page
driver = webdriver.Chrome()
driver.get('https://top-serveurs.net/gta/vote/midnight-rp')
# Bypass cookie popup by clicking on accept button
popup = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "/html/body/div[7]/div[2]/div[1]/div[2]/div[2]/button[1]/p"))
)
popup.click()
# Wait for the mtcaptache iframe to be available and switch into the iframe
iframe = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "mtcaptcha-iframe-1"))
)
driver.switch_to.frame(iframe)
# Wait for the captcha to load and obtain element in captcha_img variable
captcha_img = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id = "mtcap-image-1"]')))
Добро пожаловать!
Большое спасибо, я не знал, что капча находится внутри iframe ;)