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

场景:

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

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

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

操作说明:

获取所有窗口的句柄

handles = driver.window_handlers

调用该方法会得到一个列表,在selenium运行过程中的每一个窗口,都有一个对应的值存放在里面。

(换句话说,有多少个窗口,就有多少个句柄)

通过窗口的句柄进入的窗口

driver.switch_to_window(handles[n])

练习

"""

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/

"""

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()

练习

访问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()

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()

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: