Python + Selenium(十五)内嵌页面 iframe/frame

先看一个例子:


这是 163 邮箱登录页面,我们想模拟一下邮箱登录。

driver.find_element_by_name('email').send_keys('nemo')

额,报错了!Selenium 告诉我们:Message: no such element: Unable to locate element。

检查定位方式对的啊,name 属性嘛。可为什么就是要报错呢?

仔细观察页面结构,我们发现要操作的登录元素都是放在一个叫 iframe 的元素中,而且还是一个完整的 HTML(有 HTML 声明和 html 根节点):

<iframe> 标签创建包含另一个文档的行内框架。

iframe 用来包含一个独立的 HTML 文档。相当于在一个 HTML 页面中包含了另一个 HTML 页面。所以也称为内嵌页面,由于其定义是 HTML 中的一个框架,所以也称为内联框架。

现代网页中主要使用 iframe 来解决跨域的问题。比如这个登录是 163 的单点登录,邮箱只是 163 账号可登录站点中的一个,所以登录站点和邮箱不在同一个域下面,需要用 iframe 来解决跨域问题。

当你想操作 iframe 中内嵌的页面中的元素时,已经脱离了当前页面。

如何判断是否是当前页面?
你可以尝试在页面上右键单击,然后选择“查看网页源码”,看到的 HTML 代码就是当前页面。

对于脱离于当前页面的元素,WebDriver 提供了 switch_to.frame() 方法,用来跳转到需要操作的页面。(注意,只有frame()方法没有iframe()

要跳转到对应的 iframe 元素,可以通过以下四种方式来指定:

方式说明举例
index通过 iframe 在页面中出现的顺序driver.switch_to.frame(0) 选择第一个
id通过 iframe 的 id 属性driver.switch_to.frame(‘frame-id’)
name通过 iframe 的 name 属性driver.switch_to.frame(‘frame-name’)
WebElement没有合适的 id,name 属性
通过 find_element() 找到 iframe 元素再跳转
iframe = driver.find_element_by_xpath(’//*[id=“login”]/iframe’)
driver.switch_to.frame(iframe)

这里 163 邮箱登录的案例,没有 id 也没有 name ,我们选择第四种方式:

# 定位到 iframe 元素
iframe = driver.find_element_by_css_selector('#loginDiv>iframe')
# 跳转到 iframe
driver.switch_to.frame(iframe)
# 操作
driver.find_element_by_name('email').send_keys('nemo')
# 跳出 iframe
driver.switch_to.default_content()

在 iframe 中操作之后,操作外面的元素需要跳出来。跳出方式有两种:

driver.switch_to.parent_frame() # 跳到父级 frame 元素
driver.switch_to.default_content()  # 跳到最外层页面

如果有多级 iframe 的情况下,通过driver.switch_to.parent_frame()可以只跳一级。而driver.switch_to.default_content() 是在任何情况下都跳转到最外层页面。

注意,在 iframe 操作后一定要跳出 iframe,如果没有跳出 Firefox 浏览器可能会出现异常。

  • 15
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Selenium是一个用于自动化Web浏览器的工具,可以模拟用户在浏览器中的各种操作。在处理iframe内嵌框架)时,可以使用Selenium的switch_to.frame()方法来切换到iframe中进行操作。 下面是一个示例代码,展示了如何使用Selenium处理iframe: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 创建浏览器实例 driver = webdriver.Chrome() # 打开网页 driver.get("https://www.example.com") # 等待iframe加载完成 wait = WebDriverWait(driver, 10) iframe = wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[@id='myiframe']"))) # 在iframe中进行操作 # ... # 切回主文档 driver.switch_to.default_content() # 继续在主文档中进行操作 # ... # 关闭浏览器 driver.quit() ``` 在上述示例中,首先创建了一个Chrome浏览器实例,并打开了一个网页。然后使用WebDriverWait等待指定的iframe加载完成,并切换到该iframe中进行操作。在完成对iframe的操作后,可以使用switch_to.default_content()方法切回到主文档,继续在主文档中进行操作。最后,关闭浏览器实例。 注意,根据实际情况,可能需要使用其他定位方式来选择和切换到目标iframe。以上示例中使用了XPath定位方式,可以根据具体的网页结构和需求来选择适合的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值