2010-03-03 8 views
8

मैं WatiNAjax वेब एप्लिकेशन का परीक्षण करने के लिए परीक्षण कर रहा हूं और अजाक्स अनुरोधों के साथ एक समय समस्या में आया हूं।WATN से पूरा करने के लिए jQuery अजाक्स अनुरोधों का इंतजार कैसे करें?

पृष्ठ पर किसी कार्रवाई द्वारा अजाक्स अनुरोध ट्रिगर करने के बाद, मैं चाहता हूं कि यह सत्यापित करने से पहले अनुरोध पूरा हो जाए कि पृष्ठ सही तरीके से अपडेट किया गया था।

मुझे लगता है कि समाधान eval-इंग शामिल JavaScript ट्रैक करने के लिए है कि क्या अनुरोध कार्य प्रगति पर है $.ajaxStart और $.ajaxComplete के लिए संचालकों रजिस्टर करने के लिए होगा। मैं जल्द ही उसमें खोदूँगा, लेकिन देखना चाहता था कि किसी और ने इसे हल कर लिया है या नहीं। ऐसा लगता है कि यह अजाक्स परीक्षण के साथ एक आम समस्या होगी।

उत्तर

18

मैंने इस समस्या को हल करने के लिए कुछ WatiN ब्राउज़र एक्सटेंशन विधियां बनाई हैं, लेकिन फिर भी अन्य समाधानों में दिलचस्पी है।

InjectAjaxMonitor विधि जावास्क्रिप्ट ग्लोबल वैरिएबल बनाता है जो अनुरोधों की संख्या को ट्रैक करने के लिए AJAXStart और AJAX पूर्ण घटनाओं से जुड़ा हुआ है।

जब भी आपको आगे बढ़ने से पहले AJAX अनुरोधों को पूरा करने की प्रतीक्षा करनी होगी, तो आप browserInstance.WaitForAjaxRequest(); पर कॉल कर सकते हैं।


public static class BrowserExtensions 
{ 
    public static void WaitForAjaxRequest(this Browser browser) 
    { 
     int timeWaitedInMilliseconds = 0; 
     var maxWaitTimeInMilliseconds = Settings.WaitForCompleteTimeOut*1000; 

     while (browser.IsAjaxRequestInProgress() 
       && timeWaitedInMilliseconds < maxWaitTimeInMilliseconds) 
     { 
      Thread.Sleep(Settings.SleepTime); 
      timeWaitedInMilliseconds += Settings.SleepTime; 
     } 
    } 

    public static bool IsAjaxRequestInProgress(this Browser browser) 
    { 
     var evalResult = browser.Eval("watinAjaxMonitor.isRequestInProgress()"); 
     return evalResult == "true"; 
    } 

    public static void InjectAjaxMonitor(this Browser browser) 
    { 
     const string monitorScript = 
      @"function AjaxMonitor(){" 
      + "var ajaxRequestCount = 0;" 

      + "$(document).ajaxSend(function(){" 
      + " ajaxRequestCount++;" 
      + "});" 

      + "$(document).ajaxComplete(function(){" 
      + " ajaxRequestCount--;" 
      + "});" 

      + "this.isRequestInProgress = function(){" 
      + " return (ajaxRequestCount > 0);" 
      + "};" 
      + "}" 

      + "var watinAjaxMonitor = new AjaxMonitor();"; 

     browser.Eval(monitorScript); 
    } 
} 
+1

यह समाधान तब तक काम करता है जब तक मॉनिटर जावास्क्रिप्ट इंजेक्शन से पहले एक या अधिक AJAX अनुरोध शुरू नहीं होते हैं (जिस बिंदु पर काउंटर अब सटीक नहीं है)। मुझे नहीं पता कि पहले WATN से प्रक्रिया में मॉनिटर इंजेक्ट कैसे करें। यह हो सकता है कि परीक्षण चलाने के दौरान jquery शामिल होने के बाद सही स्थिति में मॉनिटर को सशर्त रूप से शामिल करना सबसे अच्छा शर्त है। –

+0

मैंने अपने एप्लिकेशन के मास्टरपेज में वैश्विक AJAX ईवेंट हैंडलर लगाए हैं। इसके अलावा मैं केवल काउंटर के बजाय एक सेमीफ़ोन बिट रखता हूं: http://lebobitz.wordpress.com/2011/03/06/synchronizing-watin-and-ajax-with-jquery/ –

+2

हालांकि आपके कोड के साथ एक समस्या - अगर वेबसाइट में jQuery समर्थन नहीं है (जैसा कि मेरे मामले में है) - आप पहले "इसे इंजेक्ट करना" चाहते हैं। "मॉनिटर स्क्रिप्ट" से पहले बस इस कोड को जोड़ें। कॉन्स स्ट्रिंग jquerry = @ "var element1 = document.createElement ('script'); element1.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js'; element1.type = 'पाठ/जावास्क्रिप्ट'; document.getElementsByTagName ('सिर') [0] .appendChild (element1); "; ब्राउज़र। औसत (jquerry); @Alex टिप्पणी के संबंध में – Alex

6

यह समाधान, बहुत अच्छी तरह से काम नहीं करता है क्योंकि .ajaxStart केवल पहले Ajax अनुरोध के लिए कहा जाता है, जबकि .ajaxComplete हर बार एक ajax अनुरोध समाप्त हो गया है कहा जाता है। अगर आप अपने कंसोल में कोई इस सरल कोड चलाएँ:

$.ajax({url:"/"}); $.ajax({url:"/"}) 

और .ajaxStart और .ajaxComplete हैंडलर तरीकों में कुछ लॉगिंग जोड़ने के लिए, आप देख सकते हैं कि .ajaxStart हैंडलर केवल एक बार और .ajaxComplete हैंडलर दो बार बुलाया जाएगा। तो ajaxRequestCount नकारात्मक हो जाएगा और आपका सभी डिज़ाइन खराब हो जाएगा।

मेरा सुझाव है कि आप के बजाय .ajaxSend का उपयोग करें यदि आप अपना डिज़ाइन रखना चाहते हैं।

एक अन्य समाधान .ajaxStop बजाय .ajaxComplete उपयोग करने के लिए होगा, लेकिन ऐसा करके, आप ajaxRequestCount की जरूरत नहीं है, आप केवल एक बूलियन का कहना है कि अगर वहाँ दृश्य के पीछे चल रहा ajax अनुरोध कर रहे हैं की जरूरत है।

बहुत उपयोगी जानकारी पाया जा सकता है: http://api.jquery.com/category/ajax/global-ajax-event-handlers/

आशा इस मदद करता है।

+0

.ajaxStart के दुरुपयोग पर अच्छी कॉल। यह मेरे समाधान में एक बग है। .ajaxStop का उपयोग करना भी आसान होगा। धन्यवाद! –

3

मैं वाईटीएन का उपयोग करके कुछ परीक्षणों पर काम करते हुए खुद ही इस मुद्दे में भाग गया। मैंने पाया कि version 1.1.0.4000 of WatiN में (मई 2 एन डी 2007 को जारी किया (नवीनतम संस्करण दिसंबर 20 वीं 2009) से की जा रही 2.0 RC2), यह दावा किया है कि टेस्ट मैचों में अजाक्स से निपटने के लिए बेहतर समर्थन जोड़ा गया:

AJAX का बेहतर समर्थन परीक्षण करने के लिए सक्षम वेबसाइटें, यह रिलीज आपके टूलबॉक्स में कुछ और विकल्प जोड़ता है।

एक नई विधि जोड़ी गई है जो तक प्रतीक्षा करेगी जब तक कि कुछ विशेषताओं में मान न हो।यह स्थितियों में आसान हो सकता है जहां आपको का इंतजार करने की आवश्यकता होती है जब तक किसी तत्व के मान को अपडेट नहीं किया जाता है।

उदाहरण:

// Wait until some textfield is enabled 
textfield.WaitUntil("disable", false.ToSting, 10); 
// Wait until some textfield is visible and enabled 
textfield.WaitUntil(new Attribute("visibile", new BoolComparer(true)) && new Attribute("disabled", new BoolComparer(false))); 

अधिक जानकारी के लिए link to the release notes देखें।

मैंने इसे अभी तक विस्तार से नहीं देखा है, इसलिए मैं यह नहीं बता सकता कि यह कौन सा मामला उपयोगी हो सकता है या नहीं। लेकिन सोचा कि अगर किसी और के पास इस सवाल पर आता है तो यह उल्लेखनीय हो सकता है।

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