Selenium + Python: я не могу получить доступ к элементу в iframe после использования driver.switch_to.frame(iframe_id)

Я использую python 3 и селен, чтобы делать некоторые веб-скрейпинги. Обычно у меня нет проблем, но на этот раз мне нужно получить доступ к элементам в iframe.

Я читал и решил следовать советам и переключать кадры, а затем искать элементы.

Итак, здесь я переключаю кадр:

iframe = driver.find_element(By.XPATH, "//iframe[contains(@id, 'ext-gen')]")
iframe_id = str(iframe.get_attribute('id'))

driver.switch_to.frame(iframe_id)

Однако я не могу получить элементы в этом кадре.

input_project = driver.find_element(By.XPATH, '//*[contains(@id, "b_s4_l1s4_ctl00_project_i")]')

Трассировка стека ошибок:

Traceback (most recent call last):

 input_project = driver.find_element(By.XPATH, '//*[contains(@id, "b_s4_l1s4_ctl00_project_i")]')

  File ~\AppData\Local\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py:831 in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]

  File ~\AppData\Local\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py:440 in execute
    self.error_handler.check_response(response)

  File ~\AppData\Local\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py:245 in check_response
    raise exception_class(message, screen, stacktrace)

NoSuchElementException: Unable to locate element: //*[contains(@id, "b_s4_l1s4_ctl00_project_i")]

🤔 А знаете ли вы, что...
Python популярен в анализе данных и машинном обучении с помощью библиотеки scikit-learn.


50
1

Ответ:

Решено

Я не уверен, почему ты это делаешь

iframe = driver.find_element(By.XPATH, "//iframe[contains(@id, 'ext-gen')]")
iframe_id = str(iframe.get_attribute('id')) <<< why?

driver.switch_to.frame(iframe_id)

У вас уже есть элемент IFRAME в iframe, просто используйте его при переключении кадров. Также добавьте ожидание, чтобы убедиться, что кадр готов.

iframe = driver.find_element(By.XPATH, "//iframe[contains(@id, 'ext-gen')]")
wait = WebDriverWait(driver, 10)
wait.until(EC.frame_to_be_available_and_switch_to_it(iframe))