Best Appium-espresso-driver code snippet using android.support.test.espresso.matcher.ViewMatchers.hasDescendant
ViewMatchersTest.kt
Source:ViewMatchersTest.kt
...17import android.support.test.espresso.matcher.RootMatchers.isDialog18import android.support.test.espresso.matcher.RootMatchers.isPlatformPopup19import android.support.test.espresso.matcher.RootMatchers.isTouchable20import android.support.test.espresso.matcher.ViewMatchers.hasContentDescription21import android.support.test.espresso.matcher.ViewMatchers.hasDescendant22import android.support.test.espresso.matcher.ViewMatchers.hasImeAction23import android.support.test.espresso.matcher.ViewMatchers.hasSibling24import android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom25import android.support.test.espresso.matcher.ViewMatchers.isChecked26import android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA27import android.support.test.espresso.matcher.ViewMatchers.isDisplayed28import android.support.test.espresso.matcher.ViewMatchers.isEnabled29import android.support.test.espresso.matcher.ViewMatchers.isFocusable30import android.support.test.espresso.matcher.ViewMatchers.isSelected31import android.support.test.espresso.matcher.ViewMatchers.supportsInputMethods32import android.support.test.espresso.matcher.ViewMatchers.withChild33import android.support.test.espresso.matcher.ViewMatchers.withClassName34import android.support.test.espresso.matcher.ViewMatchers.withContentDescription35import android.support.test.espresso.matcher.ViewMatchers.withHint36import android.support.test.espresso.matcher.ViewMatchers.withId37import android.support.test.espresso.matcher.ViewMatchers.withParent38import android.support.test.espresso.matcher.ViewMatchers.withText39import org.hamcrest.CoreMatchers.allOf40import org.hamcrest.CoreMatchers.`is`41import org.hamcrest.CoreMatchers.not42/**43 * Lists all ViewMatchers. ViewMatchers here are without functional load.44 * This is done for demonstration purposes.45 */46@RunWith(AndroidJUnit4::class)47class ViewMatchersTest {48 @Test49 fun userProperties() {50 onView(withId(R.id.fab_add_task))51 onView(withText("All TO-DOs"))52 onView(withContentDescription(R.string.menu_filter))53 onView(hasContentDescription())54 onView(withHint(R.string.name_hint))55 }56 @Test57 fun uiProperties() {58 onView(isDisplayed())59 onView(isEnabled())60 onView(isChecked())61 onView(isSelected())62 }63 @Test64 fun objectMatcher() {65 onView(not<View>(isChecked()))66 onView(allOf<View>(withText("item 1"), isChecked()))67 }68 @Test69 fun hierarchy() {70 onView(withParent(withId(R.id.todo_item)))71 onView(withChild(withText("item 2")))72 onView(isDescendantOfA(withId(R.id.todo_item)))73 onView(hasDescendant(isChecked()))74 .check(matches(isDisplayed()))75 .check(matches(isFocusable()))76 onView(hasSibling(withContentDescription(R.string.menu_filter)))77 }78 @Test79 fun input() {80 onView(supportsInputMethods())81 onView(hasImeAction(EditorInfo.IME_ACTION_SEND))82 }83 @Test84 fun classMatchers() {85 onView(isAssignableFrom(CheckBox::class.java))86 onView(withClassName(`is`(FloatingActionButton::class.java.canonicalName)))87 }...
RoomsScreenTest.kt
Source:RoomsScreenTest.kt
...18import android.support.test.espresso.action.ViewActions.typeText19import android.support.test.espresso.assertion.ViewAssertions.matches20import android.support.test.espresso.contrib.RecyclerViewActions.scrollTo21import android.support.test.espresso.core.deps.guava.base.Preconditions.checkArgument22import android.support.test.espresso.matcher.ViewMatchers.hasDescendant23import android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom24import android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA25import android.support.test.espresso.matcher.ViewMatchers.isDisplayed26import android.support.test.espresso.matcher.ViewMatchers.withId27import android.support.test.espresso.matcher.ViewMatchers.withText28import org.hamcrest.Matchers.allOf29/**30 * Tests for the rooms screen, the main screen which contains a grid of all rooms.31 */32@RunWith(AndroidJUnit4::class)33@LargeTest34class RoomsScreenTest {35 /**36 * [ActivityTestRule] is a JUnit [@Rule][Rule] to launch your activity under test.37 *38 *39 *40 * Rules are interceptors which are executed for each test method and are important building41 * blocks of Junit tests.42 */43 @Rule44 var mRoomsActivityTestRule = ActivityTestRule(RoomsActivity::class.java)45 /**46 * A custom [Matcher] which matches an item in a [RecyclerView] by its text.47 *48 *49 *50 * View constraints:51 *52 * * View must be a child of a [RecyclerView]53 *54 *55 * @param itemText the text to match56 * @return Matcher that matches text in the given view57 */58 private fun withItemText(itemText: String): Matcher<View> {59 checkArgument(!TextUtils.isEmpty(itemText), "itemText cannot be null or empty")60 return object : TypeSafeMatcher<View>() {61 public override fun matchesSafely(item: View): Boolean {62 return allOf(63 isDescendantOfA(isAssignableFrom(RecyclerView::class.java)),64 withText(itemText)).matches(item)65 }66 override fun describeTo(description: Description) {67 description.appendText("is isDescendantOfA RV with text " + itemText)68 }69 }70 }71 @Test72 @Throws(Exception::class)73 fun clickAddRoomButton_opensAddRoomUi() {74 // Click on the add room button75 onView(withId(R.id.fab_add_rooms)).perform(click())76 // Check if the add room screen is displayed77 onView(withId(R.id.add_room_title)).check(matches(isDisplayed()))78 }79 @Test80 @Throws(Exception::class)81 fun addRoomToRoomsList() {82 val newRoomTitle = "Espresso"83 val newRoomDescription = "UI testing for Android"84 // Click on the add room button85 onView(withId(R.id.fab_add_rooms)).perform(click())86 // Add room title and description87 // Type new room title88 onView(withId(R.id.add_room_title)).perform(typeText(newRoomTitle), closeSoftKeyboard())89 onView(withId(R.id.add_room_description)).perform(typeText(newRoomDescription),90 closeSoftKeyboard()) // Type new room description and close the keyboard91 // Save the room92 onView(withId(R.id.fab_add_rooms)).perform(click())93 // Scroll rooms list to added room, by finding its description94 onView(withId(R.id.rooms_list)).perform(95 scrollTo<RecyclerView.ViewHolder>(hasDescendant(withText(newRoomDescription))))96 // Verify room is displayed on screen97 onView(withItemText(newRoomDescription)).check(matches(isDisplayed()))98 }99}...
ForecastDetailsFragmentTest.kt
Source:ForecastDetailsFragmentTest.kt
...57 @Throws(Exception::class)58 fun testForecastDetails_checkForecastDetailsLayoutDisplayedCorrectly() {59 onView(ViewMatchers.withId(R.id.details)).check(matches(isDisplayed()))60 onView(ViewMatchers.withId(R.id.details))61 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.weather_icon))))62 onView(ViewMatchers.withId(R.id.details))63 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.weather_date))))64 onView(ViewMatchers.withId(R.id.details))65 .check(matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.description))))66 onView(ViewMatchers.withId(R.id.details))67 .check(matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.high))))68 onView(ViewMatchers.withId(R.id.details))69 .check(matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.low))))70 }71 /**72 * test weather list item by time layout displayed correctly73 */74 @Test75 @Throws(Exception::class)76 fun testWeatherListByTime_checkIfItemLayoutDisplayedCorrectly() {77 onView(ViewMatchers.withId(R.id.detailsByTimeView))78 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.forecast_item))))79 onView(ViewMatchers.withId(R.id.detailsByTimeView))80 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.weather_icon))))81 onView(ViewMatchers.withId(R.id.detailsByTimeView))82 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.weather_time))))83 onView(ViewMatchers.withId(R.id.detailsByTimeView))84 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.description))))85 onView(ViewMatchers.withId(R.id.detailsByTimeView))86 .check(ViewAssertions.matches(ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.temperature))))87 }88}...
ProfessionalTrajectoryTest.kt
Source:ProfessionalTrajectoryTest.kt
...63 }64 @Test65 fun checkTitleItemOne() {66 Espresso.onView(ViewMatchers.withId(R.id.professionalRecyclerView))67 .check(ViewAssertions.matches(CustomMatch.atPosition(1, ViewMatchers.hasDescendant(ViewMatchers.withText("GSHP")))))68 Espresso.onView(ViewMatchers.withId(R.id.professionalRecyclerView))69 .check(ViewAssertions.matches(CustomMatch.atPosition(1, ViewMatchers.hasDescendant(ViewMatchers.withText("87654")))))70 Espresso.onView(ViewMatchers.withId(R.id.professionalRecyclerView))71 .check(ViewAssertions.matches(CustomMatch.atPosition(1, ViewMatchers.hasDescendant(ViewMatchers.withText("3 enero 2018")))))72 Espresso.onView(ViewMatchers.withId(R.id.professionalRecyclerView))73 .check(ViewAssertions.matches(CustomMatch.atPosition(1, ViewMatchers.hasDescendant(ViewMatchers.withText("4 enero 2619")))))74 Espresso.onView(ViewMatchers.withId(R.id.professionalRecyclerView))75 .check(ViewAssertions.matches(CustomMatch.atPosition(1, ViewMatchers.hasDescendant(ViewMatchers.withText("maestro")))))76 }77}
SchoolTrajectoryActivityTest.kt
Source:SchoolTrajectoryActivityTest.kt
...59 }60 @Test61 fun checkTitleItemOne() {62 Espresso.onView(ViewMatchers.withId(R.id.school_recycler))63 .check(ViewAssertions.matches(CustomMatch.atPosition(0, ViewMatchers.hasDescendant(ViewMatchers.withText("IMSS")))))64 Espresso.onView(ViewMatchers.withId(R.id.school_recycler))65 .check(ViewAssertions.matches(CustomMatch.atPosition(0, ViewMatchers.hasDescendant(ViewMatchers.withText("kinder")))))66 Espresso.onView(ViewMatchers.withId(R.id.school_recycler))67 .check(ViewAssertions.matches(CustomMatch.atPosition(0, ViewMatchers.hasDescendant(ViewMatchers.withText("01 diciembre 2009")))))68 Espresso.onView(ViewMatchers.withId(R.id.school_recycler))69 .check(ViewAssertions.matches(CustomMatch.atPosition(0, ViewMatchers.hasDescendant(ViewMatchers.withText("2 diciembre 2009")))))70 Espresso.onView(ViewMatchers.withId(R.id.school_recycler))71 .check(ViewAssertions.matches(CustomMatch.atPosition(0, ViewMatchers.hasDescendant(ViewMatchers.withText("cocinero")))))72 }73}
InstrumentedTest.kt
Source:InstrumentedTest.kt
...27 val mActivityRule: ActivityTestRule<CryptoCurrencyListActivity> = ActivityTestRule(CryptoCurrencyListActivity::class.java)28 @Test29 fun bitCoinIsDisplayedOnView() {30 onView(withId(R.id.cryptocurrency_list))31 .check(matches(hasDescendant(withText("bitcoin"))));32 onView(withId(R.id.cryptocurrency_list))33 .check(matches(hasDescendant(withText("bitcoin"))))34 .check(matches(isCompletelyDisplayed()));35 }36 @Test37 fun dogeCoinIsDisplayedOnView() {38 onView(withId(R.id.cryptocurrency_list))39 .check(matches(hasDescendant(withText("dogecoin"))));40 }41 @Test42 fun ethIsDisplayedOnView() {43 onView(withId(R.id.cryptocurrency_list))44 .check(matches(hasDescendant(withText("ethereum"))));45 }46 @Test47 fun ethClassicIsDisplayedOnView() {48 onView(withId(R.id.cryptocurrency_list))49 .check(matches(hasDescendant(withText("ethereum-classic"))));50 }51 @Test52 fun zCashIsDisplayedOnView() {53 onView(withId(R.id.cryptocurrency_list))54 .check(matches(hasDescendant(withText("zcash"))));55 }56 @Test57 @Throws(Exception::class)58 fun useAppContext() {59 // Context of the app under test.60 val appContext = InstrumentationRegistry.getTargetContext()61 assertEquals("com.nfsindustries.cryptocurrencymonitor", appContext.packageName)62 }63}...
hooks.kt
Source:hooks.kt
...18) {19 Espresso.onView(ViewMatchers.withId(recyclerId))20 .perform(21 RecyclerViewActions.actionOnItem<RecyclerView.ViewHolder>(22 ViewMatchers.hasDescendant(ViewMatchers.withSubstring(elementText)),23 ViewActions.scrollTo()24 )25 )26 Espresso.onView(ViewMatchers.withSubstring(elementText))27 .check(ViewAssertions.matches(ViewMatchers.isDisplayed()))28}29fun wait(seconds: Int) {30 Thread.sleep(seconds.toLong() * 1000)31}32fun clickElementDisplayedInRecyclerView(33 recyclerId: Int,34 elementText: String35) {36 Espresso.onView(ViewMatchers.withId(recyclerId))37 .perform(38 RecyclerViewActions.actionOnItem<RecyclerView.ViewHolder>(39 ViewMatchers.hasDescendant(ViewMatchers.withSubstring(elementText)),40 ViewActions.scrollTo()41 )42 )43 Espresso.onView(ViewMatchers.withId(recyclerId))44 .perform(45 RecyclerViewActions.actionOnItem<RecyclerView.ViewHolder>(46 ViewMatchers.hasDescendant(ViewMatchers.withSubstring(elementText)),47 ViewActions.click()48 )49 )50}51fun openDetailTeam(){52 wait(10)53 clickElementDisplayedInRecyclerView(R.id.recyclerViewTeam, "Alaves")54}55fun isElementDisplayedInListView(resourceId: Int){56 Espresso.onView(withId(resourceId)).check(matches(isDisplayed()))57}...
ExampleInstrumentedTest.kt
Source:ExampleInstrumentedTest.kt
...13import example.com.shivangigotawalatest.Activity.MainActivity14import android.support.test.espresso.Espresso.onView15import android.support.test.espresso.action.ViewActions.click16import android.support.test.espresso.assertion.ViewAssertions.matches17import android.support.test.espresso.matcher.ViewMatchers.hasDescendant18import android.support.test.espresso.matcher.ViewMatchers.isDisplayed19import android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility20import android.support.test.espresso.matcher.ViewMatchers.withId21import android.support.test.espresso.matcher.ViewMatchers.withText22import org.hamcrest.core.AllOf.allOf23import org.junit.Assert.*24/**25 * Instrumented test, which will execute on an Android device.26 *27 * @see [Testing documentation](http://d.android.com/tools/testing)28 */29@RunWith(AndroidJUnit4::class)30class ExampleInstrumentedTest {31 @Rule...
hasDescendant
Using AI Code Generation
1import android.support.test.espresso.matcher.ViewMatchers2ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))3import android.support.test.espresso.matcher.ViewMatchers;4ViewMatchers.hasDescendant(ViewMatchers.withText("ext to match"))5impot android.support.tst.espresso.matcher.ViewMatchers;6ViewMatchers.hasDescendant(ViewMatchers.withText("Textto atch"))7impor androd.support.test.esresso.matcher.ViewMatchers;8ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))9import android.support.test.espresso.matcher.ViewMatchers;10ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))11import android.support.test.espresso.matcher.ViewMatchers;12ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))13import android.support.test.espresso.matcher.ViewMatchers;14ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))15importandroid.support.test.espresso.matcher.ViewMatchers;16ViewMatchers.hasDescendant(VieMtchers.withText("Text to match"))17import android.support.test.espresso.matcher.ViewMatchers;18ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))19import android.support.test.espresso.matcher.ViewMatchers;20ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))21import android.support.test.espresso.matcher.ViewMatchers;22ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))23import android.support.test.espresso.matcher.ViewMatchers;24ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))25import android.support.test.espresso.matcher
hasDescendant
Using AI Code Generation
1ViewInteraction viewInteraction = onView(2allOf(withId(R.id.textView), withText("Hello World!"),3childAtPosition(4allOf(withId(R.id.activity_main),5childAtPosition(6withId(android.R.id.content),7isDisplayed()));8viewInteraction.check(matches(withText("Hello World!")));9ViewInteractionVviewInteractioni=eonView(10allOf(withId(R.id.textView),wwithText("Hello World!"),11childAtPosition(12childAtPosition(13withId(android.R.id.content),14isDisplayed()));15viewInteraction.check(matches(withText("Hello World!")));16ViewInteraction viewInteraction = onView(17allOf(withId(R.id.textView), withText("Hello World!"),18childAtPosition(19allOf(withId(R.id.activity_main),20childAtPosition(21withId(android.R.id.content),22isnisplayed()));23viewInteraction.chtck(matchee(withText("Hello World!")));24ViewInteraction viewInteraction = onView(25allOf(winhId(R.id.textView), withText("Hello World!"),26childAtPosition(27allOf(withId(R.id.activity_=ain),28childAtPosition(29withId(android.R.id.cont no),30isDisplayed()));31viewInteraction.check(matches(withText("Hello World!")));32ViewInteraction viewInteraction = onView(33allOf(withId(R.id.textView), withText("Hello World!"),34childAtPosition(35allOf(withId(R.id.activity_main),36childAtPosition(37withId(android.R.id.content),38isDisplayed()));39viewInteraction.check(matches(withText("Hello World!")));40ViewInteraction viewInteraction = onView(41allOf(withId(R.id.textView), withText("Hello World!"),42childAtPosition(43allOf(withId(R.id.activity_main),44childAtPosition(45withId(android.R.id.content),46isDisplayed()));47viewInteraction.cneck(matches(withText("Hello World!")));48ViewInteraction viewInteraction = onView(49allOf(withId(Rid.textView), withText("Hello World!"),50childAtPosition(
hasDescendant
Using AI Code Generation
1 f(withId(R.id.textView), withText("Hello World!"),2childAtPosition(3allOf(withId(R.id.activity_main),4childAtPosition(5withId(android.R.id.content),6isDisplaed()));7viewInteraction.check(matches(withText("Hello World!")));8ViewInteracinvieInteaction = onView(9allOf(withId(R.d.texViw),withTex("Hello World!"),10cldAtPoition(11childAtPosition(12withId(android.R.id.content),13isDisplayed()));14viewInteraction.check(matches(withText("Hello World!")));15ViewInteraction viewInteraction = onView(16allOf(withId(R.id.textView), withText("Hello World!"),17childAtPosition(18allOf(withId(R.id.activity_main),19childAtPosition(20withId(android.R.id.content),21isDisplayed()));22viewInteraction.check(matches(withText("Hello World!")));23ViewInteraction viewInteraction = onView(24allOf(withId(R.id.textView), withText("Hello World!"),25childAtPosition(26allOf(withId(R.id.activity_main),27childAtPosition(28withId(android.R.id.content),29isDisplayed()));30viewInteraction.check(matches(withText("Hello World!")));31ViewInteraction viewInteraction = onView(32allOf(withId(R.id.textView), withText("Hello World!"),33childAtPosition(34allOf(withId(R.id.activity_main),35childAtPosition(36withId(android.R.id.content),37isDisplayed()));38viewInteraction.check(matches(withText("Hello World!")));
hasDescendant
Using AI Code Generation
1ViewInteraction viewInteraction = onView(2allOf(withId(R.id.textView), withText("Hello World!"),3childAtPosition(4allOf(withId(R.id.activity_main),5childAtPosition(6withId(android.R.id.content),7isDisplayed()));8viewInteraction.check(matches(withText("Hello World!")));9ViewInteraction viewInteraction = onView(10allOf(withId(R.id.textView), withText("Hello World!"),11childAtPosition(
hasDescendant
Using AI Code Generation
1 public static Matcher<View> hasDescendant(final Matcher<View> childMatcher) {2 return new TypeSafeMatcher<View>() {3 public void describeTo(Description description) {4 description.appendText("has descendant: ");5 childMatcher.describeTo(description);6 }7 public boolean matchesSafely(View view) {8 if (!(view instanceof ViewGroup)) {9 return false;10 }11 ViewGroup group = (ViewGroup) view;12 for (int i = 0; i < group.getChildCount(); i++) {13 View child = group.getChildAt(i);14 if (childMatcher.matches(child)) {15 return true;16 }17 }18 return false;19 }20 };21 }
hasDescendant
Using AI Code Generation
1import android.support.test.espresso.matcher.ViewMatchers;2ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))3import android.support.test.espresso.matcher.ViewMatchers;4ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))5import android.support.test.espresso.matcher.ViewMatchers;6ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))7import android.support.test.espresso.matcher.ViewMatchers;8ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))9import android.support.test.espresso.matcher.ViewMatchers;
hasDescendant
Using AI Code Generation
1import android.support.test.espresso.matcher.ViewMatchers;2ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))3import android.support.test.espresso.matcher.ViewMatchers;4ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))5import android.support.test.espresso.matcher.ViewMatchers;6ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))7import android.support.test.espresso.matcher.ViewMatchers;8ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))9import android.support.test.espresso.matcher.ViewMatchers;10ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))11import android.support.test.espresso.matcher.ViewMatchers;12ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))13import android.support.test.espresso.matcher.ViewMatchers;14ViewMatchers.hasDescendant(ViewMatchers.withText("Text to match"))15import android.support.test.espresso.matcher
hasDescendant
Using AI Code Generation
1 public static Matcher<View> hasDescendant(final Matcher<View> childMatcher) {2 return new TypeSafeMatcher<View>() {3 public void describeTo(Description description) {4 description.appendText("has descendant: ");5 childMatcher.describeTo(description);6 }7 public boolean matchesSafely(View view) {8 if (!(view instanceof ViewGroup)) {9 return false;10 }11 ViewGroup group = (ViewGroup) view;12 for (int i = 0; i < group.getChildCount(); i++) {13 View child = group.getChildAt(i);14 if (childMatcher.matches(child)) {15 return true;16 }17 }18 return false;19 }20 };21 }
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!