首页 > 其他分享 >selenium 窗口切换

selenium 窗口切换

时间:2023-09-12 14:33:35浏览次数:36  
标签:webdriver 窗口 selenium driver handles window 切换 句柄 handle

前期准备

from time import sleep
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

# 创建Chrome浏览器对象
chrome_options = webdriver.ChromeOptions()
# 隐藏正受到自动测试软件的控制。
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
driver.implicitly_wait(30)
driver.get('https://www.baidu.com')
driver.maximize_window()

 

一般情况:(这种方法只限两个窗口的,如果是3个以上窗口,就会很麻烦不推荐)

1.获取当前窗口的句柄:

current_window_handle = driver.current_window_handle

2.获取所有窗口的句柄:

window_handles = driver.window_handles

3.便利所有窗口句柄,切换到目标窗口:

for window_handle in window_handles:
    if window_handle != current_window_handle:
        driver.switch_to.window(window_handle)
        break

依次遍历所有窗口句柄,如果找到与当前窗口句柄不同的窗口,则切换到该窗口并跳出循环。

多窗口(3个及以上):

前提是你要知道多个窗口的title。 

for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == "My Target Window":
        break

通过 title 快速的切换到对应窗口

示例:

from time import sleep
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

# 创建Chrome浏览器对象
chrome_options = webdriver.ChromeOptions()
# 隐藏正受到自动测试软件的控制。
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
driver.implicitly_wait(30)
driver.get('https://www.baidu.com')
driver.maximize_window()

print(driver.current_window_handle)

driver.find_element(By.LINK_TEXT, "新闻").click()
window_handles = driver.window_handles
for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == '百度新闻——海量中文资讯平台':
        break
print('我是新闻', driver.current_window_handle)
driver.find_element(By.ID, 'ww').send_keys('你好')  # 操作新闻界面的输入框,测试操作句柄是否切换到新闻这个界面。如果没有切换到就会报错
sleep(2)
# 在百度首页点击 视频,打开百度视频
driver.find_element(By.LINK_TEXT, "视频").click()
window_handles = driver.window_handles
for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == '百搜视频——业界领先的中文视频搜索引擎之一':
        break
print('我是视频', driver.current_window_handle)
# driver.find_element(By.XPATH, '//input[@type="submit"]').click()
print(driver.window_handles)
sleep(2)
# 关闭这个标签页
driver.close()

for window_handle in window_handles:
    driver.switch_to.window(window_handle)
    if driver.title == '你好_百度视频搜索':
        break
driver.close()

print(driver.window_handles)
sleep(2)
# 关闭浏览器
driver.quit()

 

注意:

千万不要用下面这种方式切换操作句柄。新增界面后,用driver.window_handles[-1],来把句柄切换到到最新新增页面。(有坑)

driver.switch_to.window(driver.window_handles[-1])
['C514C3923F2B0885AE7EA66D99EB10A3', 'AE25C5291632286CEE03566AA561956E', '5B7CA64EE69AF45F8A431F253A559524'] 列表里面的句柄不一定是按顺序的,最后一个是最新的

 

标签:webdriver,窗口,selenium,driver,handles,window,切换,句柄,handle
From: https://www.cnblogs.com/xujunhui/p/17696097.html

相关文章

  • 同时安装python2和python3的切换与配置
    windows环境下同时安装了python2和python3,通过命令行窗口运行python脚本:1、python调用py-2调用python2py-3调用python3python脚本需要在python2下运行,在脚本前加上,然后运行pyxxx.py#!python2python脚本需要在python3下运行,在脚本前加上,然后运行pyxxx.py#!python3......
  • selenium4 请求chrome 如何添加header请求头
    前言selenium的webdriver本身没有api能做这个事情,详见issue。国内的博客全抄来抄去,说selenium直接加add_argument参数就好了,弄得找了好几天找代码问题,上外网查秒解决。所以要学好计算机还是得英文呐~~我用requests登录后,获取到了认证信息,但是接下来的请求我不再使用requests,而......
  • slb灰度切换
    slb实现灰度:1,通过slb配置规则转发,匹配域名到灰度机器上访问。2,通过权重设置,正式是实例权重为0,灰度实例权重为100,流量访问到灰度实例去。3,通过域名解析切换slb,域名解析生效时间10分钟左右。......
  • 剑指 Offer 59 - I. 滑动窗口的最大值
    题目链接:剑指Offer59-I.滑动窗口的最大值题目描述:给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。解法思路:单调队列:维护一个单调的队列,队列中保存的是对应数字的数组下标每新加进来一个元素,首先删除队头(超出滑动窗口的范围的值)然后比较当前元......
  • Web Scraping指南: 使用Selenium和BeautifulSoup
    WebScraping指南:使用Selenium和BeautifulSoup在当今信息时代,数据是无处不在的宝贵资源。对于许多企业、研究人员以及开发者来说,从互联网上获取准确且有价值的数据变得越来越重要。而Webscraping(网络爬虫)技术则成为了实现这一目标的关键工具。本篇文章将向您介绍一个高级WebScr......
  • Iterm把多个窗口放在一个界面
    Iterm把多个窗口放在一个界面Command+D:横向扩展一个窗口Command+Shirt+D:纵向扩展一个窗口Command+Shirt+i:平铺的窗口,统一命令管理。......
  • Qt实现QWidgets窗口圆角效果
    对于Qt里其它多数控件,我们可以直接通过设置qssborder-radius:?px;的方式来实现圆角。而我们最常用的窗口QWidget的qss却并不支持这一属性。StackOverFlow上的大佬@hank则给出了一种使用QPainter和遮罩的解决方式:首先#include<QPainterPath>,然后构造你的QWidget。在下文中我......
  • c++创建简单窗口
    #include<Windows.h>//自定义的窗口过程LRESULTCALLBACKMyWindowProc(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam){switch(Msg){caseWM_DESTROY://WM_DESTORY代表“窗口关闭”消息PostQuitMessage(0);return0;default......
  • boost的协程切换分析
    主要有两个接口,一个make_fcontext(),一个jump_fcontext()相比ucontext,boost的切换模式,少了单独对context进行保存(getcontext)和切换(setcontext)过程,而是把两者合并到一起,通过jump_fcontext接口实现直接切换这样做有个好处,就是更加容易进行优化,使得整个切换过程更加的紧凑boost......
  • nvm有下载版本,切换版本成功,node -v还是切换前的版本问题解决
    是因为在下载nvm之前,电脑中的node版本已经存在了,所以需要将之前的node版本全部清楚干净!卸载node之前请node-v查看一下现在的版本,记住这个版本,切记切记!!!!!控制面板中卸载node.;卸载已安装过的NVM;没装过NVM的就仅仅卸载node去环境变量里面看一下有没有跟nvm和node相关的东西了,有的话全......