ExtJS'yi Selenium ile test etmedeki en büyük engel, ExtJS'nin standart HTML öğelerini oluşturmaması ve Selenium IDE'nin saf bir şekilde (ve haklı olarak) yalnızca dekor görevi gören öğeleri hedefleyen komutlar oluşturmasıdır - ExtJS'ye tüm masaüstünde yardımcı olan gereksiz öğeler - bak ve hisset. İşte bir ExtJS uygulamasına karşı otomatik Selenium testi yazarken topladığım birkaç ipucu ve püf noktası.
Genel ipuçları
Öğeleri Bulma
Firefox'ta Selenium IDE ile kullanıcı eylemlerini kaydederek Selenium test senaryoları oluştururken, Selenium kaydedilen eylemleri HTML öğelerinin kimliklerine dayandıracaktır. Bununla birlikte, çoğu tıklanabilir öğe için, ExtJS, kod değişikliği yapılmamış olsa bile, aynı sayfaya sonraki bir ziyarette büyük olasılıkla değişebilecek "ext-gen-345" gibi oluşturulmuş kimlikleri kullanır. Bir test için kullanıcı eylemlerini kaydettikten sonra, oluşturulan kimliklere bağlı olan bu tür tüm eylemlerin üzerinden geçmek ve bunları değiştirmek için manuel bir çaba gösterilmesi gerekir. Yapılabilecek iki tür değiştirme vardır:
Bir Kimlik Bulucuyu bir CSS veya XPath Bulucu ile Değiştirme
CSS bulucuları "css =" ile başlar ve XPath yer belirleyicileri "//" ile başlar ("xpath =" öneki isteğe bağlıdır). CSS bulucuları daha az ayrıntılıdır ve okunması daha kolaydır ve XPath buluculara göre tercih edilmelidir. Ancak, bir CSS bulucu tarafından kesilemediği için XPath konumlandırıcılarının kullanılması gereken durumlar olabilir.
JavaScript Yürütme
ExtJS tarafından gerçekleştirilen karmaşık oluşturma nedeniyle bazı öğeler basit fare / klavye etkileşimlerinden daha fazlasını gerektirir. Örneğin, Ext.form.CombBox gerçekten bir <select>
öğe değil, belge ağacının altında bir yerde bulunan ayrı bir açılır listeye sahip bir metin girişidir. Bir ComboBox seçimini düzgün bir şekilde simüle etmek için, önce açılır oka bir tıklamayı simüle etmek ve ardından görünen listeyi tıklamak mümkündür. Ancak, bu öğeleri CSS veya XPath konumlandırıcıları aracılığıyla bulmak zahmetli olabilir. Bir alternatif, ComoBox bileşeninin kendisini bulmak ve seçimi simüle etmek için üzerinde yöntemler çağırmaktır:
var combo = Ext.getCmp('genderComboBox');
combo.setValue('female');
combo.fireEvent('select');
Selenium'da runScript
komut, yukarıdaki işlemi daha kısa bir biçimde gerçekleştirmek için kullanılabilir:
with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
AJAX ile Başa Çıkma ve Yavaş Oluşturma
Selenium, bir kullanıcı eylemi sayfa geçişlerine veya yeniden yüklemelere neden olduğunda sayfa yüklemelerini beklemeye yönelik tüm komutlar için "* AndWait" aromalarına sahiptir. Bununla birlikte, AJAX getirmeleri gerçek sayfa yüklemelerini içermediğinden, bu komutlar senkronizasyon için kullanılamaz. Çözüm, AJAX ilerleme göstergesinin varlığı / yokluğu veya bir ızgaradaki satırların görünümü, ek bileşenler, bağlantılar vb. Gibi görsel ipuçlarından yararlanmaktır. Örneğin:
Command: waitForElementNotPresent
Target: css=div:contains('Loading...')
Bazen bir öğe, bir kullanıcı eylemi bir görünüm değişikliğine neden olduktan sonra ExtJS'nin bileşenleri ne kadar hızlı işlediğine bağlı olarak yalnızca belirli bir süre sonra görünecektir. Komutla keyfi gecikmeler kullanmak yerine pause
ideal yöntem, ilgi unsurunun bizim kavrayışımıza girmesini beklemektir. Örneğin, görünmesini bekledikten sonra bir öğeye tıklamak için:
Command: waitForElementPresent
Target: css=span:contains('Do the funky thing')
Command: click
Target: css=span:contains('Do the funky thing')
Testlerin farklı tarayıcılarda veya farklı makinelerde çalıştırılmasından kaynaklanan zamanlama farklılıkları test senaryolarını kesintiye uğratacağından, rastgele duraklamalara güvenmek iyi bir fikir değildir.
Tıklanamayan Öğeler
Bazı öğeler click
komutla tetiklenemez . Bunun nedeni, olay dinleyicisinin aslında kapsayıcıda olması, alt öğelerindeki fare olaylarını izlemesi ve sonunda ana öğeye kadar köpürtülmesidir. Sekme kontrolü bir örnektir. Bir sekmeyi tıklamak için mouseDown
, sekme etiketinde bir etkinliği simüle etmeniz gerekir :
Command: mouseDownAt
Target: css=.x-tab-strip-text:contains('Options')
Value: 0,0
Alan Doğrulama
Doğrulama için ilişkili normal ifadelere veya vtiplere sahip olan form alanları (Ext.form. * Bileşenleri) validationDelay
, kullanıcı metni girdikten sonra veya alan kaybettiğinde belirli bir gecikmeyle ( varsayılan olarak 250 ms'ye ayarlanan özelliğe bakın) doğrulamayı tetikler. odak - veya bulanıklaştırır ( validateOnDelay
özelliğe bakın ). Bir alana bir metin girmek üzere Selenium türü komutunu verdikten sonra alan doğrulamasını tetiklemek için aşağıdakilerden birini yapmanız gerekir:
Gecikmeli Doğrulamayı Tetikleme
Alan anahtar oluşturma olaylarını aldığında ExtJS doğrulama gecikme zamanlayıcısını kapatır. Bu zamanlayıcıyı tetiklemek için, basit bir kukla anahtarlama olayı yayınlayın (ExtJS bunu göz ardı ettiği için hangi anahtarı kullandığınız önemli değildir), ardından validationDelay'den daha uzun kısa bir duraklama:
Command: keyUp
Target: someTextArea
Value: x
Command: pause
Target: 500
Anında Doğrulamayı Tetikleme
Anında doğrulamayı tetiklemek için alana bir bulanıklık olayı enjekte edebilirsiniz:
Command: runScript
Target: someComponent.nameTextField.fireEvent("blur")
Doğrulama Sonuçlarını Kontrol Etme
Doğrulamanın ardından, bir hata alanının olup olmadığını kontrol edebilirsiniz:
Command: verifyElementNotPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
Command: verifyElementPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
"Display: none" kontrolünün gerekli olduğuna dikkat edin, çünkü bir hata alanı gösterildikten sonra gizlenmesi gerekir, ExtJS hata alanını DOM ağacından tamamen kaldırmak yerine gizleyecektir.
Öğeye Özgü İpuçları
Bir Dahili Form Düğmesine Tıklama
seçenek 1
Komut: Hedefi tıklayın: css = button: içerir ('Kaydet')
Düğmeyi başlığıyla seçer
seçenek 2
Komut: Hedefe tıklayın: css = # kaydetme seçenekleri düğmesi
Düğmeyi kimliğine göre seçer
Ext.form.ComboBox'tan Değer Seçme
Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
Öncelikle değeri ayarlar ve ardından gözlemci olması durumunda select olayını açıkça tetikler.