在进行元素定位操作的过程中,我们常会遇到如下3种切换操作,分为为:
1、iframe切换操作
2、window切换操作
3、alert弹窗切换操作
在本节中,我们将详细介绍上述3种切换操作。
一、iframe切换操作
1、什么时候需要使用iframe切换操作?
当我们在进行元素定位时,发现待操作的元素出现在iframe当中,即当前html内嵌的htm中时,此时我们需要使用iframe切换操作,否则无法对元素进行相应的操作。
2、如何切换?
切换方式为:driver.switch_to.iframe(iframe的标识)
iframe常见的标识有:index、name 或者 webelement等
3、当一个html中存在iframe的多级嵌套时,即html >> iframe(html) >> iframe(html)
3.1、我们如何快速的从当前iframe返回到主html中?
driver.switch_to.default_content()
3.2、如何逐级退回到上一级iframe中?
driver.switch_to.parent_frame()
二、window切换操作
当我们在点击某个链接可能会导致窗口的出现(即当前窗口与新窗口并存的现象),此时我们如果想定位并操作新窗口中的元素是,需要进行窗口切换的操作,具体流程如下:
1、获取所有窗口的句柄
driver.window_handles,此时窗口的句柄将保存在一个列表中,新出现的窗口的句柄在列表中的最后位置,即索引值为-1
2、切换到新窗口
driver.switch_to.window(新窗口句柄)
[说明]
如何获取当前窗口的句柄?
driver.current_window_handle # 获取当前窗口的句柄
三、alert弹窗切换操作
如果某个动作导致alert弹窗出现时,我们如果想继续进行接下来的操作流程,必须先处理alert弹窗信息,具体操作流程如下:
1、切换到alert弹窗:al = driver.switch_to.alert
2、相关操作:
2.1、获取文本:al.text
2.2、关闭弹出框:al.accept()
附录
1、iframe窗口切换--页面中嵌套多个iframe
1 """ 2 元素的切换操作 3 """ 4 from selenium import webdriver 5 from selenium.webdriver.common.by import By 6 from selenium.webdriver.support.wait import WebDriverWait 7 from selenium.webdriver.support import expected_conditions as EC 8 9 # 案例:腾讯课堂用户登录 10 driver = webdriver.Chrome() 11 driver.get("https://guanjia.qq.com/sem/970/index.html?ADTAG=media.buy.baidu.SEM") 12 13 wait = WebDriverWait(driver,20) 14 15 login_btn_loc = (By.ID,'mgr_nav_login') 16 wait.until(EC.visibility_of_element_located(login_btn_loc)) 17 driver.find_element(*login_btn_loc).click() 18 19 # 使用账号密码登录,由于存在iframe的内嵌,需要进行iframe的切换操作 20 # 由于iframe存在多级嵌套,因此需要进行逐级进入 21 driver.switch_to.frame("login_ifr") # 通过name属性进行切换 22 driver.switch_to.frame("ptlogin_iframe") # 通过name属性进行切换 23 login_loc = (By.ID,"switcher_plogin") 24 wait.until(EC.visibility_of_element_located(login_loc)) 25 driver.find_element(*login_loc).click() 26 27 #进行用户登录页面后,进行用户名、密码登录 28 user_loc = (By.ID,"u") 29 pwd_loc = (By.ID,"p") 30 submit_loc = (By.ID,"login_button") 31 wait.until(EC.visibility_of_element_located(user_loc)) 32 driver.find_element(*user_loc).send_keys("18272165137") 33 driver.find_element(*pwd_loc).send_keys("12345678") # 输入密码 34 driver.find_element(*submit_loc).click() # 登录提交
2、window窗口切换--网页搜索查询
1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 from selenium.webdriver.support.wait import WebDriverWait 4 from selenium.webdriver.support import expected_conditions as EC 5 6 driver = webdriver.Chrome() 7 driver.get("http://www.baidu.com") 8 wait = WebDriverWait(driver,20) 9 10 input_loc = (By.ID,"kw") 11 submit_loc = (By.ID,"su") 12 wait.until(EC.visibility_of_element_located(submit_loc)) 13 driver.find_element(*input_loc).send_keys("selenium") 14 driver.find_element(*submit_loc).click() 15 16 # 点击第一条搜索记录 17 rec_first_loc = (By.XPATH,'//a[text()="官方"]') 18 wait.until(EC.visibility_of_element_located(rec_first_loc)) 19 driver.find_element(*rec_first_loc).click() 20 21 # 产生新的窗口,获取窗口句柄 22 handles = driver.window_handles 23 # 切换到新窗口 24 driver.switch_to.window(handles[-1]) 25 print(driver.current_window_handle)
3、alert弹窗切换
找到合适的实例,在补上相应的操作代码......