2013-08-28 65 views
2

中的文本我的問題:能夠檢測到警告框已打開,請驗證警報內的文本,確認文本並關閉警報。然後,返回並更正無效的電子郵件。Python/Selenium:切換到提醒並驗證

我的測試是註冊用戶的測試。我需要驗證有人可能輸入錯誤的數據或不匹配的數據。在這種情況下,我輸入一封電子郵件並驗證首先輸入的電子郵件。如果它們不匹配,將出現一個彈出窗口,提醒用戶檢查他們輸入的電子郵件地址以及它們是否匹配。到目前爲止,我所能得到的只是一個錯誤。

錯誤:

E UnexpectedAlertPresentException: Message: u'Modal dialog present' ; Stacktrace: Method nsCommandProcessor.prototype.execute threw an error in file:///var/folders/1j/x3cxkrqn3sscdyq0t36169hr0000gn/T/tmpTCqMgm/extensions/[email protected]/components/command_processor.js

我想我的代碼會處理這個問題,但都能跟得上。如果有人能指出我的,對你很明顯,錯誤我會很感激。

我的整個測試代碼:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
import unittest, time, re 

class ChallengeTests(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Firefox() 
     self.driver.implicitly_wait(5) 
     self.base_url = "https://www.testpage.com" 
     self.verificationErrors = [] 
     self.accept_next_alert = True 

# SIGN UP NEW USER 

    def test_00_sign_up(self): 
     driver = self.driver 
     driver.get(self.base_url + "/") 
     driver.find_element_by_id("remail").send_keys("[email protected]") 
     driver.find_element_by_id("remail_confirm").send_keys("[email protected]") 
     driver.find_element_by_id("next").click() 
     alert = self.driver.switch_to_alert() 
     alert = self.assertTrue(self.is_text_present("The email addresses you entered")) 
     driver.find_element_by_id("remail_confirm").send_keys("[email protected]") 
     driver.find_element_by_id("registration_button").click() 

# NON TESTS 

    def is_element_present(self, how, what): 
     try: 
      self.driver.find_element(by=how, value=what) # to find page elements 
     except NoSuchElementException, e: return False 
     return True  

    def is_text_present(self, text): 
     try: 
      body = self.driver.find_element_by_tag_name("body") # find body tag element 
     except NoSuchElementException, e: return False 
     return text in body.text # check if the text is in body's text 

    def is_alert_present(self): 
     try: 
      self.driver.switch_to_alert() 
     except NoAlertPresentException, e: 
      return False 

    def close_alert_and_get_its_text(self): 
     try: 
      alert = self.driver.switch_to_alert() 
      alert_text = alert.text 
      if self.accept_next_alert: 
       alert.accept() 
      else: 
       alert.dismiss() 
      return alert_text 
     finally: self.accept_next_alert = True   
     return True 

    def tearDown(self): 
     self.driver.quit() 
     self.assertEqual([], self.verificationErrors) 
+0

的新版本,你試過註釋掉隱等待和運行測試呀? – Greg

回答

1

嘗試等待警報出現之前,直接切換到它。

如果這不起作用,我有一種感覺,彈出實際上是一個weblement而不是JS警報。如果是這種情況,請嘗試使用瀏覽器開發人員工具查找選擇器並直接與其交互。

+1

你是對的,它是一個webelement。但是,我無法獲取元素的屬性與它進行交互。一旦我有了,我可以與它進行交互,例如:http://selenium-python.readthedocs.org/en/latest/api.html在6.3之下如果你能告訴我如何獲取webelement的ID /名稱,那會很出色。 – Dave

+0

生成警報時,請嘗試使用Firebug或Chrome開發人員工具檢查元素。這應該是一個很好的開始。一旦找到元素,就不需要6.3模塊下列出的交互方法。 – Amey

+0

我嘗試過使用Firebug和Charles Proxy。我(Firebug)看不到它。我相信這是因爲我不知道該往哪裏看,因爲查爾斯。 – Dave

1

關於Python(3.4)

def is_alert_present(self): 
    try: 
     self.driver.switch_to_alert() 
    except NoAlertPresentException: 
     return False 
+0

請詳細說明您的答案。 –

+0

當我嘗試將代碼粘貼到較新版本的Python上時,它給了我一個錯誤。然後我嘗試了這種方法,它正常工作。 – user3174886