美文网首页selenium知识点整理&汇总
Python + Selenium(十五)内嵌页面iframe

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

作者: 猫与测试 | 来源:发表于2019-11-03 01:26 被阅读0次

先看一个例子:


这是 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 浏览器可能会出现异常。

相关文章

网友评论

    本文标题:Python + Selenium(十五)内嵌页面iframe

    本文链接:https://www.haomeiwen.com/subject/fuvqvctx.html