• selenium多窗口、多iframe切换、alert切换


    多标签/多窗口之间的切换

    场景:

    在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。这种情况下,需要识别多标签或窗口的情况。
    操作方法:

    switch_to.window()方法:切换窗口。可以实现在不同的窗口之间切换。current_window_handle:获得当前窗口句柄。
    window_handles: 获取所有窗口句柄。

    提示:句柄就可以理解成浏览器窗口的id值。

    操作说明:

    获取所有窗口的句柄
    handles = driver.window_handlers
    调用该方法会得到一个列表,在selenium运行过程中的每一个窗口,都有一个对应的值存放在里面。
    (换句话说,有多少个窗口,就有多少个句柄)
    通过窗口的句柄进入的窗口
    driver.switch_to_window(handles[n]) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    练习

    """
    1.学习目标:
        必须掌握web中多窗口切换方法
    2.语法(操作步骤)
        2.1 获取当前窗口句柄
            driver.current_window_handle
        2.2 点击页面中的超链接触发多窗口
        2.3 获取所有窗口句柄
            driver.window_handles
        2.4 进入新窗口
            switch_to.window(handles[1])
        2.5 操作新窗口中的元素
            按实际工作需求编写
        2.6 退出新窗口
            switch_to.window(handles[0])
    
    3.需求
        在页面中,实现多窗口切换。
    """
    # 1.导入selenium
    from selenium import webdriver
    import time
    from selenium.webdriver.common.by import By
    
    # 2.打开浏览器
    driver = webdriver.Chrome()
    
    #3.打开百度一下页面
    driver.get("https://www.baidu.com/")
    time.sleep(2)
    
    ## 4. 多窗口切换操作
    # 4.1 获取当前窗口句柄
    handle = driver.current_window_handle
    print('点击之前的窗口句柄是:', handle)
    print('点击前的url:', driver.current_url)
    
    # 4.2 点击页面中的百度热搜 超链接触发多窗口
    driver.find_element(By.XPATH,'//a[text()="新闻"]').click()
    time.sleep(3)
    
    # 4.2 获取所有窗口句柄
    handles = driver.window_handles
    
    # 4.3 进入新窗口
    driver.switch_to.window(handles[-1])
    print('点击之后浏览器所有的窗口句柄是:', handles)
    print('点击后的url:', driver.current_url)
    
    # 4.5 退出新窗口
    # 你需要退到哪个窗口就写哪个窗口的handle索引
    # 因为handle在上边赋值等于第一个窗口了,这里就可以写handle
    # 也可以写handles[0]
    driver.switch_to.window(handle)
    time.sleep(10)
    
    # 5.关闭浏览器
    driver.quit()
    """
    点击之前的窗口句柄是: 2CC28D229393F6E1A07AA345F0E2D98D
    点击前的url: https://www.baidu.com/
    点击之后浏览器所有的窗口句柄是: ['2CC28D229393F6E1A07AA345F0E2D98D', '6A8E0C9DD6E357F82727264A8A28C281']
    点击后的url: https://news.baidu.com/
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    iframe切换

    场景

    页面会进行一层一层的嵌套,只有切换到嵌套的iframe页面,才可以定位到iframe页面里的标签属性

    # 1、通过name属性进行定位,前提是iframe有name属性
    driver.switch_to.frame("login_frame")
     
    # 2、通过iframe索引去切换,注意iframe层级关系
    driver.switch_to.frame(1)
     
    # 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入
    iframe = driver.find_element("xpath","//iframe[@id='login_frame']")
    driver.switch_to.frame(iframe)
     
    # 扩展:
    # 关于进入iframe页面怎么退回到主页面
    driver.switch_to.default_content()
    # 关于进入iframe页面怎么退回到父级的iframe
    driver.switch_to.parent_frame()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    练习

    访问QQ邮箱为例:使用账号密码登录
    在这里插入图片描述

    """
    举例:已QQ邮箱为例
    实现功能:使用账号密码登录QQ邮箱
    步骤:定位到密码登录的iframe中(嵌套了2层),并在该iframe中找到”密码登录“元素并点击,然后到账号密码页面进行输入
    
    """
    
    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    driver.get("https://mail.qq.com/")
    
    #隐性等待
    driver.implicitly_wait(10)
    
    # 1、通过name属性进行定位,前提是iframe有name属性
    # driver.switch_to.frame("login_frame")
    
    # 2、通过iframe索引去切换,注意iframe层级关系
    # driver.switch_to.frame(1)
    
    # 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入【常用】
    iframe = driver.find_element(By.XPATH, "//iframe[@class='QQMailSdkTool_login_loginBox_qq_iframe']")
    driver.switch_to.frame(iframe)
    
    iframe2 = driver.find_element(By.XPATH, "//iframe[@id='ptlogin_iframe']")
    driver.switch_to.frame(iframe2)
    # 点击账号密码登录
    driver.find_element(By.XPATH, "//a[text()='密码登录']").click()
    
    # 输入账号
    driver.find_element(By.ID, "u").send_keys("username")
    
    # 输入密码
    driver.find_element(By.ID, "p").send_keys("password")
    
    # 点击登录
    driver.find_element(By.XPATH, "//input[@id='login_button']").click()
    
    # 强制等待5s
    time.sleep(5)
    
    # 退出浏览器
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    alert切换

    accept():确定
    dismiss():取消
    send_keys():输入
    在这里插入图片描述

    import time
    from time import sleep
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    """
    1、某一操作导致alert(或prompt、confirm)弹窗出现
    2、切换到弹窗中,driver.switch_to.alert 返回的是一个类的实例化对象,例如用alert接收它
    """
    driver = webdriver.Chrome()
    driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_alert")
    iframe = driver.find_element(By.XPATH,'//iframe[@id="iframeResult"]')
    driver.switch_to.frame(iframe)
    time.sleep(5)
    # 触发弹窗的操作
    driver.find_element(By.XPATH, '//button[text()="试一试"]').click()
    time.sleep(1)
    # 切换到alert
    alert = driver.switch_to.alert
    # 关闭弹窗
    alert.accept()
    time.sleep(7)
    driver.quit()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    Ab-darknet在darknet-ros环境下编译报错如何解决
    一分钟理解:Blazor WebAssembly 和 Blazor Server 差异性
    MFC工控项目实例一主菜单制作
    软件测试怎么学?App自动化、Web自动化、性能测试怎么学?一文总结
    计算机毕业设计ssm+vue基本微信小程序的好物推荐分享系统
    CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)
    基于R语言的DICE模型实践丨农田生态系统温室气体排放模拟
    2023高教社杯数学建模E题思路代码 - 黄河水沙监测数据分析
    深度学习——TensorBoard的使用
    从零到一建设数据中台 - 数据可视化
  • 原文地址:https://blog.csdn.net/weixin_39843945/article/details/133900710