Konumlandırıcıların nasıl doğru şekilde kullanılacağını anlamak, otomasyon komut dosyalarınızı oluşturmanın anahtarıdır. Sonuçta, UI öğesini “find”, onu kontrol edemezsiniz (bir düğmeyi tıklamak gibi).
Mobil (veya Web) Otomasyon Testinde herhangi bir senaryonun otomatikleştirilmesi şu 2 adımı takip eder:
- UI öğesi bulucularını bulun (benzersiz).
- Bu öğe üzerinde bir işlem gerçekleştirin.
Bu bölümde ilk adıma odaklanacağız ve mevcut tüm Konum Belirleyici Bulma Stratejilerini inceleyeceğiz ve her bir stratejinin artılarını ve eksilerini tartışacağız.
Element Locator Nedir?
Öğe Bulucu, bir Mobil Uygulamada (veya Web Sitesinde) bir UI Öğesini tanımlayan bir adresten başka bir şey değildir. Tek bir mobil uygulama ekranında birçok UI öğesi bulunduğundan, aynı (jenerik) adresin birden fazla öğeye gönderme yapma olasılığı olabilir. Bu, öğe için benzersiz bir adres bulmamız gerektiği anlamına gelir. Göreceğiniz gibi, bazen bu kolaydır ve diğer zamanlarda UI öğenizi benzersiz bir şekilde tanımlamak için biraz daha araştırma yapmanız gerekir. Öğeyi benzersiz bir şekilde tanımlama yönteminize konum belirleme stratejisi denir. Appium birçok farklı stratejiyi kullanılabilir hale getirir.
driver.findElement(By.id(“Login Screen”)).click();
Burada kimlik, Konum Belirleme stratejisidir ve Oturum Açma Ekranı benzersiz kimliktir (adres). Bunu “Öğeyi <locator strategy> <element unique id> ile bulma” olarak okumayı düşünün. Bu örnekte Appium’a “id” stratejisini (eşsiz kimliğe göre öğeleri bulmak için kullanılır) kullanmasını söylüyoruz ve kullandığımız kimliğin “Oturum Açma Ekranı” olduğunu söylüyoruz.
Aşağıdaki resim, herhangi bir android uygulaması için (Java’da) Textview öğesini nasıl bulabileceğinizi açıklar.
Tahmin edebileceğiniz gibi, kullanabileceğiniz birçok farklı yer bulma stratejisi vardır:
- Accessibility ID
- Class name
- ID
- Name
- XPath
Hangi tür Konum Belirleme Stratejisinin kullanılacağını öğrenmek, Appium ile rahat olma öğrenme sürecinin bir parçasıdır.
NOT: Yukarıdaki Konum Belirleme Stratejilerinin tümü, Appium Inspector Tool (hem Android hem de iOS için) kullanılarak incelenebilir
Accessibility ID
Bu, Appium’da en çok tercih edilen konum belirleme stratejisidir. Mümkünse her zaman bunu kullanın.
Bu, iOS ve Android’de benzer şekilde çalıştığından, kodunuzu daha fazla yeniden kullanılabilir hale getiren bir Çapraz platform bulma stratejisidir.
iOS: Erişilebilirlik kimliği özelliği(öznitelik) değeri geliştirme zamanında (uygulama geliştiricileri tarafından) ayarlanmışsa, bunu Appium Inspector(Android ve iOS) veya UiAutomatorViewer(Android) kullanarak inceleyebilirsiniz. Erişilebilirlik Kimliği özellik değeri geliştirici tarafından tanımlanmadığında, varsayılan olarak o UI Öğesinin Adına eşittir.
Android: Erişilebilirlik Kimliği özelliği, Android’de content-desc özelliğine(özniteliği) eşittir.
WebElement chromeButtonElement = driver.findElementByAccessibilityId(“buttonStartWebviewCD”); MobileElement mobileElement = (MobileElement)chromeButtonElement;
Class Name
Sınıf Adı kullanarak bir öğe bulmak geneldir ve birçok öğe aynı sınıf adına sahip olduğundan benzersiz öğeyi bulmayı garanti etmez.
iOS: iOS’ta sınıf adı, UIAutomation sınıfının tam adıdır ve iPhone Apps’in eski sürümleri için UIAButton, UIARadioButton ve UIATextField gibi “UIA” anahtar sözcüğü ile başlar ve Swift programlama dilinde yapılmış en son sürümlerde bulabilirsiniz. “XCUITest” anahtar sözcüğü.
Android: Android’de sınıf adı, UIAutomator sınıfının tam adıdır ve buna örnekler: android.widget.TextView , android.widget.Button, android.widget.ImageButton, android.widget.CheckBox vb.
Şimdi, yukarıdaki resimde , Chrome Düğmesi için görebileceğiniz gibi, sınıf adı, Kullanıcı Kayıt düğmesi için aynı olan android.widget.ImageButton’dur. Hangisi soruyu bırakır, doğru düğmeyi nasıl alırsınız? Cevap “Indexing” kullanıyor
Yukarıdaki şekil-2’de Chrome Görüntü Düğmesinin dizin değeri 0 iken, aşağıdaki görüntüde Kullanıcı Kayıt Görüntüsü düğmesinin dizin değerinin 1 olduğunu görebilirsiniz, bu nedenle konumlandırıcı ve Dizin kombinasyonu ile gerekli Unique UI bulucuyu elde edebilirsiniz. Bu, sabitlik sağlamadığı için TAVSİYE EDİLMEZ. Örneğin, ekrana yeni bir Görüntü düğmesi eklenirse, dizinlerin değişme olasılığı çok yüksektir!).
İlgili programlama dilleri yöntemlerini kullanarak indekslenmiş değerleri alabilirsiniz.
List<MobileElement> mobileElements = (MobileElement) driver.findElementsByClassName(“android.widget.ImageButton”); MobileElement mobileElement = mobileElement.get(1);
Selenium Yöntemlerini Kullanma:NOT: Aslında Appium’da konum belirleyicileri iki yolla elde edebilirsiniz (id, name, className ve xpath için).
WebElement element = driver.findElement(By.className(“android.widget.ImageButton”)); // OR WebElement element = driver.findElementByClassName(“android.widget.ImageButton”);
Appium (Selenium Wrapper) Yöntemlerini Kullanma:
MobileElement mobileElement = (MobileElement) driver.findElement(By.className(“android.widget.ImageButton”));
// OR
MobileElement mobileElement = (MobileElement) driver.findElementByClassName(“android.widget.ImageButton”);
ID
Mobil Uygulama Otomasyonu kimliği Native içerik biçimindedir, Selenium WebDriver’ın CSS kimliğine benzemez.
id ayrıca erişilebilirlik kimliğine benzer platformlar arası konum belirleme stratejisidir.
iOS: Öğeleri ada ve etiket özelliğine göre bulur, ancak bundan önce Appium, verilen kimlik dizesiyle eşleşen bir erişilebilirlik kimliği aramaya çalışır.
Aşağıdaki ekran görüntüsü için her iki konum belirleme stratejisi de geçerlidir.
driver.findElementById(“IntegerA”);
// OR
driver.findElementById(“TextField1”);
Android: Android’de kaynak kimliği özelliğidir. Ortak <package-name>:id/<id-name> dize biçimini içerir.
Bu dizenin tamamını (ör. io.selendroid.testapp:id/startUserRegistration) veya yalnızca <id-name> (startUserRegistration) kullanabilirsiniz. Yani aşağıdaki kodda her iki seçenek de geçerlidir.
driver. findElementById(“io.selendroid.testapp:id/startUserRegistration”);
// OR
driver.findElementById(“startUserRegistration”);
Name
iOS ve Android: Her iki platformdaki öğenin adıdır. Bu, erişilebilirlik kimliği kadar sık kullanılmaz ve kimlik stratejileri çoğunlukla kullanılır.
Aşağıdaki resimde, aşağıdakileri kullanarak Name niteliğini bulabilirsiniz:
MobileElement element = driver.findElementByName(“IntegerA”);
Appium’da XPath Yazma
Bu konum belirleme stratejisi, uygulamanın XML yapısını analiz eder ve öğeyi diğer öğelere göre konumlandırır.
XPath, orijinal olarak, benzersiz UI öğelerini bulmak amacıyla XML verilerinde gezinmeye izin verecek şekilde tasarlanmıştır.
XPath seçicileri çapraz platform değildir.
Bu strateji yalnızca bir UI Öğesine atanmış bir Erişilebilirlik Kimliği, Kimlik veya Ad olmadığında kullanılmalıdır. XPath, performans ve kararlılık sorunlarına sahiptir ancak platformlar ve hatta cihaz üreticileri arasında çok “kırılgan” bir değişim gösterir.
Yukarıdaki stratejileri denediğinizde ve başarısız olduğunuzda bu strateji kurtarmaya gelir. Ana XML düğümlerine bağlı olduğundan, gerçekten çok kırılgandır, çünkü herhangi bir yeni UI öğesi eklendiğinde veya kaldırıldığında, XML yapısı değiştirilir ve konum belirleyicileriniz bozulur.
Şimdi soru şu ki, neden XPath kullanacaksınız?
Karmaşık sorguların formüle edilmesini sağlar.
Appium’un kullanabileceği XML yapısındaki herhangi bir UI öğesini tam anlamıyla bulabilir. Bu nedenle, Kimlik veya Ad mevcut olmasa bile, onu XPath ile yine de bulabilirsiniz.
Appium Inspector’ı Application XML yapısının incelenmesi için kullanıyorsanız, Appium size XPath’i ekstra çaba harcamadan doğrudan verecektir.
Öğeyi benzersiz bir şekilde bulmak için XPath kullanarak herhangi bir özniteliği ve/veya özniteliklerin birleşimini kullanabilirsiniz. Ekran görüntüsündeki yukarıdaki XPath dışında, aşağıdaki XPath’lerin tümü geçerlidir ve Compute Sum düğmesini benzersiz bir şekilde bulur.
MobileElement computeSumButton = driver.findElementByXPath (“//XCUIElementTypeButton[@name=”ComputeSumButton”]”);
// OR
MobileElement computeSumButton = driver.findElementByXPath(“(//XCUIElementTypeButton)[1]”);
// OR
MobileElement computeSumButton = driver.findElementByXPath (“//XCUIElementTypeButton[@label=’Compute Sum’]”);