天天看點

python+selenium自動化(六)__切換/處理彈窗與iframe

在web自動化執行過程中,可能需要對頁面中的彈窗/iframe進行處理/切換,本節介紹如何利用selenium處理此類操作

一、切換浏覽器标簽頁

使用switch_to_window(window),搭配句柄window_handles、current_window_handle使用

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id("su").click()
driver.find_element_by_xpath("//*[@id='2']/h3/a").click()
#擷取目前視窗所有句柄
all_windows = driver.window_handles
#擷取目前标簽頁視窗句柄
current_window = driver.current_window_handle
#切換标簽頁視窗
for window in all_windows:
    if window !=current_window:
        print("切換前的視窗名稱是:",driver.title)
        driver.switch_to_window(window)
        time.sleep(2)
        print("切換後的視窗名稱是:",driver.title)
        break
           

二、切換iframe頁面

使用switch_to_frame()、switch_to_default_content(),一般成套使用更好,以防止未切回導緻定位失敗

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://ke.qq.com/")
driver.implicitly_wait(10)
#點選登入
driver.find_element_by_class_name("btn-default").click()
time.sleep(0.5)
driver.find_element_by_xpath("//*[@class='js-btns-enter btns-enter btns-enter-qq']").click()
time.sleep(2)
#點選賬号密碼登入
#這裡直接定位會失敗,需要切換到登入彈窗頁面後再進行定位,習慣使用的是2種切換方式
#1.iframe有唯一名稱
driver.switch_to_frame("login_frame_qq")
driver.find_element_by_id("switcher_plogin").click()
driver.find_element_by_id("u").send_keys("123456789")
#回切到首頁面
driver.switch_to_default_content()
time.sleep(2)
#2.iframe無名字,使用下标進行切換,且下标從0開始
#在頁面中查到到目前需要定位的iframe在第3個,是以下标是2
#再次切換到彈窗頁面
driver.switch_to_frame(2)
driver.find_element_by_id("p").send_keys("123456789")
driver.find_element_by_id("login_button").click()
driver.switch_to_default_content()
time.sleep(5)
driver.quit()
           

三、處理彈窗

使用switch_to_alert()中的accept()、dismiss()、send_keys、text進行操作,彈窗一般有三種類型,①.隻有确認按鈕的;②.有确認/取消按鈕的;③.需要輸入文字的

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
#建立一個測試彈窗
driver.execute_script("window.alert('這是一個測試彈窗')")
time.sleep(2)
#1.彈窗中隻有确認按鈕的
driver.switch_to_alert().accept()
time.sleep(1)
#2.彈窗中有确認/取消按鈕的
driver.execute_script("window.alert('這是一個測試彈窗')")
time.sleep(3)
#點選取消
driver.switch_to_alert().dismiss()
time.sleep(1)
#彈窗中需要輸入文字的
# driver.switch_to_alert().send_keys("測試測試測試")
#擷取彈窗中的内容
driver.execute_script("window.alert('這是一個測試彈窗')")
res = driver.switch_to_alert().text
print(res)