selenium切換窗口

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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容