首先我們先理解下什么是窗口的概念:瀏覽器的 window 概念逾条,一個(gè)tab就是一個(gè)window。
什么時(shí)候會(huì)產(chǎn)生多窗口:
<a target="_blank" class="cate_menu_lk" >家用電器</a>
target="_blank"
屬性會(huì)在新窗口中打開鏈接地址叉瘩。
或者 JavaScript 代碼:
window.open()
當(dāng)我們想操作新窗口中元素的時(shí)候會(huì)報(bào)錯(cuò)膳帕!這里面涉及到了窗口句柄的概念粘捎。
句柄(handle)薇缅,有多種意義,第一種解釋:句柄是一種特殊的智能指針 攒磨。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫泳桦、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄娩缰。
可以這樣理解灸撰,瀏覽器每創(chuàng)建一個(gè)窗口會(huì)為該窗口分配一塊內(nèi)存,而句柄就是指向這一塊內(nèi)存的指針拼坎。
雖然我們?nèi)庋劭吹疆?dāng)前窗口切換到了新窗口浮毯,但是對于我們的 Selenium 來說,還是指向的是原來的窗口句柄泰鸡。
你想要操作新窗口债蓝,就需要將句柄切換到新窗口的句柄。要想切換句柄盛龄,首先要獲取句柄饰迹。WebDriver 中提供了關(guān)于句柄的獲取:
driver.window_handles # 以列表形式獲取當(dāng)前瀏覽器所有句柄
driver.current_window_handle # 返回當(dāng)前的窗口句柄
每打開一個(gè)新窗口余舶,會(huì)在window_handles
中添加一個(gè)句柄啊鸭。
你想切換句柄,就要用到driver.switch_to.window()
方法了匿值。
driver.switch_to.window(driver.window_handles[-1])
以上赠制,就實(shí)現(xiàn)了窗口句柄的切換,現(xiàn)在你可以操作新窗口了挟憔。
當(dāng)然憎妙,除了通過句柄切換窗口库正,還可以通過窗口名稱切換窗口。注意窗口名稱不是 titile厘唾,這是一個(gè) JavaScript 屬性褥符。可以通過window.name
獲取或者修改抚垃,一般窗口可能沒有為窗口命名喷楣,我們可以通過執(zhí)行這句 JavaScript 代碼來為窗口命名,然后再用命名的名稱改進(jìn)型跳轉(zhuǎn)鹤树。
from selenium import webdirver
driver = webdriver.Chrome()
driver.get('http://www.jd.com')
# 給首頁命名
driver.execute_script('window.name="首頁"')
# 打開新窗口
driver.find_element_by_link_text("家用電器").click()
# 跳轉(zhuǎn)到新窗口
driver.switch_to.window(driver.window_handles[-1])
# 給新窗口命個(gè)名
driver.execute_script('window.name="家用電器"')
# 接下來就可以通過窗口名稱跳轉(zhuǎn)了
driver.switch_to.window("首頁")