2011-11-29 19 views
11

मैं वर्तमान में InternetExplorerDriver का उपयोग कर एएसपी.नेट एमवीसी अनुप्रयोग के खिलाफ सेलेनियम 2/वेबड्राइवर का उपयोग कर अवधारणा के सबूत में सहायता कर रहा हूं।सेलेनियम 2/वेबड्राइवर का उपयोग करके मैं जावास्क्रिप्ट अलर्ट का भरोसेमंद इंतजार कैसे कर सकता हूं?

एप्लिकेशन उन उपयोगकर्ताओं को सूचित करने के लिए मानक पैटर्न का उपयोग करता है जो रिकॉर्ड सहेजा गया है। यह TempData सेटिंग्स द्वारा काम करता है "रिकॉर्ड सफलतापूर्वक सहेजा गया", और यदि टेम्प में डेटा टेम्पेट मौजूद है, तो दृश्य संदेश को सतर्क करेगा।

इस कार्यशीलता के लिए सेलेनियम परीक्षण पर काम कर रहा जबकि, हम सी नीचे #/सेलेनियम परीक्षण कोड से inconstitant व्यवहार प्राप्त कर रहे हैं:

 _driver.Navigate().GoToUrl(_baseUrl + "/Amraam/List"); 
     _driver.FindElement(By.LinkText("Create New")).Click(); 

     _driver.FindElement(By.Id("txtAmraamSerialNumber")).SendKeys("CC12345"); 

     var selectElement = new SelectElement(_driver.FindElement(By.Id("LocationId"))); 
     selectElement.SelectByText("Tamworth"); 
     _driver.FindElement(By.Id("btnSave")).Click(); 
     var wait = new WebDriverWait(_driver, defaultTimeout); 
     IAlert alert = wait.Until(drv => drv.SwitchTo().Alert()); 
     _alertText = alert.Text; 

     alert.Accept(); 
     Assert.That(_alertText, Is.EqualTo("Record successfully saved")); 

लगभग 50% बार, Selinium एक

साथ विफल हो जाएगा OpenQA.Selenium.NoAlertPresentException: कोई चेतावनी सक्रिय नहीं है

मैं इस मुद्दे को दोहराने के लिए एक सटीक तरीका खोजने के लिए संघर्ष करता हूं, और असंगतता पहलू के बारे में चिंता करता हूं। यदि यह लगातार विफल रहा है, तो हम समस्या को डीबग और ट्रैक कर सकते हैं।

उत्तर

15

सेलेनियम 2 के भीतर अलर्ट और संकेतों का संचालन काफी नया है और अभी भी सक्रिय विकास में है। आपकी विफलताओं शायद समय के कारण हैं, इसलिए मैं SwitchTo() को अलर्ट() पर कॉल के चारों ओर एक रैपर विधि लिखने का सुझाव दूंगा ताकि आप OpenQA.Selenium.NoAlertPresentException को पकड़ सकें और टाइमआउट समाप्त होने तक इसे अनदेखा कर सकें।

इस के रूप में सरल कुछ काम करना चाहिए:

private IAlert AlertIsPresent(IWebDriver drv) 
{ 
    try 
    { 
     // Attempt to switch to an alert 
     return drv.SwitchTo().Alert(); 
    } 
    catch (OpenQA.Selenium.NoAlertPresentException) 
    { 
     // We ignore this execption, as it means there is no alert present...yet. 
     return null; 
    } 

    // Other exceptions will be ignored and up the stack 
} 

इस लाइन

IAlert alert = wait.Until(drv => drv.SwitchTo().Alert()); 

तो उस के लिए

IAlert alert = wait.Until(drv => AlertIsPresent(drv)); 
+0

चीयर्स बन जाएगा। असल में, आगे काम करते हुए, हमने पाया कि यह वास्तव में सेलेनियम के साथ एक समस्या नहीं थी, लेकिन वास्तव में हमारे आवेदन के तहत परीक्षण के साथ, और बटन पर जावास्क्रिप्ट घटनाओं का ऑर्डर करने के लिए क्लिक करें (पूछो मत ...) किसी भी तरह से, सेलेनियम खुद ही व्यवहार कर रहा था । @Naishy, ​​आपकी प्रतिक्रिया बहुत अच्छी लगती है, और हम इसे अन्यथा कोशिश करेंगे - चीयर्स। –

+0

आप उस अंतिम पंक्ति को थोड़ा और संक्षिप्त बनाने के लिए विधि समूह वाक्यविन्यास का उपयोग कर सकते हैं; 'IAlert चेतावनी = प्रतीक्षा करें। जब तक (अलर्ट IsPresent);'। –

+1

अब आप ExpectedCondition.AlertIsPresent का उपयोग कर सकते हैं देखें: http://stackoverflow.com/a/24550934/200824 –

संबंधित मुद्दे

 संबंधित मुद्दे