28

无法send_keys()用于 iframe。如何选择这个 iframe 以及其中的哪个元素应该用于 send_key()?

页面图片

和 iframe html 代码

<iframe class="textarea" src="/framework/html/blank.html" style="width: 99%; border-width: 1px; height: 332px;">
#document
<html webdriver="true">
<head>
</head>
<body> … </body>
</html>
</iframe>

如何将值发送到描述?

我想知道的另一件事是,当我在浏览器中查找“查看页面源代码”时,该框架代码不会出现?

4

4 回答 4

64

driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))假设驱动程序是一个健康的 webdriver 实例。要继续使用默认内容,请执行driver.switch_to.default_content()

编辑:当您切换到所需的框架时,像往常一样找到您的网络元素。我猜(但不确定)在你的情况下,这将是一个 html/body,所以

el = driver.find_element_by_xpath('html/body')

应该没事。并执行

el.send_keys('keys_to_send')

EDIT2:在发送键之前,您可能必须关注元素(点击应该做的事情,应该出现一个子元素)。或者您可以通过 JS 放置所需的文本。

driver.execute_script('document.body.innerHTML = "%s"' % text_var)

于 2013-09-20T19:13:50.243 回答
2

接受的答案对于给定的问题非常有效。但是,我有两个理由要再添加一个答案,并希望这个答案可以帮助有人提出不同的问题。

原因一:

接受的答案有一种处理网页内 iframe 的方法。但是有不同的方法来处理 iframe。

  • 通过使用框架的索引位置
  • 通过使用框架的名称
  • 通过使用框架的 id

原因2:

当同一页面中有多个 iframe 元素时,它使用driver.find_element_by_tag_name("iframe")语句查找可能不起作用的 iframe 元素或返回预期的 iframe Web 元素。

有很多文章详细解释了处理 iframe。

  1. http://allselenium.info/handling-iframes-using-selenium-webdriver/
于 2019-01-19T15:01:24.587 回答
0

为了处理网页上的 iframe,您需要先使用以下命令切换到页面上存在的 iframe:driver.switch_to.frame(frame_id)

本教程有一个使用 selenium 和 python 处理 iframe的工作示例,这将使您能够解决这个问题。

于 2016-12-10T19:46:16.817 回答
0

您可以根据HTML DOM的普遍情况使用多种方法切换到iframe

  • 如果它是DOM 树<iframe>中唯一的iframe,您可以使用以下代码行:

    • 使用TAG_NAME

      driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
      
  • <iframe>使用独特的定位器策略定位元素:

    • 使用css_selector

      driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, "iframe.textarea[src='/framework/html/blank.html']"))
      
    • 使用xpath

      driver.switch_to.frame(driver.find_element(By.XPATH, "//iframe[@class='textarea' and @src='/framework/html/blank.html']"))
      

理想情况下切换到一个<iframe>所以你必须:

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

  • 诱导WebDriverWait使所需元素成为可点击的。

  • 您可以使用以下任一定位器策略

    • 使用TAG_NAME(仅存在 iframe):

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.TAG_NAME, "iframe"))).click()
      
    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.textarea[src='/framework/html/blank.html']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "element_css_selecor"))).send_keys("character_sequence")
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='textarea' and @src='/framework/html/blank.html']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='TlogBtn']/span[@class='mailicn']/img"))).send_keys("character_sequence")
      
  • 注意:您必须添加以下导入:

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

参考

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

于 2021-12-15T15:46:28.717 回答