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。
如果<iframe>
是DOM Tree 中唯一的iframe,您可以使用以下代码行:
使用 TAG_NAME:
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
使用唯一的Locator Strategy 定位<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 使所需的元素可点击。
您可以使用以下任一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框架内元素