Mobil Test Otomasyonunda Appium — 1

Mesut Beysülen
8 min readMay 4, 2020

Baştan Sona Bir Mobil Testi Nasıl Yazılır?

Herkese Selamlar! Yeni bir appium yazısı ile yeniden buradayız. Hatırlarsanız, bir önceki yazılarımız da kodlamaya başlamadan önce yapılması gereken ortam kurulumlarını anlatmıştık. Şimdi artık meyve verme zamanı geldi, sanırım. Eğer önceki yazılarımı okumadan direk bu yazı ile karşılaşıyorsanız, kurulumlar ve ayarlamalar için aşağıdaki linklerden diğer yazılarıma ulaşabilirsiniz. Ha, bir de eğer yazılarımı beğeniyorsanız sonunda alkışlamayı(claps-claps-claps…) unutmayın. Ha, beğenmedim diyorsanız da eleştirilerinizi yazmayı da ihmal etmeyin derim…

Appium u anlamak için başlangıç aşamasında aşağıdaki yazıyı okumanızı tavsiye ediyorum…

Geliştirmelerimizi yapamdan önce java vb. kurulumlarımızı yapmak için aşağıdaki yazıyı okumanızı tavsiye ediyorum…

Appium ve Intellij Idea kurulumlarınızı doğru yapmak için aşağıdaki yazıyı okumanızı tavsiye ediyorum…

Linkeleri paylaştığımıza göre hadi başlayalım! Şimdi öncelikle appium da testlerimizi ya gerçek bir cihaz üzerinde ya da emulatör üzerinde çalıştıracağız. Bu 2 durum için appium sunucusunun adres bilgisini değiştirmek gerekiyor.

Sunucu adresi ayarları için “Advanced“ sekmesini tıklayalım ve Server Adresi default olarak “0.0.0.0” geldiğini göreceksiniz. Bu aslında gerçek bir cihaz üzerinde çalıştırdığımızda kalması gereken adres. Ancak biz makinemizde ki bir emulatör üzerinden çalıştıracağımız için bu Server Address alanını “127.0.0.1“ olarak değiştireceğiz. Ve ardından bir sorun oluştuğunda oturumu geçersiz kılmak için “Oturum Geçersiz Kılmaya İzin Ver” yani “Allow Session Override” alanını ve ardından “Start Server v1.12.1” e tıklıyoruz. Not:Şimdilik port adresini değiştirmemize gerek yok.

Testlerini otomatize edeceğimiz uygulamamızın capabilities bilgilerini girmek için yukarıda gösterdiğim search ikonuna tıklamanız yeterli.

EMULATÖR VE UYGULAMAYA AİT APK KURULUMU

Emülatör kurulumu için Android Studio ya ihiyacımız var.

Android Studio’yu indirmek için tıklayınız.

Hızlıca indirilen exe için kurulum gerçekleştiriyoruz. Sonrasında Android Studio yu açıyoruz. Aşağıdaki gibi gelen ekranda Configure →SDK Manager tıklayınız.

Açılan ekranda bulanan Android SDK Location alanındaki path i daha önce java kurulumu sonrasında Envoirment Variables kısmına yaptığımız gibi ANDROID_HOME adında bir değişken oluşturup, bu path’i buraya ekliyoruz.

Tekrar Android Studio Ekranına gelerek bu ekranda emülatörün Android API seviyesini (Sürüm) seçiyoruz. Sizin tercihinize bırakıyorum burayı ama API ne düşük ne de yüksek olsun. :)

Ben Oreo API 26 yı seçtim. Sonrasında SDK Tools sekmesini seçin ve benim seçtiğim araçların yüklemesi için aynılarını işaretleyin. Ve “Tamam” a tıklayın.

Yükleme bittikten sonra tekrar Configure sonrasında AVD Manager seçin. Ve sonra Emülatör oluşturmak için Create Virtual Device a tıklayın.

Gelen ekranda istenilen cihaz türünü seçin ve Next ile devam edin. Sonraki adım da Android sürümünü ben Pie seçtim daha önce yüklediklerim arasında vardı. Sizler de birden fazla sürüm yükleyebilirsiniz.

Sonra android cihazınızın ismini girebileceğiniz ekran gelecektir. İsmini değiştirip Finish e tıklayın. Ve ardından gelen ekranda “Play”e tıklayarak emülatörünüzün açılamasını bekleyin.

Ve artık emülatörünüz kullanıma hazır…

Sıra geldi uygulamamızın apk sını emülatörümüze yüklemeye…

https://tr-apk.com/ birçok apk nın bulunduğu bir adres. Buradan istediğiniz uygulamaya ait apk yı alabilirsiniz ya da emülatör üzerinden mail adresiniz ile googlePlay den istediğiniz uygulamayı indirebilirsiniz. Emülatörden GooglePlay biraz yavaş olabilir diye https://tr-apk.com/ adresini paylaşıyorum. :D

Testlerimizi “Hepsiburada” uygulaması üzerinde yazacağımız için “Hepsiburada” uygulamasını googlePlay’den indirin.

adb shell
dumpsys window windows | grep -E ‘mCurrentFocus’

Yukarıda ki komutlar aslında “Hepsiburada” uygulamasını açtıktan sonra çalıştırdığımızda emülatörde çalışan uygulama hakkında bilgiler verir. Ancak çoğu uygulamada SplashScreen ler bulunduğu için bu activity i yakalamak gerçekten çok zor. Bu yüzden bizler apkInfo adlı uygulamayı indirerek emülatöre kuracağız.Kurduktan sonra apkInfo yu açın ve hepsiburada uygulamasını bularak üzerine uzunca basılı tutun, gelen seçeneklerden “Detailed Information” seçin. Gelen ekran da artık hepsiburada uygulamasına ait birçok Activity’i görebilirsin.

Ardından, bir komut istemi açın ve bağlı cihazları görmek ve aşağıda gösterildiği gibi cihaz kimliğini almak için “adb devices” komutunu yazın.

SplashActivity, emulatör bilgisini nasıl yakalayacağımızı öğrendik şimdi sıra kullanacağımız android sürümü bilgisini öğreniyoruz. Aslında emülatörü oluştururken bu bilgiyi de görmüştük. Emülatörden Android Sürümünü bulmak için Ayarlar(Settings) kısmından Phone Status yada About emulated device ekranından aşağıdaki gibi öğrenebilirsiniz.

Appium içinde tanımlayacağımız bilgilere ulaştık. Şimdi Intellij Idea da maven projemizi başlatalım.

Create New Project →Maven seçiyoruz. Ve gelen ekranda Create from archetype işaretleyerek altında ki seçeneklerden maven-archetype-quickstart seçilir. Bu seçenek basit anlamda bir proje iskeleti oluşturmamızı sağlayan bir template yapısını tanımlamaktadır. Sonrasında Next tıklanır.

Gelen ekranda Projemize isim verelim.Ben “hepsiburadaMobileAutomation” olarak tanımladım. Sizler de projenize anlamlı bir isim vermelisiniz. Ardından GroupId ve ArtifactId alanlarını da aşağıdaki gibi doldurun ve Next e tıklayın.

Tıkladıktan sonra gelen ekran artık girdiğimiz bilgilerin properties’ ini göstermektedir. Bir yanlışlık görmediğiniz de ve maven directory alanının doğru olduğunu gördüyseniz, artık Finish ile projenizi oluşturabilirsiniz.

Projemiz derlendikten sonra gelen ekranda sağ alt köşede bir pop up çıkacaktır.

Bu projenizde yaptığınız library vb. değişikliklerin otomatik şekilde import edilmesi için sizden enable duruma getirilmesi için bir onay seçeneğidir. Burada “Enable Auto-Import” seçin.

Şimdi projemizde bu aşamada kullanacağımız bazı araçların dependency(bağımlılık) bilgilerini, daha önceki yazılarımda bahsettiğim https://mvnrepository.com/ adresinden alacağız. TestNG ve Appium araçlarını yüklemek için mvnrepository adresinde isimleri ile aratınız.

Ekranda gözüktüğü gibi TestNG ve Appium araçlarınınen son sürümlerinin maven bilgilerini projenizdeki pom.xml dosyasında bulunan <dependencies></dependencies> blok içine ekleyiniz.

pom.xml de bulunan bağımlılıklar aşağıdaki gibi olacaktır.

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/io.appium/java-client -->
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>7.3.0</version>
</dependency>
</dependencies>

Şimdi tekrar Appium uygulamasına dönelim. Start Inspector Session yani appiumda sağ üstte gözüken büyüteç yada search ikonuna tıklayın. Ve capabilities bilgilerini(Hatırlarsanız, yukarıda cihaza ve uygulamaya ait özellikleri bulmuştuk.) girelim. Bu bilgileri sürekli kullanacağımız için “Save As…” ile kaydedelim.

Capabilities Bilgileri

Son olarak “Start Session” butınuna tıklayın. Ve android cihazınız ile appium arasında bir bağ kurulur ve artık aşağıdaki gibi mobil uygulamanın tüm öğelerinin bilgilerine ulaşılabilir durumdayız.

Şuanda bu bilgiler ışığında Intellij Idea üzerinde testlerimizi yazalım ve otomasyonun nasıl test koşacağını görelim.

Yanda olduğu gibi BaseSetup adında bir class oluşturuyoruz. Ve bu class içine otomasyon için Appiuma eklediğimiz capibilities bilgilerini ve koşacağımız testlerimiz yazıyoruz.

Öncelikle uygulamada gelen animasyonun(“Tüm Süpermarketleri ….” diye gelen) kapatılmasını sonrasında uygulamanın login sayfasını açıp kullanıcı bilgileri ile uygulamada login olunacaktır. Aşağıda örnek bir login case i gösterilmiştir.

LOGIN Case

  1. “Kapat” butonu tıklanır, animasyonun kapandığı kontrol edilir.
  2. Account ikonu tıklanır, NavigationBar açıldığı kontrol edilir.
  3. NavigationBar’ da “Giriş Yap veya Üye Ol” tıklanır, Login ekranı geldiği kontrol edilir.
  4. Kullanıcı Adı(E-posta) ve Şifre Girilir, Güvenli Giriş butonuna tıklanır, kullanıcının giriş yaptığı kontrol edilir.
Appium da bilinmesi gereken butonlar

Hepsiburada uygulamasını ilk açtığınızda çıkan izin ayarları ve sonrasında gelen pop up’ ı kapatmak için aşağıdaki kodu bir fonksiyon olarak yazıyoruz.

public void dialogsCloseAndCloseAnimation(){
WebElement check = wait.until(ExpectedConditions.elementToBeClickable(By.id("cb_dialog_perm_rationale_location_dont_show")));
check.click();
WebElement noButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("button2")));
noButton.click();
WebElement okButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("button1")));
okButton.click();
//Click animation close buton
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("close_button")));
element.click();
}

Şimdi de yukarıdaki login case’ imiz de yazan adımları yapacak olan kodumuzu yazıyoruz. Aşağıda uygulamaya bir test kullanıcısı ile login olan fonksiyonu bulacaksınız.

public void loginAccount(){
WebElement account = wait.until(ExpectedConditions.elementToBeClickable(By.id("account_icon")));
account.click();
WebElement userLogin = wait.until(ExpectedConditions.elementToBeClickable(By.id("llUserAccountLogin")));
userLogin.click();
WebElement loginEmail = wait.until(ExpectedConditions.elementToBeClickable(By.id("etLoginEmail")));
loginEmail.sendKeys("***@gmail.com");
WebElement loginPassword = wait.until(ExpectedConditions.elementToBeClickable(By.id("etLoginPassword")));
loginPassword.sendKeys("****");
WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("btnLoginLogin")));
loginButton.click();
}

Şimdi de bu fonksiyonları @Test Tagımızda bulunan loginTest imizin içinde çağıralım.

@Test
public void loginTest () throws InterruptedException {

dialogsCloseAndCloseAnimation();
loginAccount();
}

Aşağıda yazdığımız kodun tamamı bulunuyor. Bir sonraki yazımız da bu işlemlerin kontrollerini nasıl yapacağımızı göstereceğim.

import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.net.MalformedURLException;
import java.net.URL;

public class BaseSetup {

public AndroidDriver<MobileElement> driver;
public WebDriverWait wait;


@BeforeMethod
public void setup () throws MalformedURLException {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("deviceName", "Nexus 5");
caps.setCapability("udid", "emulator-5554"); //DeviceId from "adb devices" command
caps.setCapability("platformName", "Android");
caps.setCapability("platformVersion", "9.0");
caps.setCapability("appPackage", "com.pozitron.hepsiburada");
caps.setCapability("appActivity","com.hepsiburada.ui.startup.SplashActivity");
caps.setCapability("noReset","false");
driver = new AndroidDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"),caps);
wait = new WebDriverWait(driver, 10);
}

@Test
public void loginTest () throws InterruptedException {

dialogsCloseAndCloseAnimation();
loginAccount();
}

public void loginAccount(){
WebElement account = wait.until(ExpectedConditions.elementToBeClickable(By.id("account_icon")));
account.click();
WebElement userLogin = wait.until(ExpectedConditions.elementToBeClickable(By.id("llUserAccountLogin")));
userLogin.click();
WebElement loginEmail = wait.until(ExpectedConditions.elementToBeClickable(By.id("etLoginEmail")));
loginEmail.sendKeys("***@gmail.com");
WebElement loginPassword = wait.until(ExpectedConditions.elementToBeClickable(By.id("etLoginPassword")));
loginPassword.sendKeys("*****");
WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("btnLoginLogin")));
loginButton.click();
}

public void dialogsCloseAndCloseAnimation(){
WebElement check = wait.until(ExpectedConditions.elementToBeClickable(By.id("cb_dialog_perm_rationale_location_dont_show")));
check.click();
WebElement noButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("button2")));
noButton.click();
WebElement okButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("button1")));
okButton.click();
//Click animation close buton
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("close_button")));
element.click();
}

@AfterMethod
public void teardown(){
driver.quit();
}
}

Kodları github hesabımda paylaşıyor olacağım. githubdan takip etmeyi unutmayın. Yeni yazılarda buluşmak dileğiyle…

--

--

Mesut Beysülen

Senior QA-Test Automation Engineer @MigrosOne, Ex @hepsiburada | Instructor on Youtube @mesutbeysulen