2012-09-25 12 views
9

Senaryo: değiştirin veBehat, AJAX araması için nasıl bekler?

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 

Noktası son adımda bu 'hata balon' başarısına göre daha sonra yeşil veya kırmızı balon getirecek bir ajax arama olmasıdır Bir Kampanyaya tamamlanmamış bir değişikliği kaydetmek operasyon. Şu anda yaptığım şey, 'dan sonra 'Kaydet'e basıyorum.' Bu balonun görünmesi için zaman vermek için bir uyku (3) yapacağım. Bu çok akıllı görünmüyor, çünkü zaman harcıyorsunuz ve aynı zamanda bu çağrının işlenmesi için daha fazla veya daha az zaman alabiliyor.

Ajax'in sadece hayvanların uyumasına değil, behat testlerinin nasıl yapılmasını beklersiniz?

Geri bildiriminiz için çok teşekkürler!

+0

bazı kodları göster? – StaticVariable

cevap

26

Bu, olağanüstü ajax çağrılarınızın 0 değerini beklemesiyle yapılır. JQuery.active yalnızca sizin için kontrol eder.

FeatureContext.php'inizde;

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

Ve yapabilirim emin Javascript'i ve ajax (varsayılan değil) çalışan bir Vizon Sürücü kullanın. durumda

1

Eğer Prototypejs (örn Magento) kullanıyorsanız, eşdeğer kodudur:

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

$ süre değişkeni nereden geliyor? –

+0

http://mink.behat.org/api/behat/mink/session.html#wait() 'public void bekleme (tamsayı süresi, dize koşulu) biraz zaman bekler ya kadar JS koşulu true.' döner – Steff

+0

Sadece bu bağlantıyı güncellemek, hat numaralarını kullandığım gibi, hiç şüphesiz yakında güncelliğini yitirecek: https://github.com/Behat/Mink/blob/master/src/Behat/Mink/Session.php # L318-L329 – DanielM

2

DOM Ajax Çağrısı sonucunda değiştirmek bekleyerek bunu.

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); 
} 

Sonra \ Behat \ Vizon \ Oturumda Ben o sınıfı kullanmak için yapıcı değiştirildi: Ben AsyncDocumentElement arama ve findAll yöntemi geçersiz kılmasını, documentElement bir alt sınıfı yaptı.

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; 
} 

Bunu yaptıktan sonra AngularJS testlerimin çalıştığını gördüm. Şimdiye kadar sadece Firefox'ta test ettim.

İlgili konular