Мне нужно брать данные о состоянии капчи, решена или нет. Я не могу найти элемент внутри recaptcha. код: self.driver.switch_to.frame(find_element(self.driver, 10, ‘iframe[title=“reCAPTCHA”]’, ‘css_selector’))
print(self.driver.execute_script(‘return document.querySelector(“#recaptcha-accessible-status”);’))
как я только не пытался его искать, ноль результата, не понимаю, в чем может быть причина
Причина во фрейме, который вы самым решительным образом не находите. Селениум позволяет переключиться в невалидный, не существующий iframe, у которого под капотом будет что-то такое:
<html><head></head><body></body></html>
Не знаю какие обёртки над методами использованы в конкретно данном случае, но в оригинале, селениумовский find_element
имеет следующую сигнатуру:
def find_element(self, by=By.ID, value: Optional[str] = None) -> WebElement:
т.е. сначала тип селектора обозначенный в классе By(id
, xpath
и прочее) а потом уже его значение, iframe[title=“reCAPTCHA”]
Это если не учитывать тот факт, что в селениуме (по крайней мере в 4м) нет типа селектора css_selector
, там есть css selector
.
Короче вот рабочий метод. надо сначала проинсталлить selenium и webdriver_manager:
pip install selenium
pip install webdriver-manager
ну и сам рабочий код:
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
service = webdriver.ChromeService(executable_path=ChromeDriverManager().install())
with webdriver.Chrome(service=service) as driver:
driver.get("https://www.google.com/recaptcha/api2/demo")
iframe = driver.find_element(by=By.CSS_SELECTOR, value="iframe[title='reCAPTCHA']")
driver.switch_to.frame(iframe)
elem = driver.find_element(by=By.CSS_SELECTOR, value="div#recaptcha-accessible-status")
print(elem.tag_name)