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

來源:互聯網
上載者:User

標籤:coding   name   max   樣式   方法   word   tty   hit   smis   

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 webdriverfrom time import sleepdriver = 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切換到alertsleep(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 webdriverfrom time import sleepfrom selenium.webdriver.common.alert import Alertdriver = 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 webdriverfrom time import sleepdriver = 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切換到alertsleep(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 webdriverfrom time import sleepfrom selenium.webdriver.common.alert import Alertdriver = webdriver.Firefox()driver.maximize_window()driver.get(‘http://sahitest.com/demo/index.htm‘)current_window = driver.current_window_handle  # 擷取當前視窗handle namedriver.find_element_by_link_text(‘Window Open Test With Title‘).click()all_windows = driver.window_handles  # 擷取所有視窗handle name# 切換window,如果window不是當前window,則切換到該windowfor window in all_windows:    if window != current_window:        driver.switch_to.window(window)print driver.title  # 列印該頁面titledriver.close()driver.switch_to.window(current_window)  # 關閉新視窗後切回原視窗,在這裡不切回原視窗,是無法操作原視窗元素的,即使你關閉了新視窗print driver.title  # 列印原頁面titledriver.quit()

結果:

With TitleSahi 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以及操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.