Selenium处理frame

Frame:

使用Frame,你可以在同一个浏览器窗口中显示不止一个页面。每份HTML文档称为一个框架,并且每个框架都独立于其他的框架。

为什么要处理Frame:

当你用selenium定位一个元素时,你发现你怎么都定位不到它,明明F12后也能看见找到这个元素,但是就是定位不到,这时候大概率就是遇见Frame问题了。
因为你现在正处于主frame中,你是无法定位到子frame的元素的,只有进入子frame之后,你才能正常定位子页面的元素。

处理Frame:

selenium提供了switch_to.frame(parameter)方法来切换frame
parameter是需要传入的参数,用于定位frame,可以是id,name,index,也可以是selenium获得WebElement对象,下面是代码演示:

driver.switch_to.frame('id')
driver.switch_to.frame('name')
driver.switch_to.frame('0')# 0 表示第一个frame
#也可以用WebElement对象来定位,获取WebElement对象可以通过xpath、css-selector等
driver.switch_to.frame(driver.find_element_by_xpath('X'))

注意:当frame嵌套时,你必须先进入你想要进入的frame的父frame,你才能跳转到内层的frame,比如:

#先找到到ifrome1(id = f1)
browser.switch_to.frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to.frame("f2")

当你向要跳出时,selenium提供了两个方法供你跳出frame:
1.跳到主frame,也就是默认的页面

switch_to.default_content()

2.跳到其父frame

switch_to.parent_frame()

具体案例:对qq邮箱登录页面进行操控

qq邮箱的登录页面的账号密码输入框再一个子frame中,我们必须要进入这个子frame中我们才能对其元素进行操控。
我们可以发现这个frame没有id和name,那么只能通过后面两种方式进行定位了
在这里插入图片描述
具体代码:

import time
from selenium import webdriver
url = 'https://wx.mail.qq.com/login/loginpage?auth_type=3&delegate_url='
driver = webdriver.Chrome()
driver.get(url)
#转到qq登录
driver.find_element_by_xpath('/html/body/div/div[2]/div/div[1]/div/div[1]/div[2]').click()
#通过index定位frame
# driver.switch_to.frame(1)
#通过WebElement定位frame
driver.switch_to.frame(driver.find_element_by_class_name("login_loginBox_qq_iframe"))
driver.find_element_by_id('u').send_keys('1234567')
time.sleep(5)
driver.quit()
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值