《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情

多窗口或多iframe切换

阅读:216236731    分享到

在页面操作过程中有时候点击某个链接会弹出新的窗口或标签页,这时就需要主机切换到新打开的窗口或标签页上进行操作,我们使用的 WebDriver 对窗口或标签页的切换使用的函数是一样的,故在本节学习中,为了方便描述,我们统一使用窗口。

在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位,对于 frame/iframe 表单内嵌页面上的元素无法直接定位。这时就需要通过 switch_to.frame() 方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面中。

多窗口之间切换

WebDriver 提供了 switch_to.window() 方法,可以实现在不同的窗口之间切换。以百度首页和百度注册页为例,在两个标签页之间的切换代码如下。

from selenium import webdriver
import time

driver = webdriver.Chrome()
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()

多 iframe 切换

我们以 126 邮箱登录框页面为例,该页面中有一个子页面 iframe,我们下面列出该页面的部分代码。

<html>
  <body>
  ...
  <iframe id="x-URS-iframe" ...>
    <html>
      <body>
      ...
      <input name="email" >

想要操作登录框必须要先切换到 iframe 表单才能找到的该元素,然后才能去操作。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.126.com")

driver.switch_to.frame('x-URS-iframe')  # 跳进该 iframe 页面
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()      # 跳回最外层的页面

driver.quit()

switch_to.frame() 默认可以直接取表单的 id 或 name 属性,如果 iframe 没有可用的 id 和 name 属性,则可以先定位到该 iframe 元素,直接把该元素本身传入给 switch_to.frame() 函数。

# 先通过 xpth 定位到 iframe,当然你可以根据前面学的任何定位方法来定位
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')

# 再将定位元素传给 switch_to.frame() 方法
driver.switch_to.frame(xf)

如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
黍离
2019年12月4日 08:27 回复

selenium 无所不能!厉害了,我的哥


user_image
CharlieJiang
2019年8月15日 19:31 回复

正好用到,拿走


user_image
火鸡味锅巴
2018年3月13日 08:36 回复

谢谢啦,博主辛苦啦