2012-09-25 22 views
9

परिदृश्य: संशोधित करें और एक अभियान के लिए एक अधूरी परिवर्तन को सहेजने केबेहट को AJAX कॉल के लिए कैसे प्रतीक्षा करें?

Given I click on the Campaign section folder 
And I press Save in the selected Campaign 
Then I should see an error balloon informing the changes cannot be saved 

प्वाइंट है कि इस 'त्रुटि गुब्बारा' अंतिम चरण में की सफलता के अनुसार एक ajax कॉल जो फिर एक हरे या लाल गुब्बारा लाएगा है आपरेशन। वर्तमान में मैं के बाद क्या करता हूं 'और मैं सहेजें दबाता हूं ...' मैं इस गुब्बारे को दिखाने के लिए समय देने के लिए नींद (3) करूंगा। यह बहुत स्मार्ट कॉज़ प्रतीत नहीं होता है कि आप समय बर्बाद कर रहे हैं और इसलिए भी कि इस कॉल को संसाधित करने में कुछ समय लग सकता है।

आप लोग अपने व्यवहार परीक्षण कैसे करते हैं ताकि जानवरों को सोने के बजाय अजाक्स को किया जा सके?

किसी भी प्रतिक्रिया के लिए आपको बहुत बहुत धन्यवाद!

+0

कुछ कोड दिखाओ? – StaticVariable

उत्तर

26

यह आपके बकाया AJAX कॉल को 0 हिट करने के लिए प्रतीक्षा करके किया जाता है। JQuery.active आपके लिए यह जांच करेगा।

अपने फ़ीचरContext.php में, आप कुछ ऐसा कर सकते हैं;

public function iShouldSeeAnErrorBalloon($title) 
{ 
    $time = 5000; // time should be in milliseconds 
    $this->getSession()->wait($time, '(0 === jQuery.active)'); 
    // asserts below 
} 

और सुनिश्चित करें कि आप एक मिंक ड्राइवर का उपयोग करें जो जावास्क्रिप्ट और AJAX चलाता है (डिफ़ॉल्ट नहीं है)।

1

मामले में आप Prototypejs (उदाहरण, Magento) का उपयोग कर रहे हैं, बराबर कोड है:

public function iShouldSeeAnErrorBalloon($title) 
{ 
    $this->getSession()->wait($duration, '(0 === Ajax.activeRequestCount)'); 
    // asserts below 
} 
+1

$ अवधि आवृत्ति कहां से आ रहा है? –

+0

http://mink.behat.org/api/behat/mink/session.html#wait() 'सार्वजनिक शून्य प्रतीक्षा (पूर्णांक समय, स्ट्रिंग स्थिति) कुछ समय तक प्रतीक्षा करता है या जब तक जेएस की स्थिति सच नहीं होती है। – Steff

+0

बस उस लिंक को अपडेट करना, हालांकि मैंने लाइन नंबरों का उपयोग किया है, इसमें कोई संदेह नहीं होगा कि जल्द ही तिथि समाप्त हो जाएगी: https://github.com/Behat/Mink/blob/master/src/Behat/Mink/Session.php # L318-L329 – DanielM

2

मैं इंतज़ार कर रहा डोम अजाक्स कॉल के परिणाम के रूप में बदलने के लिए के लिए द्वारा करते हैं। मैं DocumentElement का एक उपवर्ग बनाया है, बुला यह AsyncDocumentElement और findAll विधि अधिभावी:

public function findAll($selector, $locator, $waitms=5000) 
{ 
    $xpath = $this->getSession()->getSelectorsHandler()->selectorToXpath($selector, $locator); 

    // add parent xpath before element selector 
    if (0 === strpos($xpath, '/')) { 
     $xpath = $this->getXpath().$xpath; 
    } else { 
     $xpath = $this->getXpath().'/'.$xpath; 
    } 

    $page = $this->getSession()->getPage(); 

    // my code to wait until the xpath expression provides an element 
    if ($waitms && !($this->getSession()->getDriver() instanceof \Behat\Symfony2Extension\Driver\KernelDriver)) { 
     $templ = 'document.evaluate("%s", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength > 0;'; 

     $waitJs = sprintf($templ, $xpath); 

     $this->getSession()->wait($waitms, $waitJs); 
    } 

    return $this->getSession()->getDriver()->find($xpath); 
} 

फिर \ Behat \ मिंक \ सत्र में मुझे लगता है कि वर्ग का उपयोग करने के निर्माता बदल दिया है।

public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null) 
{ 
    $driver->setSession($this); 

    if (null === $selectorsHandler) { 
     $selectorsHandler = new SelectorsHandler(); 
    } 

    $this->driver   = $driver; 
    $this->page    = new AsyncDocumentElement($this); 
    $this->selectorsHandler = $selectorsHandler; 
} 

एक बार मैंने ऐसा करने के बाद, मुझे पता चला कि मेरे एंगुलरजेएस परीक्षण काम कर रहे थे। अब तक, मैंने केवल फ़ायरफ़ॉक्स में परीक्षण किया है।

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