Appium ile Mobil Test Otomasyonu

Herkese merhabalar. Normalde çok fazla Türkçe makale yazmıyordum ancak bu makalenin bir çok kişiye faydası olacağını düşündüğüm için Türkçe versiyonunu da yazma kararı aldım. Bundan iki yıl evvelinde Appium ile ilgili kapsamlı bir makale yazmıştım. Bu makaleye şuradan erişebilirsiniz. Ancak teknoloji denen meret şey yerinde durmuyor. Appium içinde bu böyle oldu ve Appium Desktop 2017 ortalarında (Beta olmaktan çıktı) duyuruldu. Bununla birlikte Android tarafında da Android tool’larını artık Android Studio içinde kullanabilir olduk. Diğer türlü command prompt üzerinde bunları kullanabiliyoruz. Bu makalede de bu değişikleri kapsayarak bir Appium’a başlangıç rehberi hazırladım. Ne işte, ne de evde MAC sahibi olamadığım için windows ortamında android telefon kullanarak bir native mobile test otomasyonu yapacağız. Haydi başlayalım.

Adım-1: JAVA ve Maven Kurulumları ve Konfigürasyonları

JAVA JDK’yı bu adresten indirin: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Kurulum adımları ve konfigürasyon ayarları şu makale’nin 4. ve 5. adımında anlatılmıştır. Ekran görüntülerine bakarak zaten anlarsınız. Anlamadığınız noktalarda yorum yazarsanız cevaplamaya çalışırım.

Adım-2: Android Studio Kurulumu ve Konfigürasyonu

Şu andrese gidelim https://developer.android.com/studio/index.html  ve Android Studio’yu indirip, kurmaya başlayalım. Zaten yapacağımız işlemler next next next olacak.

android studio

Aşağıda gösterilen butona tıklayalım. “Download Android Studio For Windows“.

Next’e tıklayalım.

appium tutorial

Seçeneklerin hepsini seçelim ve next’e tıklayalım.

Kurulum klasörünü değiştirmeden Next’leyip ilerleyelim.

android studio

Install’a tıklayıp, kurulumu başlatalım. Sonra da çay demlemeye gidelim. :)

Bu sizin ilk Android Studio kurulum deneyiminiz ise çok heyecanlanmış olabilirsiniz. O nedenle “Do not import settings” i seçelim. :) Zaten ilk kurulum olduğu için eskiden kalma ayarlarımız olmayacaktır. Sonra da OK’e tıklayalım.

Sonraki ekranda da Next’e tıklayın.

appium capabilities

Standartlardan şaşmayalım. Standard’ı seçelim ve Next’leyelim.

android-studio-install

Tema seçimine geldik. Tema vakfına da selam olsun buradan. Yeşillikleri koruyalım ve Darculayı seçelim. Gözler için A vitamini ve Darcula tema öneriyor doktorlar. ;)

appium tutorial ios

Finish çizgisine yaklaştık. Finish’leyelim.

appium tutorial java

Bırakalım kurulum devam edip, sonlansın.

Sonunda kurulumlar tamamlandı ise Finish e tıklayalım.

“Configure” > “SDK Manager” e gidelim ve SDK bilgilerine bakalım. Bunlarla sistem değişkenlerini tanımlayacağız.

Çıkan ekranda Android versiyonunu seçelim. Ben 7.0 seçtim. Burada emulator’un Android API Level’ini seçmiş olduk.

appium testing

Aşağıda gördüğünüz tool’ları seçelim ve OK’e tıklayalım.

appium inspector

Bir daha OK’e tıklayalım.

Finish’leyip, devam edelim.

ios automation

Bu gerekli olan tool’ları da kurduktan sonra SDK Manager sayfasındaki Android SDK Location değerini kopyalayalm.

RapidEE tool aracını indirelim ve kuralım.

ANDROID_HOME değişkenini sistem değişkeni olarak ekleyelim ve değer olarak Android SDK lokasyonunu yapıştıralım. Zaten bir önceki adıma bunu kopyalayalım demiştim. ;) Hazır buraya gelmişken JAVA_HOME değişken değerini de kontrol edelim. O da JAVA JDK lokasyonunu göstermelidir. Aşağıdaki ok’lar anlattıklarımı gösteriyor.

Sonrasında aşağıdaki Android tool’larını ve JAVA JRE‘nin bin klasörünü (Java RunTime Environment) sistem’in path değişkenine ekleyelim.

Tüm bunları yaptıktan sonra bi kontrol edelim bakalım doğru mu yapmışız ayarları. Bir komut satırı ekranı açalım. Komut satırına “sdkmanager –list” yazalım ve enter’a basalım. Aşağıdaki gibi bir ekran bizi karşılarsa size puanım 9 kanka! :) Rapstar jurisi Rapçi Fuat’ı da analım. :)

“uiautomatorviewer” yazalım tıklayalım bakalım o da doğru çalışıyor mu?

Android Studio’da örnek bir proje oluşturalım. Sonrasında aşağıdaki gibi bir ekran göreceğiz. Aşağıda ok gösterilen link’e tıklayarak gerekli olan kütüphaneleri yükleyelim.

what is appium

Finish’e tıklayalım.

download appium

Bu adımda bittikten sonra küçük, sevimli ve tatlış bir android ikonu göreceğiz. Ona da tıklayalım :) Buna tıkladığımızda bir sihir ortaya çıkacak (Magic Happens) ve Android Sanal Cihaz Yöneticisi açılacak.

Bir cihaz oluşturalım. “+ Create a Virtual Device” butonuna tıklayalım.

Sonra bir cihaz seçelim. Eğer PC’niz kuvvetli değilse eski model seçebilirsiniz. PC’nizi zorlamamış olursunuz. ;)

Bende test cihazı olarak Sony Xperia Android 7.0 olduğu için burada da Android 7.0’ı seçtim. Download’a tıklayalım.

Tüm kütüphaneleri indirdikten sonra Next’e tıklayalım.

Son olarak cihaz ayarlarına bakalım, cihazımıza benim güzel canım ciciş cihazım ismini verelim (şaka), cihaza bir istediğiniz bir isim verin ya da ne geldiyse öyle bırakın ve finish e tıklayın.

Sonra da oynat ikonuna tıklayalım.

Bu an keyifli! Android cihazın açıldığını göreceksiniz.

Şu ana kadar Android, JAVA ve sanal cihaz ayarlarını yaptık. Şimdi sırada Appium var. Şimdi onlar düşünsün. :)

Step-3: Appium Desktop Kurulumu ve Konfigürasyonu

Şu adrese gidelim: http://appium.io/downloads.html ve şuna tıklayalım “Appium-Desktop for OSX, Windows and Linux“.

Şuna tıklayalım “appium-desktop-Setup-1.3.1.exe” file. (Bu makaleyi 01.27.2018 tarihinde yazarken mevcut sürüm 1.3.1 idi.)

Kurulum dosyası indikten sonra dosyaya çift tıklayalım ve kurulumu başlatalım.

Kurulum da bittikten sonra appium ikonunu çift tıklayalım ve appium desktop’u açalım. Aşağıdaki ekranı göreceğiz.

Advanced bölümüne geçelim. Server adresini eğer emulator kullanacaksınız “127.0.0.1” olarak yazın gerçek cihaz kullanacaksanız “0.0.0.0” olarak yazın. Bir de “Allow Session Override” seçeneğini seçin. Bir session’da sorun olursa, diğer session onu ezebilsin.

appium

Appium’a gerekli izinleri verelim.

Ve aşağıdaki ekranı gördüyseniz, appium server çalışıyor demektir.

Step-4: Android Cihaz Ayarları ve Test Öncesi Ayarlar

Sanal cihazın güvenlik bölümüne gidip bilinmeyen kaynaklara izin verelim.

Test için örnek bir .apk dosyası indirelim. Ben İsinOlsun’u seçtim.

apk dosyası indikten sonra sürükle-bırak yaparak sanal cihaza atalım. Otomatik olarak yükleme işlemi gerçekleşir.

Cihaz beni yalancı çıkarmazsa aşağıdaki gibi bir ekran göreceksiniz.

Evet, uygulamamız kuruldu.

Uygulama ikonuna tıklayınca uygulamanın açıldığını göreceksiniz.

Bize  “app package info” ve “app activity info” bilgileri lazım. Bunları testi yazarken Desired Capabilities kısmında kullanacağız. Normalde aşağıdaki komut, o an açık olan ekrandaki aktivite ve paket bilgisini verir. Ama işin olsun için başlangıç aktivitesi splash ekranı. Onu yakalamak için APK info programını kullanacağız.

dumpsys window windows | grep -E 'mCurrentFocus'

APK Info uygulamasını da kuralım. Yine sürüklebırak yapacağız.

Uygulamayı açıp, İşinOlsun’u bulun ve uzunca basalım. Çıkan ekranda “Detailed Information” a basalım.

Aşağıdaki ekran gelecektir. İlk aktivite gördüğünüz gibi “com.isinolsun.app.activities.SplashActivity“.  Aktiviye olarak bunu kullanacağız. Paket bilgisi olarak ise “com.isinolsun.com” kullanacağız. Bunu zaten yukarıdaki komutta da bulmuştuk.

Komut satırı açın ve “adb devices” yazıp, enter’a basalım. Bu komut bağlı cihazları gösterir. Buradan cihazın device id sini de görürüz. Bunları hep Desired Capabilites olarak kullanacağız.

Cihaz versiyonunu da ayarlara giderek kontrol edebilirsiniz.

Proje oluşturalım. IntelliJ’i açın, create a new project e basalım, Maven’ı seçelim ve ilerleyelim.

GroupId and ArtifactId için istediğiniz birşeyler yazabilirsiniz.

Projeye isim verelim.

“Enable Auto-Import”a tıklayalım.

mvnrepository.com sitesine gidelim ve TestNG, Appium, Selenium için en son dependency bilgilerini kopyalayıp, bunları pom.xml’e yapıştıralım.

pom.xml aşağıdaki gibi görünecektir.

Aşağıdaki gibi projemizde yeni bir JAVA class’ı oluşturalım.

Son kez cihaz bilgilerinizi kontrol edelim ve not edelim.

Appium server’a gidelim ve büyütece tıklayarak “Appium Inspector” u açalım.

ios automation

Yukarıda hep kaydedelim, saklayalım dediğim bilgileri aşağıdaki gibi girelim.

Girişleri yaptıktan sonra bu değerleri save edelim. İleride de bunları artık kullanabiliriz.

“Start Session” a bastığınızda inspector açılacaktır.

Inspector o an cihazları ekrandaki elementleri size gösterir. Buradan ilgili element’in ID’sini ve ya XPath’ini bulabilirsiniz.

Tüm bu adımlardan sonra projeyi kodlayabiliriz.

Step-5: Emulator yerine Gerçek Cihaz Kullanın

Ben projeyi yapmaya başladığımda emulator de xpath’leri bulamadım. Ancak gerçek cihazda bunlar sorunsuz çalıştı. Normalde XPath kullanmamaya çalışsak ta bazen bunun zorunda kalabileceğimiz durumlar olabiliyor. Gerçek cihaz kullanmak adına aşağıdaki adımları yapmalıyız:

  • Cihazını USB portu ile laptop’a ya da PC’nize bağlamalıyız.
  • Settings > Developer ayarlarına gidelim ve USB Debugging (Hata Ayıklayıcı) özelliğini açalım.
  • Komut satırında “adb devices” yazalım ve cihazınız ID sini öğrenip, Desired Capabilities de bunu kullanalım.

Step-6: Appium ve TestNG Kullanarak Mobile Test Otomasyon Projesi 

Projenin test kodu aşağıdaki gibidir. Buradaki en kritik kısım DesiredCapabilities kısmı. Tüm ayarları buraya girmek gerekiyor. Geri kalan kısım Selenium ile kod yazmaya çok benziyor. Sadece mobile e özel element’ler, driver’lar vs. var. Projenin GitHub linki aşağıdaki gibidir. Bu proje başlangıç projesi olduğu için basit. Yaptığı işlemler; İşinOlsun uygulamasını açmak, Başlangıç ekranını atlamak, “İş Arıyorum”a tıklamak, çıkan işlerden ikincisini seçmek. Hepsi bu kadar basit çünkü bu ilk testimiz.

Project’s GitHub URL: https://github.com/swtestacademy/appium-sample-test

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.By;
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 ioSampleTest {

    public AppiumDriver<MobileElement> driver;
    public WebDriverWait wait;

    //Elements
    String secondNewJob = "//android.widget.FrameLayout[2]/android.widget.LinearLayout/" +
            "android.widget.RelativeLayout/android.widget.ImageView";

    @BeforeMethod
    public void setup () throws MalformedURLException {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("deviceName", "Galaxy Nexut API 24");
        caps.setCapability("udid", "WUJ01N4RQ3"); //DeviceId from "adb devices" command
        caps.setCapability("platformName", "Android");
        caps.setCapability("platformVersion", "7.0");
        caps.setCapability("skipUnlock","true");
        caps.setCapability("appPackage", "com.isinolsun.app");
        caps.setCapability("appActivity","com.isinolsun.app.activities.SplashActivity");
        caps.setCapability("noReset","false");
        driver = new AndroidDriver<MobileElement>(new URL("http://0.0.0.0:4723/wd/hub"),caps);
        wait = new WebDriverWait(driver, 10);
    }

    @Test
    public void basicTest () throws InterruptedException {
        //Click and pass Splash
        wait.until(ExpectedConditions.visibilityOfElementLocated
                (By.id("com.isinolsun.app:id/animation_view"))).click();

        //Click and pass Tutorial
        wait.until(ExpectedConditions.visibilityOfElementLocated
                (By.id("com.isinolsun.app:id/btn_skip"))).click();

        //Click to "Is Ariyorum" Button
        wait.until(ExpectedConditions.visibilityOfElementLocated
                (By.id("com.isinolsun.app:id/bluecollar_type_button"))).click();


        //Notification Allow
        if (driver.findElements(By.id("com.android.packageinstaller:id/permission_allow_button")).size()>0) {
            driver.findElements(By.id("com.android.packageinstaller:id/permission_allow_button")).get(0).click();
        }

        //Click second job
        wait.until(ExpectedConditions.visibilityOfElementLocated
                (By.xpath(secondNewJob))).click();

    }

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

}

Bu makalede anlatacaklarım bu kadar. Gerçekten hazırlaması da uzun sürdü. Eğer size faydası olduysa, makaleyi beğendiyseniz, ne mutlu. Herkese çok teşekkürler arkadaşlar. Biraz espirili bir dille makaleyi yazmaya çalıştım. Ancak makale dili konusunda bazı değerli eleştiriler aldığım için biraz daha espiri seviyesini azalttım. :) Normal hayatta özelikle ekibimle daha keyifli muhabbetlerimiz ve akıl dondurucu espirilerimiz oluyor. :) Hayatta bir çok şey ciddi bari burada biraz eğlenelim. Nede olsa bizim mekan. ;) Eğer bir yerde takıldıysanız yorum yazın. Ya ben ya da üstadlardan birisi size yardımcı olur. Sevgiler, saygılar…

Onur Baskirt