在自动化测试过程中,会遇到打开新窗口的的情况,这时候需要进行句柄切换来对新窗口进行一系列的操作。

一、什么时候需要用到切换

1、有时候当我们使用selenium,模拟网页点击的时候,会出现一个新的窗口或者新的标签。但是,此时,我们的driver没有及时更新,还是开始页面时的那个窗口的模拟登入(其实也就是一个句柄,“句柄是一种特殊的智能指针”,这个句柄指向最开始的页面)。但是,当我发生点击动作的时候,页面发生切换,但是句柄还是原始的句柄,此时我们需要切换句柄操作,来调整至新出现的界面。
2、在selenium进行定位的时候,会遇到frame结构,这个时候如果使用xpath直接进行定位会定位失败,所以这时候也需要进行切换

二、获取当前窗口句柄

1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。

2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。

3.获取当前页面的句柄:driver.current_window_handle

三、获取所有句柄

获取当前所有的句柄:window_handles

四、切换句柄

切换句柄:switch_to.window()

next_click.click()  # 模拟点击下一页的时候,会出现一个新窗口或者新标签
"""获取全部句柄"""
all_handles = self.driver.window_handles  # 这个时候会生成一个新窗口或新标签页的句柄,代表这个窗口的模拟driver
"""切换新页面"""
driver.switch_to.window(all_handles[1])  # driver切换至最新生产的页面
"""页面顺序从0开始"""

上面是切换句柄比较简单的方法,还有一种使用判断语句,小编在此给参考代码

# coding:utf-8
 
from selenium import webdriver
 
driver = webdriver.Firefox()
 
driver.get("http://bj.ganji.com/")
 
h = driver.current_window_handle
 
print h  # 打印首页句柄
 
driver.find_element_by_link_text("招聘求职").click()
 
all_h = driver.window_handles
 
print all_h     # 打印所有的句柄
 
 #方法一:判断句柄,不等于首页就切换
 
 for i in all_h:                      
 
     if i != h:
 
         driver.switch_to.window(i)
 
         print driver.title
 
# 方法二:获取list里面第二个直接切换
 
driver.switch_to.window(all_h[1])
 
print driver.title
 
# 关闭新窗口
 
driver.close()
 
# 切换到首页句柄
 
driver.switch_to.window(h)
 
# 打印当前的title
 
print driver.title
 
selenium(python+java)

五、遇到iframe结构

在selenium使用xpath进行定位的时候,会遇到frame结构,FRAME(框架)是Web上经常会看到的页面结构。此时需要进行跳转frame框架内,再执行定位。

self.driver.get("https://y.qq.com/")
self.driver.find_element(By.XPATH,'//span[@class="mod_top_login"]/a').click()
"""定位到iframe"""
iframe = self.driver.find_element(By.XPATH,'//div[@class="login-box-bd__item current"]/iframe')
"""跳转到结构内"""
self.driver.switch_to.frame(iframe)
"""定位到第二个iframe"""
iframe_2 = self.driver.find_element(By.XPATH, '//div[@class="lay_login_form"]/iframe')
"""继续跳转"""
self.driver.switch_to.frame(iframe_2)
locator = (By.LINK_TEXT,'密码登录')
WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable(locator))  #显示等待,等待元素出现
self.driver.find_element(By.XPATH,'//div[@class="bottom hide"]/a[@id="switcher_plogin"]').click()  #元素出现后进行下一步操作