软件测试-python-selenium-多窗口切换

本文详细介绍使用Selenium进行多窗口切换的两种方法,并通过百度登录界面实例演示如何实现窗口权柄的正确获取与切换,避免因窗口更新延迟导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先粘贴代码,以百度为例

def baidutest(url):
    br = startBrowser.firefox()
    br.maximize_window()
    br.get(url)
    br.implicitly_wait(10)
    bd_home = br.current_window_handle
    print(br.window_handles)
    bd_register = 0
    bd_forgot = 0
    br.find_element_by_link_text('登录').click()
    br.find_element_by_link_text('立即注册').click()
    # bd_register = 0
    # for i in br.window_handles:
    #     if i != bd_home:
    #         bd_register = i
    while True:
        # 判断窗口权柄是否更新,没有,则再等待0.1秒
        if br.window_handles.__len__() == 2:
            bd_register = br.window_handles[1]
            break
        else:
            sleep(0.1)
            continue
    print(br.window_handles)
    br.switch_to.window(bd_register)
    br.find_element_by_id('TANGRAM__PSP_4__userName').send_keys('张三')
    br.switch_to.window(bd_home)
    br.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()
    br.find_element_by_link_text('忘记密码?').click()
    while True:
        # 判断窗口权柄是否更新,没有,则再等待0.1秒
        if br.window_handles.__len__() == 3:
            bd_forgot = br.window_handles[1]
            break
        else:
            sleep(0.1)
            continue
    print(br.window_handles)
    br.switch_to.window(bd_forgot)
    print(br.title)
    br.switch_to.window(bd_home)
    br.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()
    sleep(5)
    br.quit()

多窗口切换网上大致有两种方法

1、for循环遍历window_handles,通过判断不是已有窗口的权柄,则是新打开窗口的权柄

bd_register = 0
for i in br.window_handles:
    if i != bd_home:
        bd_register = i
br.switch_to.window(bd_register)

2、直接通过window_handles[1]获取最新窗口的权柄值,值得注意的是,无论打开多少个窗口,最新打开的窗口的权柄值都存储在window_handles[1]中,而window_handles[0]永远是最开始打开的窗口的权柄值。

bd_forgot = br.window_handles[1]

但有时打开新窗口后,window_handles还来不及更新,这时获取的权柄值是不正确的,如果是打开第二个窗口,没更新的window_handles里面只有一个值,这时window_handles[1]会报错,因此在使用前需要对window_handles的长度进行判断,若window_handles的长度与打开的窗口个数一致才进行下一步操作,若是不一致,则再等待一小段时间(这里是0.1秒)

    bd_forgot = 0
    while True:
        # 判断窗口权柄是否更新,没有,则再等待0.1秒
        if br.window_handles.__len__() == 3:
            bd_forgot = br.window_handles[1]
            break
        else:
            sleep(0.1)
            continue
    br.switch_to.window(bd_forgot)

当然,以上代码可以直接用一个sleep代替,但sleep比较笨重,也会降低脚本的运行速度,因此不推荐使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值