selenium多窗口、多iframe切换、alert切换

发表于:2024-2-04 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:希冀miracle    来源:CSDN

  多标签/多窗口之间的切换
  场景:
  在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。这种情况下,需要识别多标签或窗口的情况。
  操作方法:
  switch_to.window()方法:切换窗口。可以实现在不同的窗口之间切换。current_window_handle:获得当前窗口句柄。
  window_handles: 获取所有窗口句柄。
  提示:句柄就可以理解成浏览器窗口的id值。
  操作说明:
  获取所有窗口的句柄
  handles = driver.window_handlers
  调用该方法会得到一个列表,在selenium运行过程中的每一个窗口,都有一个对应的值存放在里面。
  (换句话说,有多少个窗口,就有多少个句柄)
  通过窗口的句柄进入的窗口
  driver.switch_to_window(handles[n]) 
  练习
  """
  1.学习目标:
      必须掌握web中多窗口切换方法
  2.语法(操作步骤)
      2.1 获取当前窗口句柄
          driver.current_window_handle
      2.2 点击页面中的超链接触发多窗口
      2.3 获取所有窗口句柄
          driver.window_handles
      2.4 进入新窗口
          switch_to.window(handles[1])
      2.5 操作新窗口中的元素
          按实际工作需求编写
      2.6 退出新窗口
          switch_to.window(handles[0])
  3.需求
      在页面中,实现多窗口切换。
  """
  # 1.导入selenium
  from selenium import webdriver
  import time
  from selenium.webdriver.common.by import By
  # 2.打开浏览器
  driver = webdriver.Chrome()
  #3.打开百度一下页面
  driver.get("https://www.baidu.com/")
  time.sleep(2)
  ## 4. 多窗口切换操作
  # 4.1 获取当前窗口句柄
  handle = driver.current_window_handle
  print('点击之前的窗口句柄是:', handle)
  print('点击前的url:', driver.current_url)
  # 4.2 点击页面中的百度热搜 超链接触发多窗口
  driver.find_element(By.XPATH,'//a[text()="新闻"]').click()
  time.sleep(3)
  # 4.2 获取所有窗口句柄
  handles = driver.window_handles
  # 4.3 进入新窗口
  driver.switch_to.window(handles[-1])
  print('点击之后浏览器所有的窗口句柄是:', handles)
  print('点击后的url:', driver.current_url)
  # 4.5 退出新窗口
  # 你需要退到哪个窗口就写哪个窗口的handle索引
  # 因为handle在上边赋值等于第一个窗口了,这里就可以写handle
  # 也可以写handles[0]
  driver.switch_to.window(handle)
  time.sleep(10)
  # 5.关闭浏览器
  driver.quit()
  """
  点击之前的窗口句柄是: 2CC28D229393F6E1A07AA345F0E2D98D
  点击前的url: https://www.baidu.com/
  点击之后浏览器所有的窗口句柄是: ['2CC28D229393F6E1A07AA345F0E2D98D', '6A8E0C9DD6E357F82727264A8A28C281']
  点击后的url: https://news.baidu.com/
  """
  iframe切换
  场景
  页面会进行一层一层的嵌套,只有切换到嵌套的iframe页面,才可以定位到iframe页面里的标签属性
  # 1、通过name属性进行定位,前提是iframe有name属性
  driver.switch_to.frame("login_frame")
   
  # 2、通过iframe索引去切换,注意iframe层级关系
  driver.switch_to.frame(1)
   
  # 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入
  iframe = driver.find_element("xpath","//iframe[@id='login_frame']")
  driver.switch_to.frame(iframe)
   
  # 扩展:
  # 关于进入iframe页面怎么退回到主页面
  driver.switch_to.default_content()
  # 关于进入iframe页面怎么退回到父级的iframe
  driver.switch_to.parent_frame()
  练习
  访问QQ邮箱为例:使用账号密码登录。
  """
  举例:已QQ邮箱为例
  实现功能:使用账号密码登录QQ邮箱
  步骤:定位到密码登录的iframe中(嵌套了2层),并在该iframe中找到”密码登录“元素并点击,然后到账号密码页面进行输入
  """
  import time
  from selenium import webdriver
  from selenium.webdriver.common.by import By
  driver = webdriver.Chrome()
  driver.get("https://mail.qq.com/")
  #隐性等待
  driver.implicitly_wait(10)
  # 1、通过name属性进行定位,前提是iframe有name属性
  # driver.switch_to.frame("login_frame")
  # 2、通过iframe索引去切换,注意iframe层级关系
  # driver.switch_to.frame(1)
  # 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入【常用】
  iframe = driver.find_element(By.XPATH, "//iframe[@class='QQMailSdkTool_login_loginBox_qq_iframe']")
  driver.switch_to.frame(iframe)
  iframe2 = driver.find_element(By.XPATH, "//iframe[@id='ptlogin_iframe']")
  driver.switch_to.frame(iframe2)
  # 点击账号密码登录
  driver.find_element(By.XPATH, "//a[text()='密码登录']").click()
  # 输入账号
  driver.find_element(By.ID, "u").send_keys("username")
  # 输入密码
  driver.find_element(By.ID, "p").send_keys("password")
  # 点击登录
  driver.find_element(By.XPATH, "//input[@id='login_button']").click()
  # 强制等待5s
  time.sleep(5)
  # 退出浏览器
  driver.quit()
  alert切换
  accept():确定
  dismiss():取消
  send_keys():输入
  import time
  from time import sleep
  from selenium import webdriver
  from selenium.webdriver.common.by import By
  """
  1、某一操作导致alert(或prompt、confirm)弹窗出现
  2、切换到弹窗中,driver.switch_to.alert 返回的是一个类的实例化对象,例如用alert接收它
  """
  driver = webdriver.Chrome()
  driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert")
  iframe = driver.find_element(By.XPATH,'//iframe[@id="iframeResult"]')
  driver.switch_to.frame(iframe)
  time.sleep(5)
  # 触发弹窗的操作
  driver.find_element(By.XPATH, '//button[text()="试一试"]').click()
  time.sleep(1)
  # 切换到alert
  alert = driver.switch_to.alert
  # 关闭弹窗
  alert.accept()
  time.sleep(7)
  driver.quit()
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号