(十二)多窗口切换

虫师 创建于 接近 2 年 之前

最后更新时间 2018-12-10


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

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

# 获得百度搜索窗口句柄
sreach_windows = driver.current_window_handle

driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()

# 获得当前所有打开的窗口的句柄
all_handles = driver.window_handles

# 进入注册窗口
for handle in all_handles:
    if handle != sreach_windows:
        driver.switch_to.window(handle)
        print('now register window!')
        driver.find_element_by_name("account").send_keys('username')
        driver.find_element_by_name('password').send_keys('password')
        time.sleep(2)
        # ……


driver.quit()

在本例中所涉及的新方法如下:

  • current_window_handle:获得当前窗口句柄。

  • window_handles:返回所有窗口的句柄到当前会话。

  • switch_to.window():用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。

我要留言

  • 我的问题已解决,在点击“立即注册”窗口后,需要等待几秒,设置了一个sleep(2)就可以了

    rookie 创建于 2020-03-25 14:35:05

  • 我想问一下,我运行这个程序的时候,到了打开注册页面就没有往下走了。 print('now register window!')这句也没有打印出来,是不是for循环都没有进入。有人能帮忙解答一下吗,谢谢

    rookie 创建于 2020-03-25 13:52:36

  • 试着回复一下【ella 创建于 2019-11-20 21:43:00】朋友的问题 需要等待元素加载完成,wait一下 这里可以试着结合之前的知识显式等待或者隐式等待

    cccrush 创建于 2020-02-05 11:00:42

  • driver.find_element_by_link_text("立即注册").click()每次运行到这里都报错 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"立即注册"} 请问是什么原因呢?求助

    ella 创建于 2019-11-20 21:43:00

  • 用id定位,可以顺利输入密码: driver.find_element_by_id('TANGRAM_PSP_4_password').send_keys('password')

    danike 创建于 2019-10-05 19:47:50

  • selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable 查了可能是for循环的问题,待解

    杨道林 创建于 2019-07-18 18:11:28

  • driver.find_element_by_name("account").send_keys('username') 运行时提示no such element

    lulu晶 创建于 2019-04-28 14:41:30