안녕, 에스프레소! 레시피 1 인접한 요소 찾기 🎭


Pro Android Dev의 Espresso 로고 이미지

학습 결과



이 게시물에서는 인접한 요소 속성 및 hasSibling 매처를 사용하여 요소를 찾는 방법을 이해합니다.

개요



에스프레소 시리즈의 마지막 부분에서 에스프레소로 웹 보기를 자동화하는 방법을 이해했습니다. 혹시라도 놓치셨다면 꼭 읽어보시기 바랍니다.

지금쯤이면 에스프레소로 Android UI 테스트를 자동화하는 방법에 대한 확실한 아이디어가 있어야 하며 핵심 API에 어느 정도 익숙해야 합니다.

다음 몇 개의 게시물에서는 Android 앱 또는 레시피에서 일반적인 시나리오를 수행하는 방법을 살펴보겠습니다.

갑시다.

형제가 있는 요소를 찾는 방법



대부분의 최신 모바일 앱은 재사용 가능한 구성 요소가 포함된 모듈식 방식으로 설계되며 동일한 구성 요소가 컨트롤과 같은 목록에 복제됩니다.

경우에 따라 유사한 ID 요소가 여러 개 있을 수 있으며 R.id.x를 사용하여 요소를 찾는 것은 검색하려는 특정 요소를 에스프레소가 알지 못하기 때문에 작동하지 않습니다.

이러한 경우 인접(또는 형제) 요소의 고유 속성을 사용하여 요소를 찾을 수 있습니다.

이것이 실제로 어떻게 작동하는지 이해하기 위해 예를 살펴보겠습니다.

테스트 중인 앱 이해



이 테스트에서는 인기 있는 APIDemos app 프로젝트(자체는 Google 저장소에서 포크됨)에서 포크된 Appium을 사용합니다.

이 앱은 많은 Android 구성 요소를 예로 보여주므로 꽤 괜찮은 놀이터 앱입니다.

아래 시나리오를 자동화하고 싶다고 가정해 보겠습니다.

GIVEN user opens Task list activity
WHEN user taps on checkbox with id `@id/tasklist_finished` for "Conquer world" item in checklist
THEN checkbox is enabled





NOTE: If you are manually exploring the app using Android emulator within android studio you can arrive at this screen by tapping on Accessibility > Accessibility Node Querying



이 확인란의 고유 ID를 검사하려고 하면 @android:id/list 내에 이러한 확인란이 여러 개 있고 해당 속성을 사용할 수 없음을 알 수 있습니다.



그러나 각 확인란에는 고유한 텍스트가 있는 컨트롤TextView이 있으며 이 속성을 사용하여 요소를 식별할 수 있습니다.

테스트를 작성해 봅시다



다음을 사용하여 활동을 시작합니다.

@Rule
    public ActivityScenarioRule<TaskListActivity> activityScenarioRule =
            new ActivityScenarioRule<>(TaskListActivity.class);



형제 요소가 고유한 텍스트를 가지고 있다는 속성을 사용하여 원하는 요소를 찾아봅시다.

String taskText = "Conquer World";
onView(allOf(withId(R.id.tasklist_finished), hasSibling(withText(taskText))))



우리는 다음과 같이 말하면서 시작합니다.
  • 조건을 allOf로 래핑하여 모든 속성과 일치하는 보기를 찾고 싶습니다.
  • 다음으로 id가 withId(R.id.tasklist_finished)인 요소(즉, 체크박스)를 찾고 싶다고 말합니다
  • .
  • 하지만 hasSibling(withText(taskText)) 보기 매처
  • 를 사용하는 hasSibling를 지정하여 특정 텍스트가 있는 형제가 있는 요소만 원합니다.

    마지막으로 요소를 찾으면 요소를 클릭하고 다음을 지정하여 상태가 checked로 변경되는지 확인합니다.

    .perform(click())
    .check(matches(isChecked()));
    
    


    다음은 전체 테스트입니다.

    package recipes;
    
    import static androidx.test.espresso.Espresso.onView;
    import static androidx.test.espresso.action.ViewActions.click;
    import static androidx.test.espresso.assertion.ViewAssertions.matches;
    import static androidx.test.espresso.matcher.ViewMatchers.hasSibling;
    import static androidx.test.espresso.matcher.ViewMatchers.isChecked;
    import static androidx.test.espresso.matcher.ViewMatchers.withId;
    import static androidx.test.espresso.matcher.ViewMatchers.withText;
    import static org.hamcrest.Matchers.allOf;
    
    import androidx.test.ext.junit.rules.ActivityScenarioRule;
    import androidx.test.runner.AndroidJUnit4;
    
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    
    import io.appium.android.apis.R;
    import io.appium.android.apis.accessibility.TaskListActivity;
    
    @RunWith(AndroidJUnit4.class)
    public class FindElementUsingHasSiblingE2ETest {
        @Rule
        public ActivityScenarioRule<TaskListActivity> activityScenarioRule =
                new ActivityScenarioRule<>(TaskListActivity.class);
    
        @Test
        public void testCanFindElementUsingSiblingMatcher() {
            String taskText = "Conquer World";
            // Find checkbox with id tasklist_finished that has sibling label with text Conquer World
            onView(allOf(withId(R.id.tasklist_finished), hasSibling(withText(taskText))))
                    // Click on the checkbox
                    .perform(click())
                    // Verify the checkbox was ticked
                    .check(matches(isChecked()));
        }
    }
    
    


    리소스 📘


  • App code
  • Test code
  • 읽기 Espresso recipes

  • 가기 전에



    시간을 내어 이 게시물을 읽어주셔서 감사합니다. 🙏

    💡 이 정보가 유익하거나 도움이 된다면 👍🏼 잠시 시간을 내어 친구, 동료 또는 소셜 미디어 계정에 공유해 주세요. 모든 공유는 이것이 성장하는 데 도움이 되고 "나눔은 배려입니다"🫂 그렇지 않나요?

    가기 전에 🙌🏼. 알고 계셨나요?
  • 뉴스레터 ✉️를 게시합니다. 👉newsletter.automationhacks.io를 구독하여 이메일 받은 편지함
  • 에서 받아보세요.
  • 그리고 최근에 유튜브 채널📺을 시작했는데, 👉구독을 하셔서 새로운 영상이 나올 때 놓치지 마세요.

  • 저는 이 두 플랫폼 모두에서 테스트 자동화 및 소프트웨어 테스팅에 대해 자세히 알아보고 구독이 학습 여정에 가치가 있다는 것을 알게 될 것입니다.

    질문 🤔 또는 피드백 😉이 있으십니까?

    댓글로 알려주시거나(모두 읽어보겠다고 약속합니다 ✌🏼) Twitter나 LinkedIn에서 @automationhacks로 저를 핑할 수 있습니다.

    다음 시간까지 즐거운 테스트 🕵🏻와 학습! 🌱

    좋은 웹페이지 즐겨찾기