html 中的 Selenium 和 iframe

Posted

技术标签:

【中文标题】html 中的 Selenium 和 iframe【英文标题】:Selenium and iframe in html 【发布时间】: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>

如何将值发送到描述?

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

【问题讨论】:

【参考方案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。

    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

参考

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

Switch to an iframe through Selenium and python selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium selenium in python : NoSuchElementException: Message: no such element: Unable to locate element

【讨论】:

以上是关于html 中的 Selenium 和 iframe的主要内容,如果未能解决你的问题,请参考以下文章

java selenium (十四) 处理Iframe 中的元素

(selenium+python)_UI自动化04_定位iframe框架内元素

python+selenium如何定位多层iframe中元素

Selenium向iframe富文本框输入内容

selenium+python定位iframe元素

selenium自动化测试-处理iframe