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

    应用场景:

    在页面操作过程中有时候点击某个链接会弹出新的窗口,这时候就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口直接切换。
    以百度首页和百度注册页为例,在两个窗口直接的切换如图

    代码如下:

     1 #导包
     2 from selenium import webdriver
     3 from time import sleep
     4 #定义浏览器句柄,打开百度网址
     5 driver=webdriver.Chrome()
     6 driver.implicitly_wait(10)
     7 url="http://www.baidu.com"
     8 driver.get(url)
     9 #窗口最大化
    10 driver.maximize_window()
    11 #获取百度搜索窗口的句柄
    12 seach_windows=driver.current_window_handle
    13 #打印百度搜索窗口的句柄
    14 print(seach_windows)
    15 #点击右上角"登录"按钮
    16 driver.find_element_by_link_text("登录").click()
    17 #在弹窗中点击"立即注册"按钮
    18 driver.find_element_by_xpath('//*[@id="passport-login-pop-dialog"]/div/div/div/div[4]/a').click()
    19 #获取当前所有打开窗口的句柄
    20 all_handles=driver.window_handles
    21 #进入注册窗口
    22 for newhandle in all_handles:
    23     if newhandle!=seach_windows:
    24         driver.switch_to.window(newhandle)
    25         print('now register window!')
    26         sleep(1)
    27         #输入用户名:username12334
    28         driver.find_element_by_id("TANGRAM__PSP_4__userName").send_keys("username12334")
    29         #输入手机号:18877776666
    30         driver.find_element_by_id("TANGRAM__PSP_4__phone").send_keys("18877776666")
    31         #输入密码:password
    32         driver.find_element_by_id("TANGRAM__PSP_4__password").send_keys("password")
    33         #点击获取语音验证码
    34         driver.find_element_by_id("TANGRAM__PSP_4__verifyCodeSend").click()
    35         #输入验证码:123456
    36         driver.find_element_by_id("TANGRAM__PSP_4__verifyCode").send_keys("123456")
    37         #勾选(阅读并接受《百度用户协议》及《百度隐私权保护声明》)
    38         driver.find_element_by_id("TANGRAM__PSP_4__isAgree").click()
    39         #点击"注册"按钮
    40         driver.find_element_by_id("TANGRAM__PSP_4__submit").click()
    41 #回到百度搜索窗口
    42 for newhandle in all_handles:
    43     if newhandle==seach_windows:
    44         driver.switch_to.window(newhandle)
    45         print('now seach window!')
    46         sleep(1)
    47         #关闭登录/立即注册的弹窗
    48         driver.find_element_by_id("TANGRAM__PSP_4__closeBtn").click()
    49         #点击百度输入框,输入"selenium webdriver"
    50         driver.find_element_by_xpath('//input[@id="kw"]').send_keys("selenium webdriver")
    51         #点击"百度一下"按钮
    52         driver.find_element_by_xpath('//input[@id="su"]').click()
    53         sleep(2)
    54 #关闭所有窗口,退出浏览器,结束本次脚本任务
    55 driver.quit()
     
    脚本执行过程:首先打开百度首页,通过current_window_handle获得当前窗口的句柄,并赋值给变量seach_windows 接着打开登录窗口,在登录弹窗上单击“立即注册”,从而打开新的注册窗口。通过window_handles获取当前打开的所有窗口的句柄,并赋值给变量all_handles 
    第一个for循环遍历了all_handles,如果newhandle不等于seach_windows,那么一定是注册窗口,因为脚本执行过程中只打开了两个窗口。所以,通过switch_to.window()切换到注册页面进行注册操作。第二个for循环类似,不过这一次判断如果newhandle等于seach_windows,那么切换到百度搜索页,然后进行搜索操作。
    总结:
    current_window_handle:获取当前窗口的句柄
    window_handles:返回所有窗口的句柄到当前会话
    switch_to.window():用于切换到相应的窗口,与switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    talk is cheap,show me the code.
     
  • 相关阅读:
    Windows核心编程(笔记11) 第十三章 Windows内存体系结构 四
    源码网站推荐 四
    程序员应知——破窗与童子军军规 四
    warning LNK4098 VC开发中遇到的问题 四
    各种系统架构图及其简介 四
    Windows核心编程(笔记10) 第十一章 Windows线程池 第十二章 纤程 四
    Windows核心编程(笔记12) 第十四章 探索虚拟内存 第十五章 在应用程序中使用虚拟内存 四
    Perl、PHP、ASP、JSP技术比较 四
    #pragma 预处理指令详解 四
    实战剖析三层架构 四
  • 原文地址:https://www.cnblogs.com/chenshengkai/p/11298036.html
Copyright © 2011-2022 走看看