1

Из этого вопроса/ответа У меня возникла идея использовать 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. Вот скриншот, показывающий, что это текст редактирования. По крайней мере, в соответствии с этим инструментом. uiautomator tool view of Facebook login webview

+0

Вы говорите, что что это EditText, но это * и * а WebView? Это не имеет никакого смысла. –

+0

uiautomatorviewer говорит, что это EditText. Я прикрепил фотографию. ИДК. – Andy

+0

В javadoc для findObject указано, что он получает объект * first *, который соответствует критериям. У вас есть селектор, который просто совпадает по имени класса, поэтому я предполагаю, что вы получаете другой EditText. Я еще не специалист по uiautomator, но я хотел бы посмотреть, как быть более конкретным, о том, какой EditText вы хотите завладеть. (Интересно, что он, кажется, преобразует текстовые поля webview в выбираемые объекты - не думал, что он может это сделать.) –

ответ

2

Я не пробовал это на странице входа в Facebook, но я смог сделать это на другой странице, которую я создал.

Я смог использовать UIObject и UIObject2 для размещения окна ввода в веб-форме с использованием класса EditText. Мне удалось установить текст в поле ввода с помощью setText(), но я не смог его прочитать с помощью getText().

Выбор форм ввода HTML требует некоторой осторожности. Единственный способ, которым вы можете надежно выбрать конкретный вход, - это использовать instance(), чтобы найти n-ое индексированное поле. Это означает, что вы, вероятно, должны ограничивать сферу своих поисков родительским объектом WebView (в противном случае любой другой EditText на экране может компенсировать все).

Еще одна вещь, на которую нужно обратить внимание - это время загрузки WebView. Это не произойдет мгновенно, поэтому вам нужно подождать некоторое разумное количество времени, чтобы загрузить страницу.

Вот немного примеров коды, которые позволяют мне найти второе поле ввода на HTML странице и поместить в него текст:

UiObject input = mDevice.findObject(new UiSelector() 
    .instance(1) 
    .className(EditText.class)); 
input.setText("text");