python - 辨識alert、window以及操做

selenium之 辨識alert、window以及操做

原創 2016年08月24日 11:01:04

更多關於python selenium的文章,請關注個人專欄:Python Selenium自動化測試詳解html


不少人分辨不出什麼是alert、什麼是window,今天討論下怎麼辨識alert和window,以及頁面元素如div假裝的對話框。python

1.分辨

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

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

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

  • div假裝對話框,是經過網頁元素假裝成對話框,這種對話框通常比較花哨,內容比較多,並且跟瀏覽器一看就不是一套,在網頁中用firebug可以獲取到其的元素,以下圖: 
    div假裝markdown

2.alert操做

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

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

先列出Alert的全部操做:ui

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
  • 2
  • 3
  • 4
  • 5

示例代碼:url

示例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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

結果

Alert Message
  • 1

示例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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

結果

Some question?
  • 1

示例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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

結果

Some prompt?
send some words to alert!
  • 1
  • 2

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

結果:

With Title Sahi Tests
  • 1
  • 2

這裏有一些注意事項:

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

3.div類對話框

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

 

 

 

#對於對話框是frame的對話框,採用switch_to_frame來進行定位。當遇到對話框是DIV的時候則採用本文的方法進行處理

driver = webdriver.Firefox()
driver.get('http://www.baidu.com')

#點擊登陸連接
driver.find_element_by_name('tj_login').click()

#經過二次定位找到用戶名輸入框。先找到彈出的DIV,而後再在頁面上定位到須要操做的元素
div = driver.find_element_by_class_name('tang-content').find_element_by_name('userName')
div.send_keys('username')

#輸入登陸密碼
driver.find_element_by_name('password')

#點擊登陸driver.find_element_by_id('TANGRAM_PSP_10_submit').click()

相關文章
相關標籤/搜索