[![在此处输入图片描述][1]][1]
我正在使用 python 3 和 selenium 来进行一些网络抓取。 我通常没有任何问题,但这次,我必须访问 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)
但是,我无法获取此框架中的元素。
[![[在此处输入图片描述](https://i.stack.imgur.com/ElaMS.png)][2]][2]
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")]
[1]: https://i.stack.imgur.com/bfz8s.png
[2]: https://i.stack.imgur.com/FnGPC.png
我不确定你为什么要这样做
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))