selenium多表单切换(frame/iframe)
webdriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。
这时就需要通过switch_to_frame()方法将当前定位的主体切换为内嵌表单。
switch_to.frame()默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
web页面的前端代码如下:
<!DOCTYPE html>
<html>
<body>
...
<iframe id="x-URS-iframe" ...>
<html>
<body>
...
<input name="email" >
网页表单中嵌套另一个表单
126邮箱登录,想要操作登录框必须要先切换到iframe表单
`
#导入浏览器驱动,时间模块
from selenium import webdriver
import time
#实例化web网页使用chrome驱动
driver = webdriver.Chrome()
#设置隐示等待20s
driver.implicitly_wait(20)
#将窗口最大化
driver.maximize_window()
#使用get方法获取网页内容,此时获取到的网页在外面的表单中
driver.get('https://www.126.com/')
#切换到登录表单
#获取表单有两种方式:
#frameobj= driver.switch_to.frame("login-frame")
#frameobj= driver.find.element_by_xpath("//*[@id='']")
#括号内参数可以是frame的序号(第一个为0)
driver.switch_to.frame(0)
#输入邮箱
driver.find_element_by_css_selector('input[name="email"]').send_keys("skin5332")
#输入密码
driver.find_element_by_css_selector('input[name="password"]').send_keys("qwe653")
#点击 登录 按钮
driver.find_element_by_id('dologin').click()
#退出到默认打开的页面
driver.switch_to.default_content()
#点击 写信
driver.find_element_by_id('_mail_component_132_132').click()
#输入收件人
#input标签实现的输入框,直接使用send_keys输入内容即可
driver.find_element_by_css_selector(".nui-editableAddr-ipt").send_keys("lrr15058287369@126.com")
#输入 主题
driver.find_element_by_css_selector('div[aria-label="邮件主题输入框,请输入邮件主题"]>input').send_keys("hello 明天周六")
#表单切换,定位到子表单
iframe_element = driver.find_element_by_css_selector('.APP-editor-iframe')
#使用switch_to.frame将表单进行切换
driver.switch_to.frame(iframe_element)
#定位到邮箱正文输入框 输入内容
driver.find_element_by_css_selector('body').send_keys("hello 你好 明天可以休息了 是骗人的")
#从frame中切回主文档(driver.switchTo().defaultContent())
driver.switch_to.default_content()
#点击 发送 按钮
driver.find_element_by_xpath(
'//footer/div[@class="js-component-button nui-mainBtn nui-btn nui-btn-hasIcon nui-mainBtn-hasIcon "]/span[2]').click()
定位以及切换frame(iframe)
1、切换iframe
driver.switchTo().frame(“index”); //括号内参数可以是frame的序号(第一个为0)
driver.switchTo().defaultContent()
3、嵌套frame的操作
(driver.switchTo().parentFrame())相当于后退
driver.switch_to.frame(0) # 通过iframe的索引切入 iframe表单
driver.switch_to.frame('id value')
# 通过iframe的id切换入frame表单
driver.switch_to.frame('name')
# 通过iframe的name切入iframe表单
driver.switch_to.parent_comtent()
# 跳出当前一级表单
driver.switch_to.default_content()
# 跳回最外层页面