āĻāĻŽā§āĻĒā§āĻ āϏāĻžāϧāĻžāϰāĻŖ āĻĒāϰā§āĻā§āώāĻžāϰ āĻāĻžāĻ āĻžāĻŽā§āϰ āϏāĻžāĻĨā§ āĻāĻā§āĻā§āϤ āĻšāϝāĻŧāĨ¤
āĻāϏāĻĒā§āϰā§āϏā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ āĻĒāĻžāϰā§āĻŦāĻŋāϞāĻŋāĻāĻŋ
āĻāĻāĻāĻŋ āĻšāĻžāĻāĻŦā§āϰāĻŋāĻĄ āĻ
ā§āϝāĻžāĻĒā§, āĻāĻĒāύāĻŋ āĻāĻŽā§āĻĒā§āĻ āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞ ( AndroidView
āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§) āĻāĻŋāĻ āĻšāĻžāϝāĻŧāĻžāϰāĻžāϰā§āĻāĻŋāϰ āĻāĻŋāϤāϰ⧠āĻāĻŽā§āĻĒā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻŦāĻ āĻāĻŽā§āĻĒā§āĻ āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞā§āϰ āĻāĻŋāĻ āĻā§āĻāĻā§ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻāϝāĻŧ āĻĒā§āϰāĻāĻžāϰā§āϰ āϏāĻžāĻĨā§ āĻŽāĻŋāϞ āĻāϰāĻžāϰ āĻāύā§āϝ āĻā§āύ āĻŦāĻŋāĻļā§āώ āĻĒāĻĻāĻā§āώā§āĻĒā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻāĨ¤ āĻāĻĒāύāĻŋ Espresso āĻāϰ onView
āϏāĻžāĻĨā§ āĻāĻŋāĻ āĻāĻŦāĻ ComposeTestRule
āϏāĻžāĻĨā§ āĻāĻŽā§āĻĒā§āĻ āĻāϞāĻŋāĻŽā§āύā§āĻā§āϰ āϏāĻžāĻĨā§ āĻŽāĻŋāϞ āϰāĻžāĻā§āύāĨ¤
@Test
fun androidViewInteropTest() {
// Check the initial state of a TextView that depends on a Compose state.
Espresso.onView(withText("Hello Views")).check(matches(isDisplayed()))
// Click on the Compose button that changes the state.
composeTestRule.onNodeWithText("Click here").performClick()
// Check the new value.
Espresso.onView(withText("Hello Compose")).check(matches(isDisplayed()))
}
UiAutomator āĻāϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ āĻĒāĻžāϰā§āĻŦāĻŋāϞāĻŋāĻāĻŋ
āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§, āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞāĻā§āϞāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϤāĻžāĻĻā§āϰ āϏā§āĻŦāĻŋāϧāĻžāĻāύāĻ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠(āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻĒāĻžāĻ ā§āϝ, āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āϰ āĻŦāĻŋāĻŦāϰāĻŖ āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻĻā§āĻŦāĻžāϰāĻž UiAutomator āĻĨā§āĻā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝāĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ Modifier.testTag
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāύ āĻā§āύ⧠āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻžāĻā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞā§āϰ āϏāĻžāĻŦāĻā§āϰāĻŋāϰ āĻāύā§āϝ āĻļāĻŦā§āĻĻāĻžāϰā§āĻĨāĻŋāĻ āϏāĻŽā§āĻĒāϤā§āϤāĻŋ testTagsAsResourceId
āϏāĻā§āώāĻŽ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻ āĻāĻāϰāĻŖāĻāĻŋ āϏāĻā§āώāĻŽ āĻāϰāĻž āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻĻāϰāĻāĻžāϰ⧠āϝā§āĻā§āϞāĻŋāϰ āĻ
āύā§āϝ āĻā§āύāĻ āĻ
āύāύā§āϝ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āύā§āĻ, āϝā§āĻŽāύ āϏā§āĻā§āϰā§āϞāϝā§āĻā§āϝ āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞ (āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, LazyColumn
)āĨ¤
Modifier.testTag
āϏāĻžāĻĨā§ āϏāĻŽāϏā§āϤ āύā§āϏā§āĻā§āĻĄ āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞ UiAutomator āĻĨā§āĻā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝ āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āĻāĻŽā§āĻĒā§āĻā§āĻŦāϞ āĻ
āύā§āĻā§āϰāĻŽā§āϰ āĻāĻā§āĻāϤāĻžāϝāĻŧ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŦāĻžāϰ āĻļāĻŦā§āĻĻāĻžāϰā§āĻĨāĻŋāĻ āϏāĻŽā§āĻĒāϤā§āϤāĻŋ āϏāĻā§āώāĻŽ āĻāϰā§āύāĨ¤
Scaffold(
// Enables for all composables in the hierarchy.
modifier = Modifier.semantics {
testTagsAsResourceId = true
}
){
// Modifier.testTag is accessible from UiAutomator for composables nested here.
LazyColumn(
modifier = Modifier.testTag("myLazyColumn")
){
// Content
}
}
Modifier.testTag(tag)
āϏāĻžāĻĨā§ āϝā§āĻā§āύāĻ āĻāĻŽā§āĻĒā§āĻ āĻāϰāĻž āϝāĻžāĻŦā§ resourceName
āĻŽāϤ⧠āĻāĻāĻ tag
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠By.res(resourceName)
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ
ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝāĨ¤
val device = UiDevice.getInstance(getInstrumentation())
val lazyColumn: UiObject2 = device.findObject(By.res("myLazyColumn"))
// Some interaction with the lazyColumn.
āĻ āϤāĻŋāϰāĻŋāĻā§āϤ āϏāĻŽā§āĻĒāĻĻ
- āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄā§ āĻ ā§āϝāĻžāĻĒ āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύ : āĻĒā§āϰāϧāĻžāύ āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āĻā§āϏā§āĻāĻŋāĻ āϞā§āϝāĻžāύā§āĻĄāĻŋāĻ āĻĒā§āώā§āĻ āĻžāĻāĻŋ āĻĒāϰā§āĻā§āώāĻžāϰ āĻŽā§āϞāĻŋāĻ āĻŦāĻŋāώāϝāĻŧ āĻāĻŦāĻ āĻā§āĻļāϞāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āĻŦāĻŋāϏā§āϤā§āϤ āĻĻā§āĻļā§āϝ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤
- āĻĒāϰā§āĻā§āώāĻžāϰ āĻŽā§āϞāĻŋāĻ āĻŦāĻŋāώāϝāĻŧāĻā§āϞāĻŋ : āĻāĻāĻāĻŋ Android āĻ ā§āϝāĻžāĻĒ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻĒāĻŋāĻāύ⧠āĻŽā§āϞ āϧāĻžāϰāĻŖāĻžāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύā§āύāĨ¤
- āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻĒāϰā§āĻā§āώāĻž : āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āύāĻŋāĻāϏā§āĻŦ āĻāϝāĻŧāĻžāϰā§āĻāϏā§āĻā§āĻļāύ⧠āϏā§āĻĨāĻžāύā§āϝāĻŧāĻāĻžāĻŦā§ āĻāĻŋāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
- āĻāύā§āϏāĻā§āϰā§āĻŽā§āύā§āĻā§āĻĄ āĻĒāϰā§āĻā§āώāĻž : āϝāύā§āϤā§āϰāϝā§āĻā§āϤ āĻĒāϰā§āĻā§āώāĻž āĻāĻžāϞāĻžāύā§āĻ āĻāĻžāϞ⧠āĻ āĻā§āϝāĻžāϏāĨ¤ āĻ āϰā§āĻĨāĻžā§, āϝ⧠āĻĒāϰā§āĻā§āώāĻžāĻā§āϞāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻŋāĻāĻžāĻāϏ⧠āĻāϞā§āĨ¤
- āĻā§āϰāĻŽāĻžāĻāϤ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ : āĻā§āϰāĻŽāĻžāĻāϤ āĻāύā§āĻāĻŋāĻā§āϰā§āĻļāύ āĻāĻĒāύāĻžāĻā§ āĻāĻĒāύāĻžāϰ āĻĒāϰā§āĻā§āώāĻžāĻā§āϞāĻŋāĻā§ āĻāĻĒāύāĻžāϰ āϏā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒāĻžāĻāĻĒāϞāĻžāĻāύ⧠āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤
- āĻŦāĻŋāĻāĻŋāύā§āύ āϏā§āĻā§āϰā§āύā§āϰ āĻŽāĻžāĻĒ āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύ : āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāύā§āϝ āĻāĻĒāϞāĻŦā§āϧ āĻāĻŋāĻā§ āĻ āύā§āĻ āĻĄāĻŋāĻāĻžāĻāϏā§āϰ āϏāĻžāĻĨā§, āĻāĻĒāύāĻžāϰ āĻŦāĻŋāĻāĻŋāύā§āύ āϏā§āĻā§āϰā§āύ āĻŽāĻžāĻĒā§āϰ āĻāύā§āϝ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
- āĻāϏāĻĒā§āϰā§āϏ⧠: āĻāĻŋāĻ-āĻāĻŋāϤā§āϤāĻŋāĻ UI-āĻāϰ āĻāĻĻā§āĻĻā§āĻļā§āϝā§, Espresso āĻā§āĻāĻžāύ āĻāĻāύāĻ āϰāĻāύāĻž āĻĒāϰā§āĻā§āώāĻžāϰ āĻāĻŋāĻā§ āĻĻāĻŋāĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϏāĻšāĻžāϝāĻŧāĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤