一、多窗口切换
浏览器打开的窗口其实会有一个叫做句柄的概念。
句柄就类似于每一个标签页的ID一样,具有唯一性。
1.1 语法
- 获取当前窗口句柄,注意后面没有括号哦~
driver.current_window_handle
- 获取所有窗口句柄,结果以列表格式存储,注意后面没有括号哦~
driver.window_handles
- 根据句柄切换页面
driver.switch_to.window(要切换窗口的句柄)
1.2 案例
操作步骤:
1、打开百度首页
2、输入框输入“马蓉”
3、点击回车
4、点击“马蓉”百度百科
4、在百度百科页面点击“编辑”
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
# 打开浏览器
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.maximize_window()
# 打开网页
driver.get('https://www.baidu.com/')
# 定位搜索框
search_box = driver.find_element(By.ID, 'kw')
search_box.send_keys('马蓉')
search_box.send_keys(Keys.ENTER)
# 点击马蓉百度百科标题,进入详情页面(打开了一个新窗口)
driver.find_element(By.XPATH, '//div[@id="content_left"]/div//h3/a').click()
# 获取所有窗口句柄,结果保存在列表里
handle_list = driver.window_handles
# 打印出来看看结果
print(handle_list)
# 根据每个窗口的句柄唯一,来进行窗口切换
driver.switch_to.window(handle_list[-1])
# 在新窗口点击“编辑”链接
driver.find_element(By.LINK_TEXT, '编辑').click()
# 关闭浏览器
二、表单切换
2.1 背景
在同一个页面上,也可能存在元素不在同一个iframe标签里面的情况,因此要实现对元素的定位,需要先切换到元素所在的ifame标签,再根据八种元素定位方式进行元素定位。
2.2 语法
- 切换到最外层iframe
driver.switch_to.default_content()
- 切换到任意iframe
1、定位到iframe标签
2、driver.switch_to.frame()
switch_to.frame()中可以写iframe标签的id和name属性的值,但是id和name属性的值要唯一
switch_to.frame()中可以写通过其他元素定位方式定位的iframe标签对象,比如以下案例就是使用这种方式。
2.3 案例
操作步骤:
1、打开163邮箱登录页面
2、定位账号和密码输入框,并输入账号和密码
3、点击 登录 按钮
4、点击页面上的“VIP”
- 如下图,可以知道账号和密码元素都有"ID"属性,但是,刷新页面可以知道ID属性为动态变化的,因此不可用于元素定位
- 根据经验:ID属性值长长一串类似乱码的格式,都是不可以用于元素定位的,因此保险起见,都是采用其他元素定位方式
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 打开浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(3)
# 打开网页
driver.get('https://mail.163.com/')
# 切换表单
# 定位表单元素
iframe_element = driver.find_element(By.XPATH, '//div[@id="loginDiv"]/iframe')
# 切换
driver.switch_to.frame(iframe_element)
# 账号输入框
driver.find_element(By.NAME, 'email').send_keys('abc')
# 密码输入框
driver.find_element(By.NAME, 'password').send_keys('1122333')
# 点击 登录 按钮
driver.find_element(By.ID, 'dologin').click()
# 切换到最外层ifame
driver.switch_to.default_content()
# 点击最外层表单的VIP字段
driver.find_element(By.CSS_SELECTOR, 'a[href="https://vipmail.163.com/?from=fmail"]').click()
sleep(3)
# 关闭浏览器
driver.quit()