Bu yaygın bir sorundur. Ben dikkat:
Elemanları nasıl adlandırırsınız
Öğeleri tanımlamak için css id veya class kullanın. Nesne benzersiz olduğunda CSS kimliğini kullanmayı tercih edin. Kullandığınız çerçeveyi düşünün, örneğin Ruby on Rails ile name
öznitelik otomatik olarak atanır ve (sezgisel olmayan) css id veya sınıfını kullanmaktan daha iyi olabilir
Elemanları nasıl tanımlarsınız.
Veya table/tr/td/td
gibi formlar lehine konum belirleyicilerden kaçının . Uygun olduğunda veri özelliklerini kullanmayı düşünün. Daha da iyisi gibi önlemek düzeni etiketlerine denemek tamamen yüzden yukarıda ya bir yayılma ve kullanımını yani mesela ekleyebilirsiniz için ya gibi bir joker seçici nerede şimdi div, yayılma, td, vb olabilirtd[id="main_vehicle"
td[class='alternates']
<td>
<span id="main_vehicle">
*[id="main_vehicle"]
*
Yalnızca qa ve test için kullanılan teste özgü veri özelliklerini kullanma .
Elemanlar için gereksiz niteliklerden kaçının. Kendinizi aşağıdakileri kullanarak bulabilirsiniz:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
Bununla birlikte, bu giriş alanının, tam bir araç kimliğine sahip bir formda ve bir ana sınıfı ve bir kimliğine sahip bir formun hemen bir çocuğuna sahip olan araç kimliğine sahip bir div içeren bir gövdeli bir sayfada kalmasını gerektirir. araç. Bu yapıda yapılan herhangi bir değişiklik ve test kırılır. Bu durumda,
input#primary_vehicle_name
öğeyi benzersiz bir şekilde tanımlamak için yeterlidir.
Görünür metne gönderme yapan testlerden kaçının. Sayfada kullanıcı tarafından gösterilen metin, site bakımı ve güncellemesi nedeniyle genellikle zaman içinde değişir, bu nedenle css id ve css sınıfı veya veri özellikleri gibi tanımlayıcılar kullanın. Gibi elementler form
, input
ve select
formlarda kullanılan genellikle örneğin id veya sınıf ile birlikte, aynı zamanda tanımlanması elemanlarının iyi parçalarıdır li.vehicle
ya input#first-vehicle
da örneğin kendi tanımlayıcıları ekleyebilir <div data-vehicle='dodge'>
. Bu şekilde, geliştiriciler ve tasarımcılar tarafından değiştirilmesi muhtemel öğe kimliklerini veya sınıflarını kullanmaktan kaçınabilirsiniz. Aslında zamanla geliştiriciler ve tasarımcılar ile çalışmanın ve isimler ve kapsamlar üzerinde anlaşmaya varmanın daha iyi olduğunu gördüm. Bu zor.
Sabit verilerin bakımı.
Gerçek öğeleri tanımlamaya benzer şekilde, satır içi sabit kodlu seçiciden sayfa nesneleri lehine değerleri tanımlamaktan kaçının - değişkenler veya yöntemlerde tutulan ve böylece yeniden kullanılabilir ve merkezi olarak korunabilir. Sabit kodlanmış değerler için bu kalıbı izleyen javascript değişkenlerine örnekler:
storedVars["eqv_auto_year"] = "2015";
storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
storedVars["eqv_auto_make_2"] = "HONDA";`
Selenium Wiki ve Selenium Dokümanlarında Sayfa Nesneleri Hakkında Daha Fazla Bilgi
Geliştiricilerle iletişim.
Teknik geliştiriciden bağımsız olarak 'geliştiriciler değişiklik yapar ve KG otomasyonunu bozar' bu bir iş akışı sorunudur. Şunlardan emin olmalısınız: herkes aynı takımdan; geliştirici aynı entegre testleri çalıştırır; her iki grupta standartlar üzerinde mutabık kalınmakta ve takip edilmektedir; done'nin tanımı UI testlerini çalıştırmayı ve muhtemelen güncellemeyi içerir; geliştiriciler ve test çiftleri test planları üzerinde ve her ikisi de bilet tımarlarına (Agile yapıyorsa) katılır ve tımarlamanın bir parçası olarak UI testi hakkında konuşurlar. Adlandırma için kullandığınız yaklaşım ve stratejilerin uygulama geliştiricilerle koordine edildiğinden emin olmalısınız. Aynı sayfaya ulaşmazsanız, nesne adlandırma konusunda çatışmayı seversiniz. Yakın zamanda bir ruby projesi için oluşturduğum sayfa nesnesi yöntemlerine bazı örnekler:
def css_email_opt_in_true
'auto_policy[email_opt_in][value=1]'
end
def css_phone_opt_in
'*[name="auto_policy[phone_opt_in]"]'
end
def css_phone_opt_in_true
'input[name=phone_opt_in][value=true]'
end
def css_credit_rating
'auto_policy[credit_rating]'
end
Javascript değişkenleriyle aynı sayfa nesneleri şunlardır:
storedVars["css_email_opt_in"] = "css=*[name='auto_policy[email_opt_in]']";
storedVars["css_phone_opt_in"]="css=*[name='auto_policy[phone_opt_in]']";
storedVars["css_phone_opt_in_true"]="css=input[name='phone_opt_in'][value=true]";
storedVars["css_credit_rating"]="css=select[name='auto_policy[credit_rating]']";