博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python+Selenium练习篇之27-多窗口之间切换----修改后的
阅读量:4290 次
发布时间:2019-05-27

本文共 2222 字,大约阅读时间需要 7 分钟。

https://blog.csdn.net/u011541946/article/category/6788788/2

本文来介绍如何处理driver在多窗口之间切换,想一下这样的场景,在页面A点击一个连接,会触发在新Tab或者新窗口打开页面B,由于之前的driver实例对象在页面A,但是你接下来的脚本是操作页面B的元素,这样就造成了找不到元素的报错。本来介绍selenium中switch_to.window()方法来处理这个问题。

测试场景:打开百度新闻(页面A),点击热点新闻中第一个新闻链接(一般是国家领导人的新闻),会在第二个窗口打开这个新闻的具体详情页(页面B),测试需要去判断你点击这个这个新闻,在打开的详情页是否正确。

问题拆分:

1. 我们已经知道switch_to.window()方法可以处理窗口切换的问题

2. 在页面A跳转到页面B之前,我们需要用一个变量保存这个新闻的标题

3. 切换到页面B后,我们获取这个新闻标题,然后和前面这个变量保存的值去对比,如果相等,那么就测试通过。

我们分两个步骤去解答这个测试需求:

1. 先实现页面A切换到页面B

2. 页面A和页面B两个新闻标题进行对比

先看看窗口切换的脚本代码:

[python]   
  1. # coding=utf-8  
  2. import time  
  3. from selenium import webdriver  
  4.   
  5.   
  6. driver = webdriver.Chrome()  
  7. driver.maximize_window()  
  8. driver.get('http://news.baidu.com')  
  9. time.sleep(1)  
  10.   
  11. driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click()  
  12. print driver.current_window_handle # 输出当前窗口句柄  
  13. handles = driver.window_handles # 获取当前全部窗口句柄集合  
  14. print handles # 输出句柄集合  
  15.   
  16. for handle in handles:# 切换窗口  
  17.     if handle != driver.current_window_handle:  
  18.         print 'switch to second window',handle  
  19.         driver.close() # 关闭第一个窗口  
  20.         driver.switch_to.window(handle) #切换到第二个窗口  

代码解释:

1. 先打印当前窗口(页面A)句柄,一个长字符串

2. 获取全部窗口句柄,这里我们有两个,打印出这两个句柄。

3. for 循环遍历,当发现其中一个句柄和当前句柄不相等,这里做了三件事,第一件,打印一个语句,告诉你马上要切换到第二个窗口,第二件,关闭当前窗口,这里指页面A,第三,切换到页面B窗口。

这里在切换到第二个页面时候,我关闭之前的页面A,只是我个人测试习惯,你可以不关闭,但是你的要思路清晰,哪些元素在页面A还是在页面B,如果操作了页面B后还要操作页面A的元素,你还要切换到页面A,为了麻烦,建议你每次切换都把前面页面给关闭。

判断在打开新页面显示的新闻标题是不是你刚刚点击的新闻,脚本代码如下:

# coding=utf-8  

import time  
from selenium import webdriver  
  
  
driver = webdriver.Chrome()  
driver.maximize_window()  
driver.get('http://news.baidu.com')  
time.sleep(1)  
  
news_link = driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a")  
page1_title_string = news_link.text #得到页面A新闻标题  
news_link.click() # 点击新闻链接  
time.sleep(1)  
handles = driver.window_handles  
  
for handle in handles:# 切换窗口(切换到搜狗)  
    if handle != driver.current_window_handle:  
        print 'switch to second window',handle  
        driver.close() # 关闭第一个窗口  
        driver.switch_to.window(handle) #切换到第二个窗口  
page2_title_string = driver.find_element_by_xpath("html/body/div[1]/div[2]/div/div[2]/p[1]").text # 详情页有一个原标题    (修改了路径)
print page2_title_string
try :  
    assert  page2_title_string in page1_title_string # 判断页面B标题是否包含页面A标题    (修改了包含关系)
    print ('Test Pass.')  
except Exception as e:  
    print ('Test Fail')

你可能感兴趣的文章
netty源码分析之-服务端启动核心源码分析(5)
查看>>
Storm并行度和流分组详解
查看>>
缓存数据预热详解
查看>>
热点数据降级详解(storm+nginx+lua)
查看>>
加载更多功能实现
查看>>
React相关Dom约束性和非约束性操作
查看>>
Hystrix高可用架构介绍
查看>>
netty源码分析之-SimpleChannelInboundHandler与ChannelInboundHandlerAdapter详解(6)
查看>>
netty源码分析之-开发过程中重要事项分析(7)
查看>>
Sublime Text3插件详解
查看>>
netty源码分析之-ByteBuf详解(8)
查看>>
javascript函数定义三种方式详解
查看>>
javascript中this关键字详解
查看>>
javascript关于call与apply方法详解
查看>>
netty源码分析之-ReferenceCounted详解(9)
查看>>
javascript闭包详解
查看>>
javascript类的创建与实例对象
查看>>
javascript原型详解(1)
查看>>
netty源码分析之-处理器详解(9)
查看>>
javascript原型对象存在的问题(3)
查看>>