zoukankan      html  css  js  c++  java
  • selenium切换窗口

    在做网页自动化测试的时候,难免会打开很多个网页,那么,如何在多个窗口之间切换呢?

    获取窗口的唯一标识用句柄(handle)表示,因此只需要切换句柄,就可以灵活的在各窗口之间切换。

    下面介绍几个方法

    • current_windle_handle          获得当前窗口的句柄
    • window_handles                         获得所有窗口的句柄
    • switch_to_window(handle)         切换到制定窗口

    还是用例子说话:

    在火狐首页中打开新浪,这样就有了两个窗口

    #导入需要使用的包
    from selenium import webdriver
    import time
    
    #设置要打开的网页链接
    url="http://e.firefoxchina.cn/"
    driver = webdriver.Firefox()
    driver.get(url)
    time.sleep(3)
    
    #打开一个新窗口
    driver.find_element_by_css_selector("a[title='新 浪']").click()

    下面我们来看current_window_handle的用法

    #获得当前窗口的handle
    now_handle=driver.current_window_handle
    #打印
    print(now_handle)

    打印的结果是13

    新浪,是我们打开的新页面,所以,13一定是新浪的handle喽?

    是与不是,我们把标题打印出来就知道啦。在上面的代码最后,打印标题。

    #打印标题
    print(driver.title)

    what???!!!这不是火狐首页的标题吗?!

    没错,我们点击一个连接,打开一个页面后,虽然,新的页面将原本的页面覆盖,但handle的焦点依然在原来页面上,需要我们进行切换。

    但是,switch_to_winow(handle)是需要传递参数的,传递我们要切换的窗口的handle。如何知道窗口的handle?

    #获得所有窗口
    allhandles=driver.window_handles
    print("所有窗口:"+allhandles)

    试一试效果

     

    OK,13是火狐主页的,那56肯定是新开的页面的,多运行几次就会发现,56这各数字是在变的,所以我们不可能先通过window_handles获得编号,再去给程序增加代码的方式定位到新开的页面。

    介绍两种方法切换窗口:

    • 方法1:数组

    传递的参数可以使用driver.windows_handles[数字]来表示。

    可以将窗口的句柄想象为一个数组,数组的0值即为第一个窗口,1值为第二个窗口,以此类推,-1值表示最后一个窗口。

    以打开最后一个窗口为例:

    driver.switch_to_window(driver.window_handles[-1])
    print(driver.title) 

    效果如下:

    •  方法2:循环判定,任意切换

    如果切换到随意一个窗口,可使用title来循环判定,这种方法较为复杂,不推荐使用。

    for handle in allhandles:
        title="新浪首页"
        driver.switch_to_window(handle)
        print("当前为:"+driver.title)
        
        if title in driver.title: 
            #验证
            now=driver.current_window_handle
            print("切换后:"+now)
            print(driver.title)
            break

    效果如下:

     全部代码如下:

     1 #导入需要使用的包
     2 from selenium import webdriver
     3 import time
     4 
     5 #设置要打开的网页链接
     6 url="http://e.firefoxchina.cn/"
     7 driver = webdriver.Firefox()
     8 driver.get(url)
     9 time.sleep(3)
    10 
    11 #打开一个新窗口
    12 driver.find_element_by_css_selector("a[title='新 浪']").click()
    13 
    14 
    15 
    16 #current_window_handle,获得当前窗口
    17 now_handle=driver.current_window_handle
    18 print("当前窗口",now_handle)
    19 print("当前窗口",driver.title)
    20 
    21 
    22 #window_handles,获得所有窗口
    23 allhandles=driver.window_handles
    24 print("所有窗口",allhandles)
    25 
    26 #切换到最新打开的窗口
    27 driver.switch_to_window(driver.window_handles[-1])
    28 print(driver.title)
    29 
    30 #通过循环,判定title,切换
    31 for handle in allhandles:
    32     title="新浪首页"
    33     driver.switch_to_window(handle)
    34     print("当前为:"+driver.title)
    35     
    36     if title in driver.title: 
    37         #验证
    38         now=driver.current_window_handle
    39         print("切换后:"+now)
    40         print(driver.title)
    41         break
    View Code
  • 相关阅读:
    java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
    A计划(三维dfs)
    最少拦截系统(线性dp)
    疯狂的采药(完全背包)
    Modular Inverse (拓展欧几里得求逆元)
    斐波那契数列的3种求法及几种素数筛法
    Magic Odd Square (思维+构造)
    Marlin (思维)
    qdu_组队训练(ABCFIJK)
    2018蓝桥编程题6-9+ 50%的10
  • 原文地址:https://www.cnblogs.com/wulisz/p/7646436.html
Copyright © 2011-2022 走看看