For #26286 new web control UI tests
This commit is contained in:
parent
ce3d6b84ca
commit
6998809039
|
@ -99,6 +99,18 @@ object TestAssetHelper {
|
||||||
return TestAsset(url, "", "")
|
return TestAsset(url, "", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getHTMLControlsFormAsset(server: MockWebServer): TestAsset {
|
||||||
|
val url = server.url("pages/htmlControls.html").toString().toUri()!!
|
||||||
|
|
||||||
|
return TestAsset(url, "", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getExternalLinksAsset(server: MockWebServer): TestAsset {
|
||||||
|
val url = server.url("pages/externalLinks.html").toString().toUri()!!
|
||||||
|
|
||||||
|
return TestAsset(url, "", "")
|
||||||
|
}
|
||||||
|
|
||||||
fun getAudioPageAsset(server: MockWebServer): TestAsset {
|
fun getAudioPageAsset(server: MockWebServer): TestAsset {
|
||||||
val url = server.url("pages/audioMediaPage.html").toString().toUri()!!
|
val url = server.url("pages/audioMediaPage.html").toString().toUri()!!
|
||||||
val title = "Audio_Test_Page"
|
val title = "Audio_Test_Page"
|
||||||
|
|
150
app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt
Normal file
150
app/src/androidTest/java/org/mozilla/fenix/ui/WebControlsTest.kt
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.fenix.ui
|
||||||
|
|
||||||
|
import okhttp3.mockwebserver.MockWebServer
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Rule
|
||||||
|
import org.junit.Test
|
||||||
|
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
|
||||||
|
import org.mozilla.fenix.helpers.HomeActivityTestRule
|
||||||
|
import org.mozilla.fenix.helpers.TestAssetHelper
|
||||||
|
import org.mozilla.fenix.ui.robots.navigationToolbar
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for verifying basic interactions with web control elements
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class WebControlsTest {
|
||||||
|
private lateinit var mockWebServer: MockWebServer
|
||||||
|
|
||||||
|
private val hour = 10
|
||||||
|
private val minute = 10
|
||||||
|
private val colorHexValue = "#5b2067"
|
||||||
|
|
||||||
|
@get:Rule
|
||||||
|
val activityTestRule = HomeActivityTestRule(
|
||||||
|
isJumpBackInCFREnabled = false,
|
||||||
|
isTCPCFREnabled = false,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
mockWebServer = MockWebServer().apply {
|
||||||
|
dispatcher = AndroidAssetDispatcher()
|
||||||
|
start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun tearDown() {
|
||||||
|
mockWebServer.shutdown()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun cancelCalendarFormTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Calendar Form")
|
||||||
|
clickFormViewButton("CANCEL")
|
||||||
|
clickSubmitDateButton()
|
||||||
|
verifyNoDateIsSelected()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setAndClearCalendarFormTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Calendar Form")
|
||||||
|
selectDate()
|
||||||
|
clickFormViewButton("OK")
|
||||||
|
clickSubmitDateButton()
|
||||||
|
verifySelectedDate()
|
||||||
|
clickForm("Calendar Form")
|
||||||
|
clickFormViewButton("CLEAR")
|
||||||
|
clickSubmitDateButton()
|
||||||
|
verifyNoDateIsSelected()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun cancelClockFormTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Clock Form")
|
||||||
|
clickFormViewButton("CANCEL")
|
||||||
|
clickSubmitTimeButton()
|
||||||
|
verifyNoTimeIsSelected(hour, minute)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setAndClearClockFormTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Clock Form")
|
||||||
|
selectTime(hour, minute)
|
||||||
|
clickFormViewButton("OK")
|
||||||
|
clickSubmitTimeButton()
|
||||||
|
verifySelectedTime(hour, minute)
|
||||||
|
clickForm("Clock Form")
|
||||||
|
clickFormViewButton("CLEAR")
|
||||||
|
clickSubmitTimeButton()
|
||||||
|
verifyNoTimeIsSelected(hour, minute)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun cancelColorFormTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Color Form")
|
||||||
|
selectColor(colorHexValue)
|
||||||
|
clickFormViewButton("CANCEL")
|
||||||
|
clickSubmitColorButton()
|
||||||
|
verifyColorIsNotSelected(colorHexValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setColorFormTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Color Form")
|
||||||
|
selectColor(colorHexValue)
|
||||||
|
clickFormViewButton("SET")
|
||||||
|
clickSubmitColorButton()
|
||||||
|
verifySelectedColor(colorHexValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun verifyDropdownMenuTest() {
|
||||||
|
val htmlControlsPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
|
||||||
|
|
||||||
|
navigationToolbar {
|
||||||
|
}.enterURLAndEnterToBrowser(htmlControlsPage.url) {
|
||||||
|
clickForm("Drop-down Form")
|
||||||
|
selectDropDownOption("The National")
|
||||||
|
clickSubmitDropDownButton()
|
||||||
|
verifySelectedDropDownOption("The National")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,14 +11,17 @@ import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.widget.TimePicker
|
||||||
import androidx.test.espresso.Espresso.onView
|
import androidx.test.espresso.Espresso.onView
|
||||||
import androidx.test.espresso.action.ViewActions
|
import androidx.test.espresso.action.ViewActions
|
||||||
import androidx.test.espresso.assertion.ViewAssertions.matches
|
import androidx.test.espresso.assertion.ViewAssertions.matches
|
||||||
|
import androidx.test.espresso.contrib.PickerActions
|
||||||
import androidx.test.espresso.intent.Intents
|
import androidx.test.espresso.intent.Intents
|
||||||
import androidx.test.espresso.intent.matcher.BundleMatchers
|
import androidx.test.espresso.intent.matcher.BundleMatchers
|
||||||
import androidx.test.espresso.intent.matcher.IntentMatchers
|
import androidx.test.espresso.intent.matcher.IntentMatchers
|
||||||
import androidx.test.espresso.matcher.RootMatchers.isDialog
|
import androidx.test.espresso.matcher.RootMatchers.isDialog
|
||||||
import androidx.test.espresso.matcher.ViewMatchers
|
import androidx.test.espresso.matcher.ViewMatchers
|
||||||
|
import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
|
||||||
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
||||||
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
|
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
|
||||||
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
|
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
|
||||||
|
@ -34,6 +37,7 @@ import mozilla.components.browser.state.selector.selectedTab
|
||||||
import mozilla.components.browser.state.store.BrowserStore
|
import mozilla.components.browser.state.store.BrowserStore
|
||||||
import mozilla.components.concept.engine.mediasession.MediaSession
|
import mozilla.components.concept.engine.mediasession.MediaSession
|
||||||
import org.hamcrest.CoreMatchers.allOf
|
import org.hamcrest.CoreMatchers.allOf
|
||||||
|
import org.junit.Assert.assertFalse
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Assert.fail
|
import org.junit.Assert.fail
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
|
@ -49,6 +53,7 @@ import org.mozilla.fenix.helpers.TestHelper.packageName
|
||||||
import org.mozilla.fenix.helpers.TestHelper.waitForObjects
|
import org.mozilla.fenix.helpers.TestHelper.waitForObjects
|
||||||
import org.mozilla.fenix.helpers.click
|
import org.mozilla.fenix.helpers.click
|
||||||
import org.mozilla.fenix.helpers.ext.waitNotNull
|
import org.mozilla.fenix.helpers.ext.waitNotNull
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
class BrowserRobot {
|
class BrowserRobot {
|
||||||
private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource
|
private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource
|
||||||
|
@ -651,6 +656,227 @@ class BrowserRobot {
|
||||||
assertTrue(hintMessage.waitForExists(waitingTime))
|
assertTrue(hintMessage.waitForExists(waitingTime))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun clickForm(formType: String) {
|
||||||
|
when (formType) {
|
||||||
|
"Calendar Form" -> {
|
||||||
|
clickPageObject(webPageItemWithResourceId("calendar"))
|
||||||
|
mDevice.waitForIdle(waitingTime)
|
||||||
|
}
|
||||||
|
"Clock Form" -> {
|
||||||
|
clickPageObject(webPageItemWithResourceId("clock"))
|
||||||
|
mDevice.waitForIdle(waitingTime)
|
||||||
|
}
|
||||||
|
"Color Form" -> {
|
||||||
|
clickPageObject(webPageItemWithResourceId("colorPicker"))
|
||||||
|
mDevice.waitForIdle(waitingTime)
|
||||||
|
}
|
||||||
|
"Drop-down Form" -> {
|
||||||
|
clickPageObject(webPageItemWithResourceId("dropDown"))
|
||||||
|
mDevice.waitForIdle(waitingTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clickFormViewButton(button: String) = mDevice.findObject(UiSelector().textContains(button)).click()
|
||||||
|
|
||||||
|
fun selectDate() {
|
||||||
|
mDevice.findObject(UiSelector().resourceId("android:id/month_view")).waitForExists(waitingTime)
|
||||||
|
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.textContains("$currentDay")
|
||||||
|
.descriptionContains("$currentDay $currentMonth $currentYear"),
|
||||||
|
).click()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun selectTime(hour: Int, minute: Int) =
|
||||||
|
onView(
|
||||||
|
isAssignableFrom(TimePicker::class.java),
|
||||||
|
).inRoot(
|
||||||
|
isDialog(),
|
||||||
|
).perform(PickerActions.setTime(hour, minute))
|
||||||
|
|
||||||
|
fun selectColor(hexValue: String) {
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.textContains("Choose a color")
|
||||||
|
.resourceId("$packageName:id/alertTitle"),
|
||||||
|
).waitForExists(waitingTime)
|
||||||
|
|
||||||
|
val colorSelection =
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.resourceId("$packageName:id/color_item")
|
||||||
|
.descriptionContains(hexValue),
|
||||||
|
)
|
||||||
|
colorSelection.click()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun selectDropDownOption(optionName: String) {
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector().resourceId("$packageName:id/customPanel"),
|
||||||
|
).waitForExists(waitingTime)
|
||||||
|
mDevice.findObject(UiSelector().textContains(optionName)).click()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clickSubmitDateButton() = clickPageObject(webPageItemWithResourceId("submitDate"))
|
||||||
|
|
||||||
|
fun clickSubmitTimeButton() = clickPageObject(webPageItemWithResourceId("submitTime"))
|
||||||
|
|
||||||
|
fun clickSubmitColorButton() = clickPageObject(webPageItemWithResourceId("submitColor"))
|
||||||
|
|
||||||
|
fun clickSubmitDropDownButton() = clickPageObject(webPageItemWithResourceId("submitOption"))
|
||||||
|
|
||||||
|
fun verifySelectedDate() {
|
||||||
|
for (i in 1..RETRY_COUNT) {
|
||||||
|
try {
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected date is: $currentDate"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
|
||||||
|
break
|
||||||
|
} catch (e: AssertionError) {
|
||||||
|
Log.e("TestLog", "Selected time isn't displayed ${e.localizedMessage}")
|
||||||
|
|
||||||
|
clickForm("Calendar Form")
|
||||||
|
selectDate()
|
||||||
|
clickFormViewButton("OK")
|
||||||
|
clickSubmitDateButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected date is: $currentDate"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifyNoDateIsSelected() {
|
||||||
|
assertFalse(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected date is: $currentDate"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifySelectedTime(hour: Int, minute: Int) {
|
||||||
|
for (i in 1..RETRY_COUNT) {
|
||||||
|
try {
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected time is: $hour:$minute"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
|
||||||
|
break
|
||||||
|
} catch (e: AssertionError) {
|
||||||
|
Log.e("TestLog", "Selected time isn't displayed ${e.localizedMessage}")
|
||||||
|
|
||||||
|
clickForm("Clock Form")
|
||||||
|
clickFormViewButton("CLEAR")
|
||||||
|
clickForm("Clock Form")
|
||||||
|
selectTime(hour, minute)
|
||||||
|
clickFormViewButton("OK")
|
||||||
|
clickSubmitTimeButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected time is: $hour:$minute"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifySelectedColor(hexValue: String) {
|
||||||
|
for (i in 1..RETRY_COUNT) {
|
||||||
|
try {
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected color is: $hexValue"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
|
||||||
|
break
|
||||||
|
} catch (e: AssertionError) {
|
||||||
|
Log.e("TestLog", "Selected color isn't displayed ${e.localizedMessage}")
|
||||||
|
|
||||||
|
clickForm("Color Form")
|
||||||
|
selectColor(hexValue)
|
||||||
|
clickFormViewButton("SET")
|
||||||
|
clickSubmitColorButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected color is: $hexValue"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifySelectedDropDownOption(optionName: String) {
|
||||||
|
for (i in 1..RETRY_COUNT) {
|
||||||
|
try {
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.textContains("Submit drop down option")
|
||||||
|
.resourceId("submitOption"),
|
||||||
|
).waitForExists(waitingTime)
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected option is: $optionName"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
|
||||||
|
break
|
||||||
|
} catch (e: AssertionError) {
|
||||||
|
Log.e("TestLog", "Selected option isn't displayed ${e.localizedMessage}")
|
||||||
|
|
||||||
|
clickForm("Drop-down Form")
|
||||||
|
selectDropDownOption(optionName)
|
||||||
|
clickSubmitDropDownButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected option is: $optionName"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifyNoTimeIsSelected(hour: Int, minute: Int) {
|
||||||
|
assertFalse(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected date is: $hour:$minute"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun verifyColorIsNotSelected(hexValue: String) {
|
||||||
|
assertFalse(
|
||||||
|
mDevice.findObject(
|
||||||
|
UiSelector()
|
||||||
|
.text("Selected date is: $hexValue"),
|
||||||
|
).waitForExists(waitingTime),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
class Transition {
|
class Transition {
|
||||||
private fun threeDotButton() = onView(
|
private fun threeDotButton() = onView(
|
||||||
allOf(
|
allOf(
|
||||||
|
@ -983,3 +1209,8 @@ private fun setPageObjectText(webPageItem: UiObject, text: String) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val currentDate = LocalDate.now()
|
||||||
|
private val currentDay = currentDate.dayOfMonth
|
||||||
|
private val currentMonth = currentDate.month
|
||||||
|
private val currentYear = currentDate.year
|
||||||
|
|
Loading…
Reference in New Issue
Block a user