2013-09-25 37 views
32

我想用python語言編寫一個測試用於管理用戶的網頁的硒。在此頁面中,有人可以爲用戶添加角色,如果在添加角色時存在角色,則會引發警報。我不知道警報是否是JavaScript警報或網頁的元素。我想自動檢查警報是否存在,因爲檢查列表中的角色會浪費時間並且負載很重。我試過這個:檢查是否有任何警報存在使用硒python

browser = webdriver.Firefox() 
browser.get("url") 
browser.find_the_element_by_id("add_button").click() 
try: 
    alert = browser.switch_to_alert() 
    alert.accept() 
    print "alert accepted" 
except: 
    print "no alert" 

但它沒有工作,我得到了「UnexpectedAlertPresentException」。 我也試過這個:

browser = webdriver.Firefox() 
browser.get("url") 
browser.find_the_element_by_id("add_button").click() 
s = set(browser.window_handles) 
s.remove(browser.current_window_handle) 
browser.switch_to_window(s.pop()) 

但我得到了同樣的例外。 此外,我試圖訪問與螢火蟲警報,以檢查我是否可以訪問其屬性,但右鍵點擊被禁用。 即使在其他語言中,我也需要一個解決方案。無論如何,我可以理解這種方法。 我會感謝任何幫助。

+2

您是否嘗試過點擊和switch_to_alert之間的短暫延遲? – Richard

+0

還沒有,謝謝你的建議@理查德。我想我可以使用A.R.的代碼。給我 –

+0

@Richard必須在'switch_to_alert()'到'accept()'之間有一個延遲?否則可能會出現問題,你認爲? – 2014-07-25 09:05:42

回答

46

我做的就是我希望看到的警報,然後切換到它,像這樣的點之前設置與WebDriverWait條件延遲:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 

browser = webdriver.Firefox() 
browser.get("url") 
browser.find_the_element_by_id("add_button").click() 

try: 
    WebDriverWait(browser, 3).until(EC.alert_is_present(), 
            'Timed out waiting for PA creation ' + 
            'confirmation popup to appear.') 

    alert = browser.switch_to.alert 
    alert.accept() 
    print("alert accepted") 
except TimeoutException: 
    print("no alert") 

WebDriverWait(browser,)將等待在至少3秒鐘才能顯示支持的警報。

+0

謝謝@ A.R。 它完全爲我工作。我一直陷入這個問題10個小時。 –

+0

如何檢測網頁上可能存在的所有警報(自動彈出,無需單擊按鈕)? – 2014-07-25 09:08:33

+8

只有一小部分信息switch_to_alert()現在已被棄用,並已被替換爲switch_to.alert – demouser123

1

在Java中,我們做這樣的

 WebDriverWait wait3 = new WebDriverWait(driver, 7000); 
     wait3.until(ExpectedConditions.alertIsPresent()); 
     driver.switchTo().alert().accept(); 

它會隱等待警報,如果警報不存在,它會拋出「警報不存在例外條款」,我們可以捕捉並繼續向前邁進。

希望它有幫助。

+0

謝謝@Abhishek Singh。我在python中做了同樣的事情,它是解決方案。 –

4

我知道這是一個太遲的答案,你在幾年前已經解決了這個問題,但我仍想發佈我的分析和發現以供將來的讀者參考。

我正在開發一個Django網站開發項目,目前有一個錯誤,一旦某個特定的網頁打開,彈出一個錯誤消息框。我的環境是:

  • 的Django 1.8
  • 的Python 2.7
  • 硒2.46.0

我閱讀文檔here有關 「UnexpectedAlertPresentException」,並說:

出現意外警報時拋出。

當預期的模式阻止webdriver表單執行更多命令時,通常會引發此問題。

我在我的項目測試,我的研究結果是:

  • 當警告框起了,find_element_by_X方法可以成功。
  • click()或send_keys()將失敗,並顯示「UnexpectedAlertPresentException」。

因此,我認爲try...catch塊不工作,因爲「UnexpectedAlertPresentException」在

browser.find_the_element_by_id("add_button").click() 

行被拋出這也意味着,警告框可一旦出現網頁通過這條線開通:

browser.get("url") 

換句話說,有可能是背後隱藏着更深層次的是一個問題,只要打開頁面時引起了警告框起來。您可能需要先解決該問題。

的另一件事是:假設警告框出現了這一行:

browser.find_the_element_by_id("add_button").click() 

然後alert = browser.switch_to_alert()應該也不例外拋出,這與你在這裏描述的是什麼工作。這也使我認爲問題早在browser.get("url")線。

我不是很確定選定的解決方案如何幫助您解決問題,因爲我的分析顯示問題出在另一個地方。 無論如何,我不是要求重新選擇接受的解決方案。我只想分享我對未來讀者的想法。如果我忽視或誤解了這個問題導致我的分析錯誤(並浪費你的時間閱讀:-),請道歉。

相關問題