1
0
mirror of https://github.com/ARM-software/workload-automation.git synced 2024-10-06 19:01:15 +01:00

Youtube: Codetidy to conform with the other workloads

This commit is contained in:
Michael McGeagh 2016-09-28 14:39:53 +01:00
parent 77d724efa3
commit c47ae5cfcf
3 changed files with 94 additions and 73 deletions

View File

@ -22,8 +22,9 @@ class Youtube(AndroidUxPerfWorkload):
name = 'youtube'
package = 'com.google.android.youtube'
min_apk_version = '11.19.56'
max_apk_version = None # works with latest (11.33.58) at time of publishing this
activity = ''
view = [package + '/com.google.android.apps.youtube.app.WatchWhileActivity',
package + '/com.google.android.apps.youtube.app.honeycomb.SettingsActivity']
description = '''
A workload to perform standard productivity tasks within YouTube.
@ -66,15 +67,13 @@ class Youtube(AndroidUxPerfWorkload):
Parameter('search_term', kind=str,
default='Big Buck Bunny 60fps 4K - Official Blender Foundation Short Film',
description='''
The search term to use when ``video_source`` is set to ``search``. Ignored otherwise.
The search term to use when ``video_source`` is set to ``search``.
Ignored otherwise.
'''),
]
view = [
package + '/com.google.android.apps.youtube.app.WatchWhileActivity',
package + '/com.google.android.apps.youtube.app.honeycomb.SettingsActivity',
]
# This workload relies on the internet so check that there is a working
# internet connection
requires_network = True
def __init__(self, device, **kwargs):
@ -82,9 +81,9 @@ class Youtube(AndroidUxPerfWorkload):
self.run_timeout = 300
def validate(self):
if self.video_source == 'search' and not self.search_term:
raise WorkloadError("Param 'search_term' must be specified when video source is 'search'")
self.uiauto_params['package'] = self.package
super(Youtube, self).validate()
self.uiauto_params['video_source'] = self.video_source
self.uiauto_params['search_term'] = self.search_term.replace(' ', '0space0')
# Make sure search term is set if video source is 'search'
if (self.video_source == 'search') and not self.search_term:
raise WorkloadError("Param 'search_term' must be specified when video source is 'search'")

View File

@ -17,7 +17,6 @@ package com.arm.wlauto.uiauto.youtube;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
// Import the uiautomator libraries
import com.android.uiautomator.core.UiObject;
@ -32,54 +31,68 @@ import static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_DESC;
public class UiAutomation extends UxPerfUiAutomation {
public static final String CLASS_BUTTON = "android.widget.Button";
public static final String CLASS_TEXT_VIEW = "android.widget.TextView";
public Bundle parameters;
public String packageName;
public String packageID;
public static final int WAIT_TIMEOUT_1SEC = 1000;
public static final int VIDEO_SLEEP_SECONDS = 3;
public static final int LIST_SWIPE_COUNT = 5;
public static final String SOURCE_MY_VIDEOS = "my_videos";
public static final String SOURCE_SEARCH = "search";
public static final String SOURCE_TRENDING = "trending";
protected ActionLogger logger;
protected Bundle parameters;
protected String packageName;
protected String packageID;
protected String videoSource;
protected String searchTerm;
public static final int WAIT_TIMEOUT_1SEC = 1000;
public static final int VIDEO_SLEEP_SECONDS = 3;
public static final int LIST_SWIPE_COUNT = 5;
public void runUiAutomation() throws Exception {
parameters = getParams();
packageName = parameters.getString("package");
packageID = packageName + ":id/";
videoSource = parameters.getString("video_source");
searchTerm = parameters.getString("search_term");
String videoSource = parameters.getString("video_source");
String searchTerm = parameters.getString("search_term");
if (searchTerm != null) {
searchTerm = searchTerm.replaceAll("0space0", " ");
searchTerm = searchTerm.replace("0space0", " ");
}
setScreenOrientation(ScreenOrientation.NATURAL);
clearFirstRunDialogues();
disableAutoplay();
testPlayVideo(videoSource, searchTerm);
dismissAdvert();
checkPlayerError();
pausePlayVideo();
checkVideoInfo();
scrollRelated();
unsetScreenOrientation();
}
public void clearFirstRunDialogues() throws Exception {
UiObject laterButton = new UiObject(new UiSelector().textContains("Later").className(CLASS_TEXT_VIEW));
UiObject laterButton =
new UiObject(new UiSelector().textContains("Later")
.className("android.widget.TextView"));
if (laterButton.waitForExists(WAIT_TIMEOUT_1SEC)) {
laterButton.click();
}
UiObject cancelButton = new UiObject(new UiSelector().textContains("Cancel").className(CLASS_BUTTON));
UiObject cancelButton =
new UiObject(new UiSelector().textContains("Cancel")
.className("android.widget.Button"));
if (cancelButton.waitForExists(WAIT_TIMEOUT_1SEC)) {
cancelButton.click();
}
UiObject skipButton = new UiObject(new UiSelector().textContains("Skip").className(CLASS_TEXT_VIEW));
UiObject skipButton =
new UiObject(new UiSelector().textContains("Skip")
.className("android.widget.TextView"));
if (skipButton.waitForExists(WAIT_TIMEOUT_1SEC)) {
skipButton.click();
}
UiObject gotItButton = new UiObject(new UiSelector().textContains("Got it").className(CLASS_BUTTON));
UiObject gotItButton =
new UiObject(new UiSelector().textContains("Got it")
.className("android.widget.Button"));
if (gotItButton.waitForExists(WAIT_TIMEOUT_1SEC)) {
gotItButton.click();
}
@ -91,7 +104,8 @@ public class UiAutomation extends UxPerfUiAutomation {
clickUiObject(BY_TEXT, "General", true);
// Don't fail fatally if autoplay toggle cannot be found
UiObject autoplayToggle = new UiObject(new UiSelector().textContains("Autoplay"));
UiObject autoplayToggle =
new UiObject(new UiSelector().textContains("Autoplay"));
if (autoplayToggle.waitForExists(WAIT_TIMEOUT_1SEC)) {
autoplayToggle.click();
}
@ -99,64 +113,73 @@ public class UiAutomation extends UxPerfUiAutomation {
// Tablet devices use a split with General in the left pane and Autoplay in the right so no
// need to click back twice
UiObject generalButton = new UiObject(new UiSelector().textContains("General").className(CLASS_TEXT_VIEW));
UiObject generalButton =
new UiObject(new UiSelector().textContains("General")
.className("android.widget.TextView"));
if (generalButton.exists()) {
getUiDevice().pressBack();
}
}
public void testPlayVideo(String source, String searchTerm) throws Exception {
String testTag = "play";
ActionLogger logger = new ActionLogger(testTag + "_" + source, parameters);
if (SOURCE_SEARCH.equalsIgnoreCase(source)) {
clickUiObject(BY_DESC, "Search");
UiObject textField = getUiObjectByResourceId(packageID + "search_edit_text");
textField.setText(searchTerm);
getUiDevice().pressEnter();
startMeasurements("play_search");
// If a video exists whose title contains the exact search term, then play it
// Otherwise click the first video in the search results
UiObject thumbnail = new UiObject(new UiSelector().resourceId(packageID + "thumbnail"));
UiObject matchedVideo = thumbnail.getFromParent(new UiSelector().textContains(searchTerm));
UiObject thumbnail =
new UiObject(new UiSelector().resourceId(packageID + "thumbnail"));
UiObject matchedVideo =
thumbnail.getFromParent(new UiSelector().textContains(searchTerm));
logger.start();
if (matchedVideo.exists()) {
matchedVideo.clickAndWaitForNewWindow();
} else {
thumbnail.clickAndWaitForNewWindow();
}
endMeasurements();
logger.stop();
} else if (SOURCE_MY_VIDEOS.equalsIgnoreCase(source)) {
clickUiObject(BY_DESC, "Account");
clickUiObject(BY_TEXT, "My Videos", true);
startMeasurements("play_myvideos");
logger.start();
clickUiObject(BY_ID, packageID + "thumbnail", true);
endMeasurements();
logger.stop();
} else if (SOURCE_TRENDING.equalsIgnoreCase(source)) {
clickUiObject(BY_DESC, "Trending");
startMeasurements("play_trending");
logger.start();
clickUiObject(BY_ID, packageID + "thumbnail", true);
endMeasurements();
logger.stop();
} else { // homepage videos
UiScrollable list = new UiScrollable(new UiSelector().resourceId(packageID + "results"));
UiScrollable list =
new UiScrollable(new UiSelector().resourceId(packageID + "results"));
if (list.exists()) {
list.scrollForward();
}
startMeasurements("play_home");
clickUiObject(BY_ID, packageID + "thumbnail", true);
endMeasurements();
}
dismissAdvert();
checkPlayerError();
pausePlayVideo();
checkVideoInfo();
scrollRelated();
logger.start();
clickUiObject(BY_ID, packageID + "thumbnail", true);
logger.stop();
}
}
public void dismissAdvert() throws Exception {
UiObject advert = new UiObject(new UiSelector().textContains("Visit advertiser"));
UiObject advert =
new UiObject(new UiSelector().textContains("Visit advertiser"));
if (advert.exists()) {
UiObject skip = new UiObject(new UiSelector().textContains("Skip ad"));
UiObject skip =
new UiObject(new UiSelector().textContains("Skip ad"));
if (skip.waitForExists(WAIT_TIMEOUT_1SEC*5)) {
skip.click();
sleep(VIDEO_SLEEP_SECONDS);
@ -165,8 +188,10 @@ public class UiAutomation extends UxPerfUiAutomation {
}
public void checkPlayerError() throws Exception {
UiObject playerError = new UiObject(new UiSelector().resourceId(packageID + "player_error_view"));
UiObject tapToRetry = new UiObject(new UiSelector().textContains("Tap to retry"));
UiObject playerError =
new UiObject(new UiSelector().resourceId(packageID + "player_error_view"));
UiObject tapToRetry =
new UiObject(new UiSelector().textContains("Tap to retry"));
if (playerError.waitForExists(WAIT_TIMEOUT_1SEC) || tapToRetry.waitForExists(WAIT_TIMEOUT_1SEC)) {
throw new RuntimeException("Video player encountered an error and cannot continue.");
}
@ -182,7 +207,8 @@ public class UiAutomation extends UxPerfUiAutomation {
}
public void checkVideoInfo() throws Exception {
UiObject expandButton = new UiObject(new UiSelector().resourceId(packageID + "expand_button"));
UiObject expandButton =
new UiObject(new UiSelector().resourceId(packageID + "expand_button"));
if (!expandButton.waitForExists(WAIT_TIMEOUT_1SEC)) {
return;
}
@ -193,28 +219,24 @@ public class UiAutomation extends UxPerfUiAutomation {
}
public void scrollRelated() throws Exception {
// ListView of related videos and (maybe) comments
UiScrollable list = new UiScrollable(new UiSelector().resourceId(packageID + "watch_list"));
if (list.isScrollable()) {
startMeasurements("scroll_down");
list.flingToEnd(LIST_SWIPE_COUNT);
endMeasurements();
String testTag = "scroll";
startMeasurements("scroll_up");
// ListView of related videos and (maybe) comments
UiScrollable list =
new UiScrollable(new UiSelector().resourceId(packageID + "watch_list"));
if (list.isScrollable()) {
ActionLogger logger = new ActionLogger(testTag + "_down", parameters);
logger.start();
list.flingToEnd(LIST_SWIPE_COUNT);
logger.stop();
logger = new ActionLogger(testTag + "_up", parameters);
logger.start();
list.flingToBeginning(LIST_SWIPE_COUNT);
endMeasurements();
logger.stop();
}
// After flinging, give the window enough time to settle down before
// the next step, or else UiAutomator fails to find views in time
sleep(VIDEO_SLEEP_SECONDS);
}
protected void startMeasurements(String testTag) throws Exception {
logger = new ActionLogger(testTag, parameters);
logger.start();
}
protected void endMeasurements() throws Exception {
logger.stop();
}
}