Я использую 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")]
@LevanGoderdzishvili, спасибо, что указали на это. Я изменил свой первоначальный пост. Однако это не решает проблему. У вас есть идеи, что я делаю неправильно здесь? Спасибо!
трудно определить проблему без HTML. Это публичный сайт? Предоставьте ссылку или сделайте pastebin с содержимым HTML
Во-первых, попробуйте driver.switch_to.frame(iframe). Кроме того, попробуйте использовать ожидания selenium-python.readthedocs.io/waits.html, потому что iframe или элемент могут быть еще не загружены в DOM к моменту выполнения ваших методов.
@LevanGoderdzishvili, Большое спасибо за помощь! присмотревшись к html, я обнаружил, что внутри iframe был еще один фрейм. Переключение на этот второй кадр сделало элементы видимыми! :) Еще раз спасибо за ваше время






Я не уверен, почему ты это делаешь
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))
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)) дает мне: Out[57]: True поэтому я думаю, что переключился на этот iframe. Однако я все еще не могу получить доступ к элементам в этом iframe
Можно ссылку на страницу? Я предполагаю, что мы либо переключаемся на неправильный IFRAME, либо может быть другой 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)) frame2 = driver.find_element(By.XPATH, "//frame[contains(@id, 'contentContainerFrame')]") wait = WebDriverWait(driver, 10) wait.until(EC.frame_to_be_available_and_switch_to_it(frame2)) project = driver.find_element(By.ID, "b_s4_l1s4_ctl00_project_i") project.send_keys("999333")
Вы можете удалить второй экземпляр wait = WebDriverWait(driver, 10). Как только переменная wait определена, вы можете повторно использовать ее столько раз, сколько вам нужно.
не уверен, что это опечатка в вашем вопросе или вы действительно это делаете, но вы ищете элемент ввода, используя тег iframe. (
input_project = driver.find_element(By.XPATH, '//iframe[contains(@id, "b_s4_l1s4_ctl00_project_i")]')