前言
有些页面的链接打开后,会重新打开一个窗口/标签页,对于这种情况,屏幕会聚焦在新窗口或新标签页上,但WebDriver 不知道操作系统认为哪个窗口是活动的。要使用新窗口,您需要切换到它。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。当然,我们也可以通过js修改元素属性,最终让新打开的链接在一个窗口打开。
一、识别多窗口
1.打开百度:https://www.baidu.com/,点击新闻按钮会发现右边多了一个窗口标签。
2.我们使用代码去操作,打开的网页也是这样的(一个窗口多个标签页)
二、获取当前窗口/标签页句柄
1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。
2.人为操作的话,可以通过眼睛,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能使用句柄来判断了。
3.获取当前页面的句柄:driver.current_window_handle
# coding:utf-8 from selenium import webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com") driver.implicitly_wait(10) h=driver.current_window_handle print(h) driver.find_element_by_link_text("新闻").click() print(driver.current_window_handle)
运行结果:
CDwindow-59FD4DB806265FFBC646EF8369EB2353 CDwindow-59FD4DB806265FFBC646EF8369EB2353
三、获取所有句柄
1.定位新闻按钮,并点击
2.点击后,获取当前所有的句柄:window_handles
# coding:utf-8 from selenium import webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com") driver.implicitly_wait(10) h=driver.current_window_handle print(h) driver.find_element_by_link_text("新闻").click() nh=driver.window_handles print(nh,nh[1])
运行结果
CDwindow-5F5B9CC310D6704D328C0CD268FE0381 ['CDwindow-5F5B9CC310D6704D328C0CD268FE0381', 'CDwindow-06CC09C03B9DB58F9E9415B0D98247E1'] CDwindow-06CC09C03B9DB58F9E9415B0D98247E1
四、切换句柄
直接从所有窗口句柄中,取出第n个句柄的值 nh[1]
如上面代码
五、关闭新窗口,切回主页
1.打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证
2.验证完后,关闭新窗口
3.切回句柄到首页
4.打印当前页面的句柄,看是否切换到首页了
# coding:utf-8 from selenium import webdriver import time driver=webdriver.Chrome() driver.get("https://www.baidu.com") driver.implicitly_wait(10) h=driver.current_window_handle print(h) driver.find_element_by_link_text("新闻").click() nh=driver.window_handles print(nh,nh[1]) driver.switch_to.window(nh[1]) print(driver.title) time.sleep(3) #关闭新窗口 driver.close() #切换到首页句柄 driver.switch_to.window(h) #打印当前的title print(driver.title)
运行结果
CDwindow-130EA160DA8FDEE09BB98D9656D5D87B ['CDwindow-130EA160DA8FDEE09BB98D9656D5D87B', 'CDwindow-C679162F61EB91A181A02B15248593FC'] CDwindow-C679162F61EB91A181A02B15248593FC 百度新闻——海量中文资讯平台 百度一下,你就知道
六、打开百度,点击新闻,出现窗口多标签情况,查看新闻按钮元素属性:target=“_blank”
七、这里用到js的定位方法,定位该元素的class属性,定位到元素后,去掉target属性 或修改target属性值为空,执行代码发现,只打开了一个窗口标签
#coding:utf-8 from selenium import webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com") # js='document.getElementsByClassName("mnav c-font-normal c-color-t")[0].removeAttribute("target")' js='document.getElementsByClassName("mnav c-font-normal c-color-t")[0].target=""' driver.execute_script(js) driver.find_element_by_link_text("新闻").click()