Из этого вопроса/ответа У меня возникла идея использовать UIAutomator для тестирования моего приложения, которое требует входа в Facebook.Написание тестов для Android-приложения, которое входит в систему Facebook: UIAutomator не может заполнить текст в поле имени пользователя Facebook
Writing tests for an Android app that logs into Facebook
Я попытался
UiObject2 editText = mDevice.findObject(By.clazz("android.widget.EditText"));
editText.setText("[email protected]");
, а также другие вещи, но все, что я делаю, я не могу получить его, чтобы заполнить поле. Я использовал инструмент hierachyviewer, чтобы увидеть, что это был EditText. Однако это веб-просмотр, поэтому я не знаю.
Возможно ли это?
Мой полный тестовый класс код прилагается ниже:
package com.greenrobot.yesorno.test;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
import android.test.suitebuilder.annotation.LargeTest;
import android.view.View;
import com.greenrobot.yesorno.Home;
import com.greenrobot.yesorno.R;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import timber.log.Timber;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.Matchers.hasToString;
import static org.hamcrest.Matchers.startsWith;
/**
* Created by andytriboletti on 1/15/16.
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class TestLogin {
private UiDevice mDevice;
private static final String PACKAGE_NAME = "com.greenrobot.yesorno";
private static final int LAUNCH_TIMEOUT = 5000;
@Rule
public ActivityTestRule<Home> mActivityRule = new ActivityTestRule(Home.class);
public TestLogin() {
super();
}
@Before
public void initTest() {
// Initialize UiDevice instance
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
//
// // Start from the home screen
// mDevice.pressHome();
//
// // Wait for launcher
// String launcherPackage = mDevice.getCurrentPackageName();
// mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT);
//
// // Launch the app
// Context context = InstrumentationRegistry.getContext();
// Intent intent = context.getPackageManager().getLaunchIntentForPackage(PACKAGE_NAME);
//
// // Clear out any previous instances
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
// context.startActivity(intent);
//
// // Wait for the app to appear
// mDevice.wait(Until.hasObject(By.pkg(PACKAGE_NAME).depth(0)), LAUNCH_TIMEOUT);
}
public void fillInEmail() {
onView(withId(R.id.authButton)).perform(click());
//new UiObject(new UiSelector().description("Email or Phone")).setText("[email protected]");
//new UiObject(new UiSelector().
// boolean result = new UiObject(new UiSelector().className(android.widget.EditText.class.getName())).setText("[email protected]");
//Timber.d(result.getText());
//UiObject2 editText = new UiObject2(new UiSelector(). className("android.widget.EditText").instance(0));
//UiObject editText = new UiObject(new UiSelector().text("Email or Phone"));
UiObject2 editText = mDevice.findObject(By.clazz("android.widget.EditText"));
editText.setText("[email protected]");
SystemClock.sleep(5000);
}
@Test
public void testLogin() {
try {
onView(withId(R.id.welcome)).check(matches(isDisplayed()));
Timber.d("Logged out");
//fillInEmail();
}
catch(NoMatchingViewException e) {
onView(withId(R.id.name_age)).check(matches(isDisplayed()));
Timber.d("Not logged out");
onView(withId(R.id.slidingmenumain)).perform(actionOpenDrawer());
//SystemClock.sleep(5000);
onData(hasToString(startsWith("Logout")))
.inAdapterView(withId(android.R.id.list))
.perform(click());
//fillInEmail();
//openDrawer(R.id.drawer_layout);
//Espresso.onView(Matchers.allOf(ViewMatchers.withId(R.id.drawerItemNameTextView), ViewMatchers.hasSibling(ViewMatchers.withText(((NavDrawerItem)item).getItemName())))).perform(ViewActions.click());
}
// onView(withText("Hello world!")).check(matches(isDisplayed()));
//onView(withId(R.id.changeTextBt)).perform(click());
}
private static ViewAction actionOpenDrawer() {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(SlidingMenu.class);
}
@Override
public String getDescription() {
return "open drawer";
}
@Override
public void perform(UiController uiController, View view) {
((SlidingMenu) view).showMenu();
}
};
}
private static ViewAction actionCloseDrawer() {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(SlidingMenu.class);
}
@Override
public String getDescription() {
return "close drawer";
}
@Override
public void perform(UiController uiController, View view) {
//((SlidingMenu) view).close(GravityCompat.START);
}
};
}
}
Edit: я использовал uiautomatorviewer не hierachyviewer. Вот скриншот, показывающий, что это текст редактирования. По крайней мере, в соответствии с этим инструментом.
Вы говорите, что что это EditText, но это * и * а WebView? Это не имеет никакого смысла. –
uiautomatorviewer говорит, что это EditText. Я прикрепил фотографию. ИДК. – Andy
В javadoc для findObject указано, что он получает объект * first *, который соответствует критериям. У вас есть селектор, который просто совпадает по имени класса, поэтому я предполагаю, что вы получаете другой EditText. Я еще не специалист по uiautomator, но я хотел бы посмотреть, как быть более конкретным, о том, какой EditText вы хотите завладеть. (Интересно, что он, кажется, преобразует текстовые поля webview в выбираемые объекты - не думал, что он может это сделать.) –