如何将带有 selenium python 的文本发送到 <!DOCTYPE html> 中的 iframe?

How to send text with selenium python to a iframe within a <!DOCTYPE html>?

我正在尝试 select 一个 <!DOCTYPE html>

形式的文本框

这是HTML:

我几乎尝试了所有方法,要么一无所获。 这是我的代码

desc =WebDriverWait(browser,30).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="tinymce"]')))
desc.clear()
desc.send_keys("anynaynanya")

如果我使用 iframe 的 xpath,我会收到该错误:

    Traceback (most recent call last):
  File "C:\Users\Dln\Desktop\tstsd.py", line 22, in <module>
    desc.clear()
  File "C:\Users\Dln\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 95, in clear
    self._execute(Command.CLEAR_ELEMENT)
  File "C:\Users\Dln\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\Dln\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Dln\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidElementStateException: Message: invalid element state
  (Session info: chrome=85.0.4183.83)

先尝试切换到框架

切换到框架名称为

的框架
driver.switch_to.frame("framename")

看看这个 link https://www.tutorialspoint.com/how-to-handle-frames-in-selenium-with-python

<p> 元素在 <iframe> 中,因此您必须:

  • 诱导 WebDriverWait 所需的 帧可用并切换到它.

  • 诱导 所需的 元素可点击

  • 您可以使用以下任一项:

  • 使用CSS_SELECTOR:

    driver.get('https://www.t-online.de/themen/e-mail')
    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#textarea-WYSIWYG_ifr")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "body.mce-content-body#tinymce > p"))).send_keys("anynaynanya")
    
  • 使用XPATH:

    driver.get('https://www.t-online.de/themen/e-mail')
    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='textarea-WYSIWYG_ifr']")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//body[@id='tinymce' and @class='mce-content-body']/p"))).send_keys("anynaynanya")
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

参考

您可以在以下位置找到一些相关讨论:

  • Switch to an iframe through Selenium and python

要访问任何框架,您首先需要切换到它。只是为了确保网页上有frame on frame,你可以通过标签名找到frames iframe

driver.find_elements_by_tag_name("iframe")

将给出可用框架的列表。这只是为了更加确定框架的存在。 要在内部发送一些文本,您需要切换到框架,您可以通过提供索引和框架名称来实现。

driver.switch_to.frame()

注:索引号从 0

开始