UI Automator, uygulamalar arası işlevsel kullanıcı arayüzüne uygun bir kullanıcı arayüzü testi çerçevesidir.
ve yüklü uygulamalarda test
yapabilirsiniz. UI Automator API'leri sayesinde etkileşimde bulunabilirsiniz.
Activity
nerede olursa olsun, cihazda görünür öğelerle
odaklanacak şekilde ayarlayabilirsiniz. Böylece, Ayarlar menüsünü açmak gibi
veya uygulama başlatıcıyı kullanabilirsiniz. Testiniz, aşağıdakileri yaparak bir kullanıcı arayüzü bileşeni arayabilir:
söz konusu bileşende görüntülenen metin veya bileşende görüntülenen metin gibi uygun tanımlayıcılar
içerik açıklaması.
UI Automator test çerçevesi, araç tabanlı bir API'dir ve
test aracı ile AndroidJUnitRunner
test edin. Yazmaya uygun
test kodunun dahili sisteme dayalı olmadığı opak kutu tarzı otomatik testler
hedef uygulamanın
uygulanma ayrıntılarına bakacağız.
UI Automator test çerçevesinin temel özellikleri şunlardır:
- Durum bilgilerini almak ve hedef üzerinde işlemler gerçekleştirmek için kullanılan bir API olanak tanır. Daha fazla bilgi edinmek için Cihaz durumuna erişme başlıklı makaleye bakın.
- Uygulamalar arası kullanıcı arayüzü testini destekleyen API'ler. Daha fazla bilgi için bkz. Kullanıcı Arayüzü Automator API'leri hakkında daha fazla bilgi edinin.
Cihaz durumuna erişiliyor
UI Automator test çerçevesi, test kullanıcılarına erişmek için bir UiDevice
sınıfı sağlar
ve hedef uygulamanın çalıştığı cihazda işlem gerçekleştirme. Şunları yapabilirsiniz:
yön veya mod gibi cihaz özelliklerine erişmek için
görüntü boyutu. UiDevice
sınıfı aşağıdaki işlemleri de gerçekleştirmenize olanak tanır:
işlemler:
- Cihazın yönünü değiştirin.
- "Sesi artırma" gibi donanım tuşlarına basın.
- Geri, Ana Sayfa veya Menü düğmelerine basın.
- Bildirim gölgesini açın.
- Geçerli pencerenin ekran görüntüsünü alın.
Örneğin, ana sayfa düğmesine basılmasını simüle etmek için UiDevice.pressHome()
işlevini çağırın.
yöntemidir.
UI Automator API'leri
UI Automator API'leri, bilmenize gerek kalmadan sağlam testler yazmanıza olanak tanır hedeflediğiniz uygulamanın uygulama ayrıntıları hakkında. Tekliflerinizi otomatikleştirmek ve optimize etmek için kullanıcı arayüzü bileşenlerini yakalamak ve değiştirmek için aşağıdaki API'leri kullanabilirsiniz:
UiObject2
: Cihazda görünür olan bir kullanıcı arayüzü öğesini temsil eder.BySelector
: Eşleşen kullanıcı arayüzü öğeleriyle ilgili ölçütleri belirtir.By
:BySelector
kısa ve öz bir şekilde oluşturulur.Configurator
: UI Automator testlerini çalıştırmak için temel parametreleri ayarlamanızı sağlar.
Örneğin, aşağıdaki kodda kullanılabilecek bir test komut dosyasını Cihazda bir Gmail uygulaması açtığında:
Kotlin
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.pressHome() val gmail: UiObject2 = device.findObject(By.text("Gmail")) // Perform a click and wait until the app is opened. val opened: Boolean = gmail.clickAndWait(Until.newWindow(), 3000) assertThat(opened).isTrue()
Java
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.pressHome(); UiObject2 gmail = device.findObject(By.text("Gmail")); // Perform a click and wait until the app is opened. Boolean opened = gmail.clickAndWait(Until.newWindow(), 3000); assertTrue(opened);
UI Automator'ı kurma
UI Automator ile kullanıcı arayüzü testinizi oluşturmadan önce testinizi yapılandırdığınızdan emin olun Projeyi kurma adımlarında açıklandığı gibi kaynak kodu konumu ve proje bağımlılıkları AndroidX Test için.
Android uygulama modülünüzün build.gradle
dosyasında bir bağımlılık ayarlamanız gerekir
kullanıcı arayüzü otomatikleştirme kitaplığına referans:
Kotlin
dependencies {
...
androidTestImplementation('androidx.test.uiautomator:uiautomator:2.3.0-alpha03')
}
Eski
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0-alpha03'
}
UI Automator testinizi optimize etmek için önce hedef uygulamanın Kullanıcı arayüzü bileşenlerini ve erişilebilir olduklarından emin olun. Bu optimizasyon ipuçları, açıklayacağım.
Bir cihazda kullanıcı arayüzünü inceleme
Testinizi tasarlamadan önce
olanak tanır. UI Automator testlerinizin bu bileşenlere erişebildiğinden emin olmak için
bu bileşenlerin görünür metin etiketlerine sahip olduğundan emin olun.
android:contentDescription
değerleri veya her ikisi.
uiautomatorviewer
aracı, kontrol etmek için kullanışlı bir görsel arayüz sağlar
düzen hiyerarşisini gösterme ve görünür olan kullanıcı arayüzü bileşenlerinin özelliklerini görüntüleme
ekranda görünür. Bu bilgiler, daha fazla
ayrıntılı testler yapabilirsiniz. Örneğin, kullanıcı arayüzü seçici,
belirli bir görünür özellikle eşleşen
uiautomatorviewer
aracını başlatmak için:
- Hedef uygulamayı fiziksel bir cihazda başlatın.
- Cihazı, geliştirme makinenize bağlayın.
- Bir terminal penceresi açıp
<android-sdk>/tools/
dizinine gidin. - Aracı şu komutla çalıştırın:
$ uiautomatorviewer
Uygulamanızın kullanıcı arayüzü özelliklerini görüntülemek için:
uiautomatorviewer
arayüzünde Cihaz Ekran Görüntüsü düğmesini tıklayın.- Kullanıcı arayüzü bileşenlerini görmek için fareyle sol paneldeki anlık görüntünün üzerine gelin
uiautomatorviewer
aracı tarafından tespit edilir. Tesisler daha düşük düzen hiyerarşisini görürsünüz. - İsterseniz kullanıcı arayüzü bileşenlerini görmek için NAF Düğümlerini Değiştir düğmesini tıklayabilirsiniz. erişilemeyen URL'ler oluşturun. Paydaşlarla sınırlı sayıda kullanılabilir.
Android tarafından sağlanan yaygın kullanıcı arayüzü bileşeni türleri hakkında bilgi edinmek için Kullanıcı Arayüz.
Etkinliğinizin erişilebilir olduğundan emin olma
UI Automator test çerçevesi, Virtual Verde için önerilen ve
Android'in erişilebilirlik özellikleri. View
türündeki kullanıcı arayüzü öğeleri kullandığınızda veya
SDK'daki bir View
alt sınıfını bulmak için, erişilebilirliği uygulamanız gerekmez.
destek ekibi ile iletişime geçin.
Ancak bazı uygulamalar, daha zengin bir kullanıcı deneyimi sağlamak için özel kullanıcı arayüzü öğeleri kullanır.
Bu tür öğeler otomatik erişilebilirlik desteği sağlamaz. Uygulamanız
SDK'dan gelmeyen bir View
alt sınıfının örneklerini içeriyorsa
şu adımları izleyerek bu öğelere erişilebilirlik özellikleri eklediğinizden emin olun:
şu adımları uygulayın:
- ExploreByTouchHelper kapsamını genişleten somut bir sınıf oluşturun.
- Yeni sınıfınızın bir örneğini belirli bir özel kullanıcı arayüzü öğesiyle ilişkilendirmek için setAccessibilityDelegate() çağrısı yapın.
Özel görünüme erişilebilirlik özellikleri ekleme hakkında daha fazla bilgi için öğeleri için Erişilebilir Özel Görünümler Oluşturma bölümüne bakın. Şu konu hakkında daha fazla bilgi edinmek için: Android'de erişilebilirlikle ilgili genel en iyi uygulamalar için Uygulamaları Daha Fazla Yapın Erişilebilir.
UI Automator test sınıfı oluşturma
UI Automator test sınıfınız, JUnit 4 testiyle aynı şekilde yazılmalıdır sınıfını kullanır. JUnit 4 test sınıfları oluşturma ve JUnit 4'ü kullanma hakkında daha fazla bilgi edinmek için Onaylar ve ek açıklamalar için Araçlı Ünite Test Sınıfı Oluşturma bölümüne bakın.
Testinizin başına @RunWith(AndroidJUnit4.class) ek açıklamasını ekleyin sınıf tanımıdır. Ayrıca, AndroidJUnitRunner sınıfını da belirtmeniz gerekir. sağlanmış olmasını sağlayabilirsiniz. Bu adımın açıklaması Bir cihazda veya emülatörde UI Otomasyonu testlerini çalıştırma konusunu daha ayrıntılı olarak inceleyebilirsiniz.
UI Automator test sınıfınızda aşağıdaki programlama modelini uygulayın:
- Şu numarayı arayarak test etmek istediğiniz cihaza erişmek için bir
UiDevice
nesnesi alın: getInstance() yöntemini kullanmalı ve buna bir Enstrümantasyon nesnesini argüman. - Şurada görüntülenen bir kullanıcı arayüzü bileşenine erişmek için bir
UiObject2
nesnesi alın (örneğin, ön plandaki mevcut görünüm) çağırarak findObject() yöntemini kullanın. - Söz konusu kullanıcı arayüzü bileşeninde performans göstermek üzere belirli bir kullanıcı etkileşimini simüle ederek
bir
UiObject2
yöntemini çağırma; örneğin scrollUntil(), bir metin alanını düzenlemek için setText(). 2. ve 3. adımlarda API'leri çağırabilirsiniz kullanıcı etkileşimleri içeren daha karmaşık kullanıcı etkileşimlerini kullanıcı arayüzü bileşenlerinin veya kullanıcı işlem dizilerinin sayısı. - Kullanıcı arayüzünün, bu kullanıcıdan sonra beklenen durumu veya davranışı yansıttığından emin olun dahil edilir.
Bu adımlar aşağıdaki bölümlerde daha ayrıntılı olarak ele alınmaktadır.
Kullanıcı arayüzü bileşenlerine erişme
UiDevice
nesnesi, içeriğe erişmenizin ve manipüle etmenin birincil yoludur.
cihazın durumunu kontrol edebilirsiniz. Testlerinizde UiDevice
yöntemlerini çağırarak
geçerli yön veya görüntü boyutu gibi çeşitli özelliklerin durumunu gösterir.
Testiniz, cihaz düzeyinde işlemler gerçekleştirmek için UiDevice
nesnesini kullanabilir.
Örneğin, cihazı belirli bir yöne döndürme, D-pad donanımına basma
tuşlarına basarak ve Ana Sayfa ve Menü düğmelerine basabilirsiniz.
Testinizi cihazın ana ekranından başlatmanız önerilir. Başlangıç fiyatı Ana ekran (veya cihazda seçtiğiniz başka bir başlangıç konumu) seçmek ve etkileşimde bulunmak için UI Automator API'nin sağladığı yöntemleri çağırabilirsiniz kullanıcı arayüzü öğeleri kullanın.
Aşağıdaki kod snippet'i, testinizin
UiDevice
ve Ana Sayfa düğmesine basmayı simüle edin:
Kotlin
import org.junit.Before import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.By import androidx.test.uiautomator.Until ... private const val BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample" private const val LAUNCH_TIMEOUT = 5000L private const val STRING_TO_BE_TYPED = "UiAutomator" @RunWith(AndroidJUnit4::class) @SdkSuppress(minSdkVersion = 18) class ChangeTextBehaviorTest2 { private lateinit var device: UiDevice @Before fun startMainActivityFromHomeScreen() { // Initialize UiDevice instance device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) // Start from the home screen device.pressHome() // Wait for launcher val launcherPackage: String = device.launcherPackageName assertThat(launcherPackage, notNullValue()) device.wait( Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT ) // Launch the app val context = ApplicationProvider.getApplicationContext<Context>() val intent = context.packageManager.getLaunchIntentForPackage( BASIC_SAMPLE_PACKAGE).apply { // Clear out any previous instances addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } context.startActivity(intent) // Wait for the app to appear device.wait( Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT ) } }
Java
import org.junit.Before; import androidx.test.runner.AndroidJUnit4; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.By; import androidx.test.uiautomator.Until; ... @RunWith(AndroidJUnit4.class) @SdkSuppress(minSdkVersion = 18) public class ChangeTextBehaviorTest { private static final String BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample"; private static final int LAUNCH_TIMEOUT = 5000; private static final String STRING_TO_BE_TYPED = "UiAutomator"; private UiDevice device; @Before public void startMainActivityFromHomeScreen() { // Initialize UiDevice instance device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Start from the home screen device.pressHome(); // Wait for launcher final String launcherPackage = device.getLauncherPackageName(); assertThat(launcherPackage, notNullValue()); device.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); // Launch the app Context context = ApplicationProvider.getApplicationContext(); final Intent intent = context.getPackageManager() .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE); // Clear out any previous instances intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent); // Wait for the app to appear device.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT); } }
Bu örnekte, @SdkSuppress(minSdkVersion = 18) ifadesi, testlerin yalnızca Android 4.3 (API düzeyi 18) veya sonraki sürümlere sahip cihazlarda çalıştırılacağı, gereken şekilde çalışmaya devam eder.
Aşağıdaki değeri temsil eden bir UiObject2
almak için findObject()
yöntemini kullanın:
Belirli bir seçici ölçütüyle eşleşen bir görünüm UiObject2
yeniden kullanılabilir
uygulama testinizin diğer bölümlerinde oluşturduğunuz örnekleri gerektiği gibi.
UI Automator test çerçevesinin mevcut ekranda bir
testiniz bir kullanıcı arayüzünü tıklamak için UiObject2
örneği kullandığı her seferde eşleştirilir
öğesine dokunun veya bir özelliği sorgulayın.
Aşağıdaki snippet, testinizin UiObject2
özelliğini nasıl oluşturabileceğini gösterir
bir uygulamada İptal ve Tamam düğmesini temsil eden örnekler.
Kotlin
val okButton: UiObject2 = device.findObject( By.text("OK").clazz("android.widget.Button") ) // Simulate a user-click on the OK button, if found. if (okButton != null) { okButton.click() }
Java
UiObject2 okButton = device.findObject( By.text("OK").clazz("android.widget.Button") ); // Simulate a user-click on the OK button, if found. if (okButton != null) { okButton.click(); }
Bir seçici belirtin
Bir uygulamada belirli bir kullanıcı arayüzü bileşenine erişmek isterseniz
BySelector
örneği oluşturmak için By
sınıfını kullanın. BySelector
.
görüntülenen kullanıcı arayüzündeki belirli öğelere ilişkin bir sorguyu temsil eder.
Birden fazla eşleşen öğe bulunursa
düzen hiyerarşisi, UiObject2
hedefi olarak döndürülür. Bir
BySelector
, tesislerinizi birbirine bağlayarak
arayın. Eşleşen bir kullanıcı arayüzü öğesi bulunamazsa bir null
döndürülür.
İç içe yerleştirmek için hasChild()
veya hasDescendant()
yöntemini kullanabilirsiniz
birden fazla BySelector
örneği. Örneğin, aşağıdaki kod örneği
testinizin, en çok aranan ilk ListView
olanı bulmak için bir aramayı
metin özelliğine sahip bir alt kullanıcı arayüzü öğesine sahiptir.
Kotlin
val listView: UiObject2 = device.findObject( By.clazz("android.widget.ListView") .hasChild( By.text("Apps") ) )
Java
UiObject2 listView = device.findObject( By.clazz("android.widget.ListView") .hasChild( By.text("Apps") ) );
Seçici ölçütlerinizde nesne durumunu belirtmeniz yararlı olabilir. Örneğin,
kontrol edilen tüm öğelerin bir listesini seçmek
bunların işaretini kaldırın. Bağımsız değişken "doğru" olarak ayarlanmış şekilde checked()
yöntemini çağırın.
İşlem gerçekleştirin
Testiniz bir UiObject2
nesnesi aldıktan sonra,
kullanıcı arayüzü bileşeninde kullanıcı etkileşimleri gerçekleştirmek için UiObject2
sınıfı
temsil eder. Bu tür işlemleri şu şekilde belirtebilirsiniz:
click()
: Kullanıcı arayüzü öğesinin görünür sınırlarının ortasını tıklar.drag()
: Bu nesneyi rastgele koordinatlara sürükler.setText()
: alanının içeriğini kontrol eder.clear()
yöntemi ise mevcut metni temizler. bir konuma geri yükleyebilirsiniz.swipe()
: Kaydırma işlemini belirtilen yöne doğru gerçekleştirir.scrollUntil()
: Kaydırma işlemini belirtilen yöne doğru gerçekleştirirCondition
veyaEventCondition
memnun kalana kadar.
UI Automator test çerçevesi, bir Amaç veya başlatma isteği göndermenize
bir Bağlam alarak, kabuk komutlarını kullanmadan bir Etkinlik
getContext()
aracılığıyla nesnel.
Aşağıdaki snippet, testinizin bir Intent kullanarak iyi bir fikir olabilir. Bu yaklaşım, yalnızca test etmek istediğiniz durumlarda yararlıdır. hesap makinesi uygulamasına girip başlatıcıyı umursamıyorsunuz.
Kotlin
fun setUp() { ... // Launch a simple calculator app val context = getInstrumentation().context val intent = context.packageManager.getLaunchIntentForPackage(CALC_PACKAGE).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } // Clear out any previous instances context.startActivity(intent) device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT) }
Java
public void setUp() { ... // Launch a simple calculator app Context context = getInstrumentation().getContext(); Intent intent = context.getPackageManager() .getLaunchIntentForPackage(CALC_PACKAGE); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear out any previous instances context.startActivity(intent); device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT); }
Sonuçları doğrulama
InstrumentationTestCase, TestCase'in kapsamını genişlettiği için uygulamadaki kullanıcı arayüzü bileşenlerinin döndürüldüğünü test etmek için standart JUnit Assert yöntemleri beklenen sonuçlar.
Aşağıdaki snippet, testinizin tek bir sayfada birkaç düğmeyi nasıl hesap makinesi uygulamasında bunları sırayla tıklayın ve doğru sonucun görüntülenir.
Kotlin
private const val CALC_PACKAGE = "com.myexample.calc" fun testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? device.findObject(By.res(CALC_PACKAGE, "two")).click() device.findObject(By.res(CALC_PACKAGE, "plus")).click() device.findObject(By.res(CALC_PACKAGE, "three")).click() device.findObject(By.res(CALC_PACKAGE, "equals")).click() // Verify the result = 5 val result: UiObject2 = device.findObject(By.res(CALC_PACKAGE, "result")) assertEquals("5", result.text) }
Java
private static final String CALC_PACKAGE = "com.myexample.calc"; public void testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? device.findObject(By.res(CALC_PACKAGE, "two")).click(); device.findObject(By.res(CALC_PACKAGE, "plus")).click(); device.findObject(By.res(CALC_PACKAGE, "three")).click(); device.findObject(By.res(CALC_PACKAGE, "equals")).click(); // Verify the result = 5 UiObject2 result = device.findObject(By.res(CALC_PACKAGE, "result")); assertEquals("5", result.getText()); }
Bir cihazda veya emülatörde UI Automator testlerini çalıştırma
UI Automator testlerini Android Studio'dan veya
komut satırından erişebilirsiniz. AndroidJUnitRunner
öğesini varsayılan olarak belirttiğinizden emin olun
enstrümantasyon aracını kullanabilirsiniz.
Diğer örnekler
Sistem kullanıcı arayüzüyle etkileşim kurma
UI Automator, sistem de dahil olmak üzere ekrandaki her şeyle etkileşimde bulunabilir. öğelerini uygulamanızın dışına çıkartın:
Kotlin
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.executeShellCommand("am start -a android.settings.SETTINGS")
Java
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.executeShellCommand("am start -a android.settings.SETTINGS");
Kotlin
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openNotification()
Java
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openNotification();
Kotlin
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openQuickSettings()
Java
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openQuickSettings();
Kotlin
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")) print(clock.getText())
Java
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")); print(clock.getText());
Geçişleri bekleme
Ekran geçişleri zaman alabilir ve sürelerini tahmin etmek güvenilir olmayabilir. Bu nedenle, işlemler gerçekleştirdikten sonra UI Automator'ı beklemelisiniz. Kullanıcı Arayüzü Otomatikleştirici Bunun için birden fazla yöntem sunar:
UiDevice.performActionAndWait(Runnable action, EventCondition<U> condition, long timeout)
: Örneğin, bir düğmeyi tıklayıp yeni pencere açılana kadar beklemek içindevice.performActionAndWait(() -> button.click(), Until.newWindow(), timeout)
numaralı telefonu arayınUiDevice.wait(Condition<Object, U> condition, long timeout)
: Örneğin, cihazda belirli birUiObject2
olana kadar beklemek içindevice.wait(device.hasObject(By.text("my_text")), timeout);
numaralı telefonu arayın.UiObject2.wait(@NonNull Condition<Object, U> condition, long timeout)
: Örneğin, bir onay kutusu işaretlenene kadar beklemek içincheckbox.wait(Until.checked(true), timeout);
yöntemini çağırınUiObject2.clickAndWait(@NonNull EventCondition<U> condition, long timeout)
: Örneğin, bir düğmeyi tıklayıp yeni pencere açılana kadar beklemek içinbutton.clickAndWait(Until.newWindow(), timeout);
yöntemini çağırınUiObject2.scrollUntil(@NonNull Direction direction, @NonNull Condition<Object, U> condition)
: Örneğin, yeni bir nesne görünene kadar sayfayı aşağı kaydırmak içinobject.scrollUntil(Direction.DOWN, Until.hasObject(By.text('new_obj')));
işlevini çağırın.UiObject2.scrollUntil(@NonNull Direction direction, @NonNull EventCondition<U> condition)
: Örneğin sayfayı en alta kaydırmak içinobject.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN));
numaralı telefonu arayın.
Aşağıdaki kod snippet'i, Do Not'u kapatmak için Kullanıcı Arayüzü Otomatikleştirici'nin nasıl kullanılacağını göstermektedir
Sistem ayarlarında, performActionAndWait()
yöntemini kullanarak Rahatsız Etmeyin modu
beklemeye devam ediyor:
Kotlin
@Test @SdkSuppress(minSdkVersion = 21) @Throws(Exception::class) fun turnOffDoNotDisturb() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.performActionAndWait({ try { device.executeShellCommand("am start -a android.settings.SETTINGS") } catch (e: IOException) { throw RuntimeException(e) } }, Until.newWindow(), 1000) // Check system settings has been opened. Assert.assertTrue(device.hasObject(By.pkg("com.android.settings"))) // Scroll the settings to the top and find Notifications button var scrollableObj: UiObject2 = device.findObject(By.scrollable(true)) scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)) val notificationsButton = scrollableObj.findObject(By.text("Notifications")) // Click the Notifications button and wait until a new window is opened. device.performActionAndWait({ notificationsButton.click() }, Until.newWindow(), 1000) scrollableObj = device.findObject(By.scrollable(true)) // Scroll down until it finds a Do Not Disturb button. val doNotDisturb = scrollableObj.scrollUntil( Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb")) ) device.performActionAndWait({ doNotDisturb.click() }, Until.newWindow(), 1000) // Turn off the Do Not Disturb. val turnOnDoNotDisturb = device.findObject(By.text("Turn on now")) turnOnDoNotDisturb?.click() Assert.assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)) }
Java
@Test @SdkSuppress(minSdkVersion = 21) public void turnOffDoNotDisturb() throws Exception{ device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.performActionAndWait(() -> { try { device.executeShellCommand("am start -a android.settings.SETTINGS"); } catch (IOException e) { throw new RuntimeException(e); } }, Until.newWindow(), 1000); // Check system settings has been opened. assertTrue(device.hasObject(By.pkg("com.android.settings"))); // Scroll the settings to the top and find Notifications button UiObject2 scrollableObj = device.findObject(By.scrollable(true)); scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)); UiObject2 notificationsButton = scrollableObj.findObject(By.text("Notifications")); // Click the Notifications button and wait until a new window is opened. device.performActionAndWait(() -> notificationsButton.click(), Until.newWindow(), 1000); scrollableObj = device.findObject(By.scrollable(true)); // Scroll down until it finds a Do Not Disturb button. UiObject2 doNotDisturb = scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb"))); device.performActionAndWait(()-> doNotDisturb.click(), Until.newWindow(), 1000); // Turn off the Do Not Disturb. UiObject2 turnOnDoNotDisturb = device.findObject(By.text("Turn on now")); if(turnOnDoNotDisturb != null) { turnOnDoNotDisturb.click(); } assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)); }
Ek kaynaklar
Android testlerinde UI Automator'ı kullanma hakkında daha fazla bilgi için şu sayfaya bakın: inceleyebilirsiniz.
Referans belgeleri:
Örnekler
- BasicSample: Temel Kullanıcı Arayüzü Automator örneği.