android - Seleccionar elemento de AutoCompleteTextView en uiautomator
automation android-uiautomator (4)
Estoy creando un proyecto de prueba de automatización en el que tengo problemas para seleccionar el elemento de AutoCompleteTextView.
Puede ver la captura y las vistas [todas expandidas] que tiene. El menú desplegable de AutoCompleteTextView no aparece en el árbol de vista ni puedo seleccionarlo con el mouse.
He intentado a continuación enfoques para seleccionar el formulario del artículo del adaptador AutoCompleteTextView:
UiScrollable locationList = new UiScrollable(new UiSelector().scrollable(true)); locationList.scrollTextIntoView(location);
UiScrollable locationList = new UiScrollable(locationEditText.getSelector()); locationList.scrollTextIntoView(location);
Aquí LocationEditText es mi AutoCompleteTextViewUiObject selectedLocation = locationList.getChild(new UiSelector().text(location)); selectedLocation.click();
desde LocationList no selecciona el elemento con la cadena pasada.editLocationResId = "android:id/text1"; UiObject selectedLocation = new UiObject(new UiSelector().resourceId(editLocationResId)); selectedLocation.click();
La identificación de la vista de texto de adpter tampoco funciona.
¿Alguien puede ayudarme a seleccionar el elemento de AutoCompleteTextView en uiautomator ? O cuanto más enfoques obtengan el deseo de salida.
prueba el siguiente código funcionó para mí.
Estoy usando el AutoCompleteText para completar automáticamente la ubicación donde el usuario se encuentra actualmente, el locationList no es más que una matriz que escribí en el archivo strings.xml, así que use aquí su propia matriz de cadenas.
locationList = res.getStringArray(R.array.ticketLocation);
ArrayAdapter<String> locationAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, locationList);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.txtCountries);
textView.setThreshold(1);
textView.setAdapter(locationAdapter);
textView.setValidator(new Validator());
textView.setOnFocusChangeListener(new FocusListener());
textView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
TextView ticketLocation = (TextView) view;
getTicketLocation = ticketLocation.getText().toString();
}
});
y debajo está el código para validar la entrada de texto en el campo de ubicación, el método fixText () evita que el usuario escriba texto que no existe en su matriz de cadenas, por ejemplo: si el usuario escribe "alemania" que no existe en su lista de matriz de cadenas, será reemplazada por "", que es una cadena vacía dentro de su campo de entrada de texto de edición
class Validator implements AutoCompleteTextView.Validator {
@Override
public boolean isValid(CharSequence text) {
// Log.v("Test", "Checking if valid: " + text);
Arrays.sort(locationList);
if (Arrays.binarySearch(locationList, text.toString()) > 0) {
return true;
}
return false;
}
@Override
public CharSequence fixText(CharSequence invalidText) {
// Log.v("Test", "Returning fixed text");
/*
* I''m just returning an empty string here, so the field will be
* blanked, but you could put any kind of action here, like popping
* up a dialog?
*
* Whatever value you return here must be in the list of valid
* words.
*/
return "";
}
}
class FocusListener implements View.OnFocusChangeListener {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// Log.v("Test", "Focus changed");
if (v.getId() == R.id.txtCountries && !hasFocus) {
// Log.v("Test", "Performing validation");
((AutoCompleteTextView) v).performValidation();
}
}
}
Obtener los cordinates del campo de texto:
int x = element.getLocation().getX();
int y = elmement.getLocation().getY();
Agregue valores para obtener los cordinates correctos.
x = x+x1
y = y+y1
Use la función de toque para hacer clic en él.
TouchAction action = new TouchAction (controlador);
action.tap (x, y) .perform ();
primero abra la lista de retiros, luego intente usar UiDevice.pressKey (), para enviar un evento DPAD_DOWN OR UP y presione Enter para seleccionar el ítem que desea.
Si necesita presionar el primer elemento de la lista desplegable, he encontrado una solución útil:
public void selectFirstElement() {
TouchAction touchAction = new TouchAction(getAppiumDriver());
int xTapped = autoCompleteTextView.getLocation().getX() + autoCompleteTextView.getSize().getWidth() / 2;
int yTapped = autoCompleteTextView.getLocation().getY() + autoCompleteTextView.getSize().getHeight() ;
touchAction.tap(xTapped, yTapped).perform(); }
Dado que AutoCompleteTextView se declaró como autoCompleteTextView, puede obtener la ubicación actual en la pantalla y calcular el elemento que se ubicará debajo. ¡Espero eso ayude!