窗口切换 我们在使用浏览器打开链接时,通常会存在2种情况: 1。在当前窗口打开,即覆盖。 2。新建窗口打开,保留原有窗口。 示例: 百度首页搜索:博客园。 打开博客园官网,获取当前页精华帖的标题。 回到百度输入框,并打印出title。 代码如下: fromseleniumimportwebdriver driverwebdriver。Chrome() driver。implicitlywait(10) 打开百度首页 driver。get(http:baidu。com) 输入博客园并点击回车 driver。findelementbyid(kw)。sendkeys(博客园) 找到博客园的官网,并点击;点击后会在新的窗口打开链接 driver。findelementbyxpath(h3a〔contains(。,官网)〕。。a〔1〕)。click() 打印当前窗口的title print(driver。title) 打印当前窗口的url print(driver。currenturl) 点击博客园的精华贴 driver。findelementbycssselector(a〔title编辑精选博文〕)。click() 。。。。。。 输出结果如下: 博客园百度搜索 https:www。baidu。coms?ieutf8f8rsvbp1rsvidx1tnbaiduwdE58D9AE5AEA2E59BADrsvpqfb7d28ae0001abcfrsvt06598quU7hn3kFKgkuBxhCIOyMaWnFVVXEjwlgeJppBhRahvfl8rUTZcZVQrqlangcnrsventer1rsvsug33rsvsug11rsvsug7100rsvsug20inputT348rsvsug4348 selenium。common。exceptions。NoSuchElementException:Message:nosuchelement:Unabletolocateelement:{method:cssselector,selector:a〔title编辑精选博文〕} 报错信息,未定位到该元素 浏览器实现结果 通过浏览器的实现结果,和代码的运行结果,可以判断出:即使web页面已跳转至新窗口,但是代码逻辑还在原有窗口。 为解决该问题,我们需要引入句柄的概念:窗口句柄,粗略的理解,每个窗口对应一个句柄,句柄可认为是一个唯一长字符串。 获取句柄的方法: 获取当前页面句柄:driver。currentwindowhandle 获取所有页面句柄:driver。windowhandles 通过句柄,我们可以进行窗口的切换。 切换窗口:driver。switchto。window() 示例: fromseleniumimportwebdriver driverwebdriver。Chrome() driver。implicitlywait(10) 打开百度首页 driver。get(http:baidu。com) 输入博客园并点击回车 driver。findelementbyid(kw)。sendkeys(博客园) 找到博客园的官网,并点击;点击后会在新的窗口打开链接 driver。findelementbyxpath(h3a〔contains(。,官网)〕。。a〔1〕)。click() 打印出所有的句柄信息 print(driver。windowhandles) driver。quit() 输出结果如下: 〔CDwindow998407BA3D6B34956871D337B6F377FE,CDwindow844FF13AAEE0E14487AD368DEAA7A0AE〕 从结果中我们可以看出: driver。windowhandles的数据类型是一个列表 让我们回到上面的需求:此时我们唯一要做的就是,打开新的窗口后,代码切换至新窗口,并输出结果。 fromseleniumimportwebdriver driverwebdriver。Chrome() driver。implicitlywait(10) 打开百度首页 driver。get(http:baidu。com) 输入博客园并点击回车 driver。findelementbyid(kw)。sendkeys(博客园) 找到博客园的官网,并点击;点击后会在新的窗口打开链接 driver。findelementbyxpath(h3a〔contains(。,官网)〕。。a〔1〕)。click() 打印当前窗口的title print(切换前的title:,driver。title) 切换至新窗口 首先,我们要先获取到一个主句柄,作为灯塔,防止迷路 mainWindowdriver。currentwindowhandle 接着我们要获取所有的句柄信息,并赋值给handles handlesdriver。windowhandles 使用for循环,遍历所有的handles,以便判断 forhandleinhandles: 使用driver。switchto。window()方法,切入句柄所在的窗口 driver。switchto。window(handle) 判断代码是否在当前窗口的title中,如果在,跳出循环 if代码indriver。title: break 让我们打印一下当前窗口的title print(切换后的title:,driver。title) 点击博客园的精华贴 driver。findelementbycssselector(a〔title编辑精选博文〕)。click() 定位到标题的元素,并赋值给items itemsdriver。findelementsbycssselector(p〔classpostitem〕h3a) foroneinitems: print(one。text) 打印完成后,切回主窗口,并打印出当前窗口的title driver。switchto。window(mainWindow) print(切回主句柄的title:,driver。title) 输出结果如下: 切换前的title:博客园百度搜索 切换后的title:博客园代码改变世界 2021530前20的精华帖 【面试】如果你这样回答什么是线程安全,面试官都会对你刮目相看 【面试】迄今为止把同步异步阻塞非阻塞BIONIOAIO讲的这么清楚的好文章(快快珍藏) 为啥程序会有bug? 关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁 ERP不规范,同事两行泪 只有程序员才能读懂的西游记 从软件工程的角度解读任正非的新年公开信 通俗易懂,C如何安全、高效地玩转任何种类的内存之Span的本质(一)。 分布式系统关注点99的人都能看懂的熔断以及最佳实践 神经网络的基本工作原理 哎呀,我老大写Bug啦记一次MessageQueue的优化 机器学习web服务化实战:一次吐血的服务化之路 Windbg分析高内存占用问题 我是怎么把一个项目带崩的 彼之蜜糖,吾之砒霜聊聊软件开发中的最佳实践 Linux的内存分页管理 通俗易懂,什么是。NET?什么是。NETFramework?什么是。NETCore? 藏在正则表达式里的陷阱 你所不知道的日志异步落库 为什么说Java程序员到了必须掌握SpringBoot的时候?