1、獲取到所有的窗口,句柄handles
all_handles = driver.window_handles
print(all_handles)
2、獲取當(dāng)前的窗口
driver.current_window_handle
print(driver.current_window_handle)
3、利用切換的語句,切換到想要操作的窗口(HTML頁面)
# 獲取到的所有窗口為一個(gè)列表,用索引取
driver.switch_to.window(all_handles[-1])
舉例說明
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
# 創(chuàng)建一個(gè)Chrome會(huì)話
driver = webdriver.Chrome()
# 訪問百度首頁
driver.get("http://baidu.com")
wait = WebDriverWait(driver, 20)
# 定位輸入框,并輸入“騰訊課堂”進(jìn)行搜索
driver.find_element_by_id('kw').send_keys("騰訊課堂")
# 點(diǎn)擊搜索按鈕
driver.find_element_by_id('su').click()
# 滿足以下條件,才會(huì)進(jìn)行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出現(xiàn)了新的HTML頁面
time.sleep(2)
# 獲取所有的窗口,句柄
all_handles = driver.window_handles
# 切換到新打開的窗口
driver.switch_to.window(all_handles[-1])
# 在新的頁面中找元素,并操作。
# 找到登錄的元素,并點(diǎn)擊登錄的按鈕
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登錄"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2)
# 關(guān)閉瀏覽器
driver.quit()
上述的方法在新窗口出現(xiàn)之后,需要有一個(gè)強(qiáng)制的等待頁面加載的時(shí)間time.sleep(2),這樣是為了保證在頁面未加載出來去點(diǎn)擊,導(dǎo)致程序報(bào)錯(cuò)。我們采用的是強(qiáng)制等待的方式;那么在這里有一個(gè)小小的騷操作,在expected_conditions文件中,有一個(gè)new_window_is_opened類,等待新窗口的出現(xiàn);該類調(diào)用時(shí)要傳入一個(gè)current_handles的參數(shù),功能為:所有的窗口句柄>current_handles,結(jié)果為True,條件成立。這個(gè)騷操作主要是為了替代強(qiáng)制等待這種方法,當(dāng)然兩種方法都可以用。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
# 創(chuàng)建一個(gè)Chrome會(huì)話
driver = webdriver.Chrome()
# 訪問百度首頁
driver.get("http://baidu.com")
wait = WebDriverWait(driver, 20)
# 定位輸入框,并輸入“騰訊課堂”進(jìn)行搜索
driver.find_element_by_id('kw').send_keys("騰訊課堂")
# 點(diǎn)擊搜索按鈕
driver.find_element_by_id('su').click()
# 滿足以下條件,才會(huì)進(jìn)行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
# 在新的窗口出現(xiàn)之前,獲取窗口列表,這時(shí)窗口數(shù)為1
cur_handles = driver.window_handles
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出現(xiàn)了新的HTML頁面
# 出現(xiàn)新的窗口之后,窗口數(shù)為2,2>1,條件為True
wait.until(EC.new_window_is_opened(cur_handles))
# 再次獲取所有的窗口
# 獲取所有的窗口,句柄
all_handles = driver.window_handles
# 切換到新打開的窗口
driver.switch_to.window(all_handles[-1])
# 在新的頁面中找元素,并操作。
# 找到登錄的元素,并點(diǎn)擊登錄的按鈕
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登錄"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2)
# 關(guān)閉瀏覽器
driver.quit()