【问题标题】:Selenium and iframe in htmlhtml 中的 Selenium 和 iframe
【发布时间】:2013-09-26 06:39:12
【问题描述】:

无法将 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>

如何将值发送到描述?

我还想知道,当我在浏览器中“查看页面源代码”时,这个框架代码没有出现?

【问题讨论】:

    标签: python selenium selenium-webdriver iframe webdriverwait


    【解决方案1】:

    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)

    【讨论】:

    • 对不起,我是新手。但是 driver.switch_to_frame(driver.find_element_by_tag_name("iframe")) 如何使用这个东西将密钥发送到描述窗口?就像现在驱动程序已切换到框架
    • @RATHI 根据您的要求编辑了答案
    • 元素 得到了选择,send_keys() 也在执行没有错误,但页面上没有出现值。
    • 嘿,我用这个答案作为参考。您使用 driver.switch_to_frame,但他们网站上的文档使用 driver.switch_to.frame。哪一个是正确的?
    【解决方案2】:

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

    原因 1:

    接受的答案有一种处理网页内 iframe 的方法。然而,有不同的方式来处理 iframe。

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

    原因 2:

    它使用 driver.find_element_by_tag_name("iframe") 语句查找在同一页面中有多个 iframe 元素时可能无法工作或返回预期 iframe 网页元素的 iframe 元素。

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

    1. http://allselenium.info/handling-iframes-using-selenium-webdriver/

    【讨论】:

      【解决方案3】:

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

      本教程有一个 handling iframe using selenium with python 的工作示例,它将帮助您解决此问题。

      【讨论】:

        【解决方案4】:

        您可以根据HTML DOM的实际情况,通过多种方式切换到iframe

        • 如果&lt;iframe&gt;DOM Tree 中唯一的iframe,您可以使用以下代码行:

          • 使用 TAG_NAME

            driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
            
        • 使用唯一的Locator Strategy 定位&lt;iframe&gt; 元素:

          • 使用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']"))
            

        最好切换到&lt;iframe&gt;,所以你必须:

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

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

        • 您可以使用以下任一Locator Strategies

          • 使用 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
          

        参考

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

        【讨论】:

          猜你喜欢
          • 2017-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-14
          • 2011-12-14
          • 2011-07-21
          • 1970-01-01
          相关资源
          最近更新 更多