กรอบการทดสอบ Espresso - ดู Matchers

กรอบเอสเปรสโซให้ผู้จับคู่มุมมองมากมาย จุดประสงค์ของตัวจับคู่คือการจับคู่ข้อมูลพร็อพเพอร์ตี้โดยใช้แอตทริบิวต์ที่แตกต่างกันของมุมมองเช่น Id, Text และความพร้อมใช้งานของมุมมองย่อย ตัวจับคู่แต่ละตัวจะจับคู่คุณลักษณะเฉพาะของมุมมองและใช้กับมุมมองประเภทใดประเภทหนึ่ง ตัวอย่างเช่นwithId matcher จะจับคู่คุณสมบัติIdของมุมมองและใช้กับมุมมองทั้งหมดในขณะที่ withText matcher จะจับคู่คุณสมบัติTextของมุมมองและใช้กับTextViewเท่านั้น

ในบทนี้ให้เราเรียนรู้ที่แตกต่างกัน matchers ที่มีให้โดยกรอบการทดสอบเอสเพรสโซเช่นเดียวกับการเรียนรู้Hamcrestห้องสมุดตามที่ matchers เอสเพรสโซที่ถูกสร้างขึ้น

ห้องสมุด Hamcrest

ห้องสมุดHamcrestเป็นห้องสมุดที่สำคัญในขอบเขตของกรอบการทดสอบเอสเปรสโซ Hamcrestเป็นกรอบสำหรับการเขียนวัตถุที่ตรงกัน เฟรมเวิร์ก Espresso ใช้ไลบรารีHamcrestอย่างกว้างขวางและขยายเมื่อจำเป็นเพื่อจัดหาตัวจับคู่ที่เรียบง่ายและขยายได้

Hamcrestมีฟังก์ชันassertThat ที่เรียบง่ายและชุดของ matchers เพื่อยืนยันวัตถุใด ๆ assertThatมีสามอาร์กิวเมนต์และมีดังที่แสดงด้านล่าง -

  • สตริง (คำอธิบายของการทดสอบหรือไม่บังคับ)

  • วัตถุ (จริง)

  • Matcher (คาดว่า)

ให้เราเขียนตัวอย่างง่ายๆเพื่อทดสอบว่าวัตถุรายการมีค่าที่คาดหวังหรือไม่

import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.MatcherAssert.assertThat;
@Test
public void list_hasValue() {
   ArrayList<String> list = new ArrayList<String>();
   list.add("John");
   assertThat("Is list has John?", list, hasItem("John"));
}

ที่นี่hasItemส่งคืนตัวจับคู่ซึ่งตรวจสอบว่ารายการจริงได้ระบุค่าเป็นหนึ่งในรายการหรือไม่

Hamcrestมีตัวจับคู่ในตัวจำนวนมากและยังมีตัวเลือกในการสร้างตัวจับคู่ใหม่ ตัวจับคู่ในตัวที่สำคัญบางตัวที่มีประโยชน์ในกรอบการทดสอบเอสเปรสโซมีดังนี้ -

อะไรก็ได้ - เสมอกัน

ตัวจับคู่ตามตรรกะ

  • allOf - ยอมรับผู้จับคู่และการแข่งขันจำนวนเท่าใดก็ได้เฉพาะเมื่อผู้จับคู่ทั้งหมดประสบความสำเร็จ

  • anyOf - ยอมรับจำนวนผู้จับคู่และการแข่งขันหากผู้จับคู่คนใดคนหนึ่งทำสำเร็จ

  • not - ยอมรับตัวจับคู่หนึ่งคนและจับคู่เฉพาะในกรณีที่ตัวจับคู่ล้มเหลวและในทางกลับกัน

ตัวจับคู่ตามข้อความ

  • equalToIgnoringCase - ใช้เพื่อทดสอบว่าอินพุตจริงเท่ากับสตริงที่คาดไว้ที่ละเว้นตัวพิมพ์หรือไม่

  • equalToIgnoringWhiteSpace - ใช้เพื่อทดสอบว่าอินพุตจริงเท่ากับสตริงที่ระบุโดยไม่สนใจกรณีและช่องว่างสีขาว

  • containsString - ใช้เพื่อทดสอบว่าอินพุตจริงมีสตริงที่ระบุหรือไม่

  • endsWith - ใช้เพื่อทดสอบว่าอินพุตจริงเริ่มต้นด้วยสตริงที่ระบุหรือไม่

  • startsWith - ใช้เพื่อทดสอบว่าอินพุตจริงลงท้ายด้วยสตริงที่ระบุหรือไม่

ตัวจับคู่ตามจำนวน

  • closeTo - ใช้เพื่อทดสอบว่าอินพุตจริงใกล้เคียงกับตัวเลขที่คาดไว้หรือไม่

  • greaterThan - ใช้เพื่อทดสอบว่าอินพุตจริงมากกว่าตัวเลขที่คาดไว้หรือไม่

  • greaterThanOrEqualTo - ใช้เพื่อทดสอบว่าอินพุตจริงมากกว่าหรือเท่ากับตัวเลขที่คาดไว้หรือไม่

  • lessThan - ใช้เพื่อทดสอบว่าอินพุตจริงน้อยกว่าตัวเลขที่คาดไว้หรือไม่

  • lessThanOrEqualTo - ใช้เพื่อทดสอบว่าอินพุตจริงน้อยกว่าหรือเท่ากับจำนวนที่คาดไว้หรือไม่

ตัวจับคู่ตามวัตถุ

  • equalTo - ใช้เพื่อทดสอบว่าอินพุตจริงเท่ากับวัตถุที่คาดไว้หรือไม่

  • hasToString - ใช้เพื่อทดสอบว่าอินพุตจริงมีวิธี toString หรือไม่

  • instanceOf - ใช้เพื่อทดสอบว่าอินพุตจริงเป็นอินสแตนซ์ของคลาสที่คาดหวังหรือไม่

  • isCompatibleType - ใช้เพื่อทดสอบว่าอินพุตจริงเข้ากันได้กับประเภทที่คาดไว้หรือไม่

  • notNullValue - ใช้เพื่อทดสอบว่าอินพุตจริงไม่เป็นโมฆะหรือไม่

  • sameInstance - ใช้เพื่อทดสอบว่าอินพุตจริงและที่คาดหวังเป็นอินสแตนซ์เดียวกันหรือไม่

  • hasProperty - ใช้เพื่อทดสอบว่าอินพุตจริงมีคุณสมบัติตามที่คาดหวังหรือไม่

คือ - น้ำตาลหรือทางลัดสำหรับequalTo

คู่หู

Espresso มีวิธี onView () เพื่อจับคู่และค้นหามุมมอง ยอมรับการจับคู่มุมมองและส่งคืนวัตถุ ViewInteraction เพื่อโต้ตอบกับมุมมองที่ตรงกัน รายการตัวจับคู่การดูที่ใช้บ่อยอธิบายไว้ด้านล่าง -

withId ()

withId ()ยอมรับอาร์กิวเมนต์ประเภท int และอาร์กิวเมนต์อ้างถึง id ของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้รหัสของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(withId(R.id.testView))

withText ()

withText ()ยอมรับอาร์กิวเมนต์ของสตริงชนิดและอาร์กิวเมนต์อ้างถึงค่าของคุณสมบัติข้อความของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้ค่าข้อความของมุมมอง ใช้กับTextViewเท่านั้น โค้ดตัวอย่างมีดังนี้

onView(withText("Hello World!"))

withContentDescription ()

withContentDescription ()ยอมรับอาร์กิวเมนต์ของสตริงชนิดและอาร์กิวเมนต์อ้างถึงค่าของคุณสมบัติคำอธิบายเนื้อหาของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้คำอธิบายของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(withContentDescription("blah"))

นอกจากนี้เรายังสามารถส่งรหัสทรัพยากรของค่าข้อความแทนข้อความได้

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription ()

hasContentDescription ()ไม่มีอาร์กิวเมนต์ ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มีคำอธิบายเนื้อหาใด ๆ โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), hasContentDescription()))

withTagKey ()

withTagKey ()ยอมรับอาร์กิวเมนต์ของสตริงชนิดและอาร์กิวเมนต์อ้างถึงคีย์แท็กของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้คีย์แท็ก โค้ดตัวอย่างมีดังนี้

onView(withTagKey("blah"))

นอกจากนี้เรายังสามารถส่งรหัสทรัพยากรของชื่อแท็กแทนชื่อแท็กได้

onView(withTagKey(R.id.res_id_blah))

withTagValue ()

withTagValue ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <Object> และอาร์กิวเมนต์อ้างถึงค่าแท็กของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้ค่าแท็ก โค้ดตัวอย่างมีดังนี้

onView(withTagValue(is((Object) "blah")))

นี่คือเป็น Hamcrest จับคู่

withClassName ()

withClassName ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <String> และอาร์กิวเมนต์อ้างถึงค่าชื่อคลาสของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้ชื่อคลาส โค้ดตัวอย่างมีดังนี้

onView(withClassName(endsWith("EditText")))

ที่นี่endWithคือ Hamcrest matcher และส่งคืน Matcher <String>

ด้วยคำแนะนำ ()

withHint ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <String> และอาร์กิวเมนต์อ้างถึงค่าคำใบ้ของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้คำใบ้ของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(withClassName(endsWith("Enter name")))

withInputType ()

withInputType ()ยอมรับอาร์กิวเมนต์ประเภทintและอาร์กิวเมนต์หมายถึงประเภทอินพุตของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้ประเภทอินพุต โค้ดตัวอย่างมีดังนี้

onView(withInputType(TYPE_CLASS_DATETIME))

ในที่นี้TYPE_CLASS_DATETIMEหมายถึงมุมมองการแก้ไขที่รองรับวันที่และเวลา

withResourceName ()

withResourceName ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <String> และอาร์กิวเมนต์อ้างถึงค่าชื่อคลาสของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้ชื่อทรัพยากรของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(withResourceName(endsWith("res_name")))

ยอมรับสตริงอาร์กิวเมนต์เช่นกัน โค้ดตัวอย่างมีดังนี้

onView(withResourceName("my_res_name"))

withAlpha ()

withAlpha ()ยอมรับอาร์กิวเมนต์ประเภทfloatและอาร์กิวเมนต์อ้างถึงค่าอัลฟาของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้ค่าอัลฟาของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(withAlpha(0.8))

withEffectiveVisibility ()

withEffectiveVisibility ()ยอมรับอาร์กิวเมนต์ประเภทViewMatchersการมองเห็นและอาร์กิวเมนต์หมายถึงการมองเห็นที่มีประสิทธิภาพของมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้การเปิดเผยของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

กับSpinnerText ()

withSpinnerText ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <String> และอาร์กิวเมนต์อ้างถึงค่าของมุมมองที่เลือกในปัจจุบันของ Spinner ส่งคืนตัวจับคู่ซึ่งตรงกับตัวหมุนตามค่า toString ของรายการที่เลือก โค้ดตัวอย่างมีดังนี้

onView(withSpinnerText(endsWith("USA")))

ยอมรับอาร์กิวเมนต์สตริงหรือรหัสทรัพยากรของสตริงด้วย โค้ดตัวอย่างมีดังนี้

onView(withResourceName("USA"))
onView(withResourceName(R.string.res_usa))

withSubstring ()

withSubString ()คล้ายกับwithText ()ยกเว้นจะช่วยในการทดสอบสตริงย่อยของค่าข้อความของมุมมอง

onView(withSubString("Hello"))

hasLinks ()

hasLinks ()ไม่มีอาร์กิวเมนต์และส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มีลิงก์ ใช้กับ TextView เท่านั้น โค้ดตัวอย่างมีดังนี้

onView(allOf(withSubString("Hello"), hasLinks()))

ที่นี่allOfคือตัวจับคู่ Hamcrest allOfส่งคืนตัวจับคู่ซึ่งตรงกับค่าที่ส่งผ่านทั้งหมดในตัวจับคู่และที่นี่จะใช้เพื่อจับคู่มุมมองรวมทั้งตรวจสอบว่ามุมมองมีลิงก์ในค่าข้อความหรือไม่

hasTextColor ()

hasTextColor ()ยอมรับอาร์กิวเมนต์เดียวประเภท int และอาร์กิวเมนต์อ้างถึงรหัสทรัพยากรของสี จะส่งคืนตัวจับคู่ซึ่งตรงกับTextViewตามสีของมัน ใช้กับTextViewเท่านั้น โค้ดตัวอย่างมีดังนี้

onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))

hasEllipsizedText ()

hasEllipsizedText ()ไม่มีอาร์กิวเมนต์ จะส่งคืนตัวจับคู่ซึ่งตรงกับ TextView ที่มีข้อความยาวและเป็นจุดไข่ปลา (ตัวแรก .. สิบ .. ตัวสุดท้าย) หรือตัดออก (ตัวแรก…) โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_text_view_id), hasEllipsizedText()))

hasMultilineText ()

hasMultilineText ()ไม่มีอาร์กิวเมนต์ ส่งคืนตัวจับคู่ซึ่งตรงกับ TextView ที่มีข้อความหลายบรรทัด โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_test_view_id), hasMultilineText()))

hasBackground ()

hasBackground ()ยอมรับอาร์กิวเมนต์เดียวประเภท int และอาร์กิวเมนต์อ้างถึงรหัสทรัพยากรของทรัพยากรพื้นหลัง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองตามทรัพยากรพื้นหลัง โค้ดตัวอย่างมีดังนี้

onView(allOf(withId("image"), hasBackground(R.drawable.your_drawable)))

hasErrorText ()

hasErrorText ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <String> และอาร์กิวเมนต์อ้างถึงค่าสตริงข้อผิดพลาดของมุมมอง (EditText) ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้สตริงข้อผิดพลาดของมุมมอง ใช้กับEditTextเท่านั้น โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.editText_name), hasErrorText(is("name is required"))))

ยอมรับสตริงอาร์กิวเมนต์เช่นกัน โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.editText_name), hasErrorText("name is required")))

hasImeAction ()

hasImeAction ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <Integer> และอาร์กิวเมนต์หมายถึงวิธีการป้อนข้อมูลที่รองรับมุมมอง (EditText) ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองโดยใช้วิธีการป้อนข้อมูลที่รองรับของมุมมอง ใช้กับEditTextเท่านั้น โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.editText_name),
hasImeAction(is(EditorInfo.IME_ACTION_GO))))

ที่นี่ EditorInfo.IME_ACTION_GO อยู่บนตัวเลือกวิธีการป้อนข้อมูล hasImeAction ()ยอมรับอาร์กิวเมนต์จำนวนเต็มด้วย โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))

supportsInputMethods ()

supportsInputMethods ()ไม่มีอาร์กิวเมนต์ จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองหากสนับสนุนวิธีการป้อนข้อมูล โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.editText_name), supportsInputMethods()))

isRoot ()

isRoot ()ไม่มีข้อโต้แย้ง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองรูท โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_root_id), isRoot()))

isDisplayed ()

isDisplayed ()ไม่มีข้อโต้แย้ง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่กำลังแสดงอยู่ โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isDisplayed()))

isDisplayingAtLeast ()

isDisplayingAtLeast ()ยอมรับอาร์กิวเมนต์เดียวของชนิด int จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่แสดงในปัจจุบันอย่างน้อยเปอร์เซ็นต์ที่ระบุ โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isDisplayingAtLeast(75)))

isCompletelyDisplayed ()

isCompletelyDisplayed ()ไม่มีอาร์กิวเมนต์ จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่แสดงอยู่บนหน้าจออย่างสมบูรณ์ โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isCompletelyDisplayed()))

เปิดใช้งาน()

isEnabled ()ไม่มีอาร์กิวเมนต์ จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่เปิดใช้งาน โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isEnabled()))

isFocusable ()

isFocusable ()ไม่มีข้อโต้แย้ง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มีตัวเลือกโฟกัส โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isFocusable()))

hasFocus ()

hasFocus ()ไม่มีข้อโต้แย้ง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่โฟกัสอยู่ในขณะนี้ โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), hasFocus()))

isClickable ()

isClickable ()ไม่มีข้อโต้แย้ง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่เป็นตัวเลือกคลิก โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isClickable()))

isSelected ()

isSelected ()ไม่มีอาร์กิวเมนต์ จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่เลือกในปัจจุบัน โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isSelected()))

isChecked ()

isChecked ()ไม่มีอาร์กิวเมนต์ ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่เป็นประเภท CompoundButton (หรือประเภทย่อยของมัน) และอยู่ในสถานะที่ถูกตรวจสอบ โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_view_id), isChecked()))

isNotChecked ()

isNotChecked ()อยู่ตรงข้ามกับ isChecked โค้ดตัวอย่างมีดังนี้ * ดังนี้

onView(allOf(withId(R.id.my_view_id), isNotChecked()))

isJavascriptEnabled ()

isJavascriptEnabled ()ไม่มีอาร์กิวเมนต์ จะส่งคืนตัวจับคู่ซึ่งตรงกับ WebView ที่กำลังประเมิน JavaScript โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))

กับผู้ปกครอง ()

withParent ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <View> หนึ่งรายการ อาร์กิวเมนต์หมายถึงมุมมอง ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มุมมองที่ระบุคือมุมมองหลัก โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))

hasSibling ()

hasSibling ()ยอมรับอาร์กิวเมนต์ประเภท Matcher> View < อาร์กิวเมนต์หมายถึงมุมมอง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่ส่งผ่านเข้ามาเป็นหนึ่งในมุมมองพี่น้องของมัน โค้ดตัวอย่างมีดังนี้

onView(hasSibling(withId(R.id.siblingView)))

กับเด็ก ()

withChild ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <View> หนึ่งรายการ อาร์กิวเมนต์หมายถึงมุมมอง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่ส่งผ่านเข้ามาคือมุมมองเด็ก โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))

hasChildCount ()

hasChildCount ()ยอมรับอาร์กิวเมนต์ชนิด int อาร์กิวเมนต์หมายถึงจำนวนลูกของการดู จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มีจำนวนมุมมองเด็กเท่ากันทุกประการตามที่ระบุในอาร์กิวเมนต์ โค้ดตัวอย่างมีดังนี้

onView(hasChildCount(4))

hasMinimumChildCount ()

hasMinimumChildCount ()ยอมรับอาร์กิวเมนต์ชนิด int อาร์กิวเมนต์หมายถึงจำนวนลูกของการดู ส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มีอย่างน้อยจำนวนมุมมองชายด์ตามที่ระบุในอาร์กิวเมนต์ โค้ดตัวอย่างมีดังนี้

onView(hasMinimumChildCount(4))

hasDescendant ()

hasDescendant ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <View> หนึ่งรายการ อาร์กิวเมนต์หมายถึงมุมมอง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่มุมมองที่ส่งผ่านเป็นหนึ่งในมุมมองที่สืบเนื่องมาในลำดับชั้นของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(hasDescendant(withId(R.id.descendantView)))

isDescendantOfA ()

isDescendantOfA ()ยอมรับอาร์กิวเมนต์ประเภท Matcher <View> หนึ่งรายการ อาร์กิวเมนต์หมายถึงมุมมอง จะส่งคืนตัวจับคู่ซึ่งตรงกับมุมมองที่ส่งผ่านเข้ามาเป็นหนึ่งในมุมมองบรรพบุรุษในลำดับชั้นของมุมมอง โค้ดตัวอย่างมีดังนี้

onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))