1. 程式人生 > >selenium+python之 辨識alert、window以及操作

selenium+python之 辨識alert、window以及操作

asm per smi get demo process live cancel ring

1.分辨

首先區別下alert、window和偽裝對話框:

  • alert,瀏覽器彈出框,一般是用來確認某些操作、輸入簡單的text或用戶名、密碼等,根據瀏覽器的不同,彈出框的樣式也不一樣,不過都是很簡單的一個小框。在firebug中是無法獲取到該框的元素的,也就是說alert是不屬於網頁DOM樹的。如下圖所示:
    技術分享
    技術分享
    技術分享

  • window,瀏覽器窗口,點擊一個鏈接之後可能會打開一個新的瀏覽器窗口,跟之前的窗口是平行關系(alert跟窗口是父子關系,或者叫從屬關系,alert必須依托於某一個窗口),有自己的地址欄、最大化、最小化按鈕等。這個很容易分辨。

  • div偽裝對話框,是通過網頁元素偽裝成對話框,這種對話框一般比較花哨,內容比較多,而且跟瀏覽器一看就不是一套,在網頁中用firebug能夠獲取到其的元素,如下圖:
    技術分享

2.alert操作

針對alert,selenium提供了相應的類來進行處理。

selenium.webdriver.common.alert.Alert(driver)

先列出Alert的所有操作:

Alert(driver).accept()  # 等同於點擊“確認”或“OK”
Alert(driver).dismiss()  # 等同於點擊“取消”或“Cancel”
Alert(driver).authenticate(username,password)  # 驗證,針對需要身份驗證的alert,目前還沒有找到特別合適的示例頁面
Alert(driver).send_keys(keysToSend)  # 發送文本,對有提交需求的prompt框(上圖3)
Alert(driver).text  # 獲取alert文本內容,對有信息顯示的alert框

示例代碼:

示例1:switch_to.alert , accept() , text

測試鏈接http://sahitest.com/demo/alertTest.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/alertTest.htm‘)

driver.find_element_by_name(‘b1‘).click()

a1 = driver.switch_to.alert  # 通過switch_to.alert切換到alert
sleep(1)
print a1.text  # text屬性輸出alert的文本
a1.accept()  # alert“確認”
sleep(1)

driver.quit()

結果

Alert Message

示例2:Alert(driver) , dismiss()

測試鏈接http://sahitest.com/demo/confirmTest.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.alert import Alert

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/confirmTest.htm‘)

driver.find_element_by_name(‘b1‘).click()

a1 = Alert(driver)  # 直接實例化Alert對象
sleep(1)
print a1.text  # text屬性輸出alert的文本
a1.dismiss()  # alert“取消”
sleep(1)

driver.quit()

結果

Some question?

示例3:switch_to.alert , send_keys(keysToSend)

測試鏈接http://sahitest.com/demo/promptTest.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/promptTest.htm‘)

driver.find_element_by_name(‘b1‘).click()

a1 = driver.switch_to.alert  # 通過switch_to.alert切換到alert
sleep(1)
print a1.text  # text屬性輸出alert的文本
a1.send_keys(‘send some words to alert!‘)  # 往prompt型alert中傳入字符串
sleep(1)
a1.accept()
print driver.find_element_by_name(‘t1‘).get_attribute(‘value‘)
driver.quit()

結果

Some prompt?
send some words to alert!

authenticate(username,password)方法沒有找到合適的示例網頁,不在這裏寫示例代碼,不過用法是和send_keys一樣,不過是傳入兩個參數而已。並且這種框很少出現,便不做更多研究。

3.window操作

window類似於alert,不過與原window是平行的,所以只需要切換到新的window上便可以操作該window的元素。

driver.switch_to.window(window_handle)

而window是通過window句柄handle來定位的。而selenium提供了兩個屬性方法來查詢window句柄:

driver.current_window_handle
driver.window_handles

用以上兩個屬性獲取到當前窗口以及所有窗口的句柄,就可以切換到其他的window了。

示例代碼:

測試鏈接http://sahitest.com/demo/index.htm

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.alert import Alert

driver = webdriver.Firefox()
driver.maximize_window()
driver.get(‘http://sahitest.com/demo/index.htm‘)

current_window = driver.current_window_handle  # 獲取當前窗口handle name
driver.find_element_by_link_text(‘Window Open Test With Title‘).click()

all_windows = driver.window_handles  # 獲取所有窗口handle name
# 切換window,如果window不是當前window,則切換到該window
for window in all_windows:
    if window != current_window:
        driver.switch_to.window(window)

print driver.title  # 打印該頁面title

driver.close()
driver.switch_to.window(current_window)  # 關閉新窗口後切回原窗口,在這裏不切回原窗口,是無法操作原窗口元素的,即使你關閉了新窗口
print driver.title  # 打印原頁面title

driver.quit()

結果:

With Title
Sahi Tests

這裏有一些註意事項:

  1. 只能通過window的name來切換窗口,但window的name不是你想象的窗口title之類的,而是一串字符串,如‘{976ae257-19be-4b32-a82e-4ba5063ed0a2}’,所以你用title、url之類的想切window是不可能的
  2. 關閉了新窗口之後,driver並不會自動跳轉回原窗口,而是需要你switch回來,直接去定位窗口元素會報NoSuchElementException

3.div類對話框

div類對話框是普通的網頁元素,通過正常的find_element就可以定位並進行操作。不在這裏進行詳述。註意設置一定的等待時間,以免還未加載出來便進行下一步操作,造成NoSuchElementException報錯。

selenium+python之 辨識alert、window以及操作