有时我们在打开浏览器浏览网页时,当点击网页上某些链接时,它不是直接在当前页面上跳转,而是重新打开一个新标签页面,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。

一、认识多窗口

1、这里以赶集网为例,打开赶集网http://cd.ganji.com/,点击工作,就会发现会重新打开一个窗口;

image

二、获取当前窗口句柄

1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。

2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。

3.获取当前页面的句柄:browser.current_window_handle

image

4.执行结果

image

三、获取所有窗口句柄

1、获取所有窗口句柄:brows.window_handles

image

2、执行结果

image

四、切换句柄

方法一:

1.循环判断是否与首页句柄相等;

2.如果不等,说明是新页面的句柄;

3.获取的新页面句柄后,可以切换到新打开的页面上;

4.打印新页面的title,看是否切换成功。

image

执行结果

image

方法二:

直接获取all_h这个list数据里面第二个hand的值:all_h[i]

image

执行结果

image

五、关闭新窗口,返回到原来的窗口

1.打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证;

2.验证完后切关闭新窗口;

3.切回句柄到首页;

4.打印当前页面的句柄,看是否切换到首页了。

image

执行结果

image

六、参考代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : handles.py
# @Software: PyCharm
import time
from selenium import webdriver
url = 'http://cd.ganji.com/'
browser = webdriver.Firefox()
browser.get(url)
time.sleep(5)
# 获取当前页面的窗口句柄
handle = browser.current_window_handle
print(handle)
# 获取所有窗口句柄
browser.find_element_by_link_text('成都招聘').click()
handles = browser.window_handles
print(handles)
# 方法一:判断句柄是否与首页相等
for i in handles:
if i != handle:
browser.switch_to.window(i)
print(browser.title)
browser.close()
browser.switch_to.window(handle)
print(browser.title)
# 方法二:直接获取list列表里面的值,取值handles[i]
# browser.switch_to.window(handles[0])
# print(browser.title)
# 退出
browser.quit()

如何解决Selenium句柄、多窗口问题的更多相关文章

  1. selenium重定向新窗口

    1.跳转新窗口 # 浏览器跳转新窗口后,selenium绑定新窗口 print('页面跳转后重新绑定selenium.') time.sleep(3) search_window = driver.c ...

  2. 解决selenium不支持firefox低版本的问题

    解决selenium不支持firefox低版本的问题 在火狐浏览器升级后,突然发现webdriver运行脚本的时候不能调出火狐浏览器了,并报错WebDriverException:Message:'C ...

  3. Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题

    原文:Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题 Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位 ...

  4. 解决selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in P

    转载 解决selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be i ...

  5. python selenium 处理悬浮窗口(baidu tj_more)

    python selenium 处理悬浮窗口 from selenium.webdriver.common.action_chains import ActionChainsActionChains( ...

  6. 解决selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'

    解决selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'   ...

  7. 《手把手教你》系列技巧篇(二十一)-java+ selenium自动化测试-浏览器窗口的句柄(详细教程)

    1.简介 今天本来就要分享和讲解三大延时等待的,但是在写作过程中发了问题,会用到这一个知识点,于是就提前介绍一下,以便后边用到了可以更好的理解和掌握.本文就是要介绍如何获得浏览器窗体的句柄或者叫编号, ...

  8. 解决Selenium Webdriver执行测试时,每个测试方法都打开一个浏览器窗口的问题

    虽然把WebDriver定义为一个静态变量了,但是每次执行测试都要打开多个窗口,挺浪费时间的. 找了很多中方法,比如使用setUpClass, BeforeSuite都没有完全解决问题.后来无意间发现 ...

  9. Python+selenium之多窗口,句柄

随机推荐

  1. AtCoder Beginner Contest 077 D Small Multiple(最短路)

    水过前三道题之后,一直在写这个题,做不对.总有那么几组数据过不去... 看了看题解是最短路,这思路感觉很神奇.看了下唯一做出来这题的那人的代码,是搜索做的. 标程: 对每个数字x,向x+1建一条花费为 ...

  2. python2和python3一些不同

    文件写法: #python2fp=file(filepath,'wb')#python3# fp = open(filepath, 'wb') 关于乱码问题: #python2 #coding=utf ...

  3. 2019徐州网络赛 I.query

    这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...

  4. H3C 命令行帮助特性

  5. 关于 FormData 和 URLSearchParams

    一.FormData FormData 接口提供了一种表示表单数据的键值对的构造方式,经过它的数据可以使用 XMLHttpRequest.send() 方法送出,本接口和此方法都相当简单直接.如果送出 ...

  6. 最小生成树prim、

    过年那几天确实没好好学习.在老家闲着也是闲着.可是就是没看书. 回来这几天又一直在弄个人博客.买域名云服务器备案什么的- -. 麻烦死了呢. 在腾讯花1块钱备案了一个网站www.goodgoodstu ...

  7. insert语句让我学会的两个MySQL函数

    我们要保存数据到数据库,插入数据是必须的,但是在业务中可能会出于某种业务要求,要在数据库中设计唯一索引:这时如果不小心插入一条业务上已经存在同样key的数据时,就会出现异常. 大部分的需求要求我们出现 ...

  8. 2018-8-10-用-sim-卡加密保护资金

    title author date CreateTime categories 用 sim 卡加密保护资金 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17 ...

  9. 从http到https--phpStudy2018

    0. 将SSL证书解压到以下目录,申请方式见 百度 Apache/cert/ 分别更名为 my_public.crt my.key my_chain.crt 1. phpStudy->其它选项菜 ...

  10. P1029 栈的基础操作

    题目描述 现在给你一个栈,它一开始是空的,你需要模拟栈的操作.栈的操作包括如下: "push x":将元素 x 放入栈中,其中x是一个int范围内的整数: "pop&qu ...