2014-10-09 38 views
7

angularjs kullanılarak oluşturulan bir web formu içinde, bir açılan kutu içine bazı verileri girmeye çalışıyorum bekleyerek sonra aşağı ok tuşuna basarak bir değer seçin ve ardından Enter tuşuna basın. Bundan sonra, açılan kutunun pop-up penceresinin (Kendo UI Combo Box) artık görünmediğini kontrol ediyorum. Windows'ta Windows ve Mac OS X'te Chrome'da çalıştırmakAçıölçer SendKeys()

testleri, aşağıdaki kod çalışıyor:

comboInput.sendKeys('CAN') 
    .sendKeys(protractor.Key.ENTER) 
    .sendKeys(protractor.Key.ARROW_DOWN) 
    .sendKeys(protractor.Key.ENTER); 

expect(input.getAttribute('value')).toBe('id_3'); 
expect(popup.getAttribute('style')).toContain('display: none'); 

Açıölçer "CAN" combobox içine, sonra aşağı ok kullanılarak görünür girişini seçer girer tuşuna basın ve ardından Enter tuşu ile seçimi onaylar, bu da Birleşik Kutuyu açmayı da kapatır. Popup nedense beklentiyi değerlendirmeden önce ateş edilmez görevden anahtar olay girin beri OS X'te

, bu, ikinci beklenti hep başarısız, işe yaramaz.

Ben çalışması için aşağıdaki kodu değiştirmek olduğunu fark ettik:

comboInput.sendKeys('CAN') 
    .sendKeys(protractor.Key.ENTER) 
    .sendKeys(protractor.Key.ARROW_DOWN) 
    .sendKeys(protractor.Key.ENTER).then(function() { 
     expect(input.getAttribute('value')).toBe('id_3'); 
     expect(popup.getAttribute('style')).toContain('display: none'); 
    }); 

sendKeys bir söz verir ve ben orada beklenti koyarsanız, her şey gayet iyi çalışıyor.

bu bunu yapmak için doğru yolu var mı? Web'de bulduğum örneklerin hiçbiri, sendKeys numaralı telefondan then numaralı telefonu kullanamaz.

Ve neden yapar Windows üzerinde değil, OS X üzerinde ilk kod çalışır? Bir şey mi eksik? Bunu yapmanın daha iyi bir yolu var mı?

Edit: Bu muhtemelen OS X'deki yerel klavye olaylarının işlenmesiyle ilgili midir?

Not: http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.sendKeys de Açıölçer belgeleri aşağıdaki sahiptir yerli klavye olayları henüz (OS X üzerinde örneğin Firefox) desteklenmez tarayıcılarda, anahtar olaylar sentez edilecektir. Özel birleştirme tuşları standart bir QWERTY en-us klavye düzenine göre sentezlenir. sendKeys yana

+0

Mükemmel bir soru! Cevabım yok, ama Jasmine'i kullanmanız halinde, 'sendKeys' parçasını '' bekle '' kısmından her birini kendi 'it()' bloğundan ayırın ve o teknikle kaçının. –

+0

Ayrıca ödeme sorunu [# 690] (https://github.com/angular/protractor/issues/690) OSX SendKeys konularda bazı bağlantılar için. –

+0

Ama bu amacı bozmaz mıydı?Bana göre, her bir test (bir "o" da tarif edilmiştir) hem eylemleri (bu durumda sendKeys'i) hem de doğrulamayı ("bekliyor") içerir. Bunları ayrı ayrı testlere ayırmak bu bağlantıyı koparır. – nwinkler

cevap

6

o asenkron var, bir söz verir (bildiğiniz gibi) ve her türlü makine üzerinde beklenenden daha geç olacaktı yükümlüdür. Sınama Windows üzerinde 1000 kez çalıştırırsanız, aynı nedenle en az birkaç kez başarısız olur.

Neredeyse böyle durumlar için bir "en iyi uygulama" bulmaya çalışırken yaşlılıktan öldü ettik ve zaten ne yaptığını dışında biri olduğunu sanmıyorum. Sözüm geri dönen eylemlere dayanan İletici testlerimin çoğu, içeride anonim işlevlere sahip then() ifadelerinin uzun dizeleri haline gelir. bağlantısına bakın:

How to assign count of rows or getText to a variable in Protractor

Temel olarak, doğru sırayla şeyler yapmak Protractor zorunlu tutmazsanız, on üzerinden daha sonra beş kez yanlış sırayla gerçekleşecek.