在uiautomator中从AutoCompleteTextView中select项目

AutoCompleteTextView适配器问题选择项目

我正在创build一个自动化testing项目,我有问题从AutoCompleteTextView中select项目。

你可以看到它的快照和视图[全部展开]。 AutoCompleteTextView的下拉列表不会出现在视图树中,也不能用鼠标select。

我已经尝试了下面的方法从AutoCompleteTextView适配器中select项目窗体:

  1. UiScrollable locationList = new UiScrollable(new UiSelector().scrollable(true)); locationList.scrollTextIntoView(location);

  2. UiScrollable locationList = new UiScrollable(locationEditText.getSelector()); locationList.scrollTextIntoView(location); 这里locationEditText是我的AutoCompleteTextView

  3. UiObject selectedLocation = locationList.getChild(new UiSelector().text(location)); selectedLocation.click(); 从locationList它不会select传递string的项目。

  4. editLocationResId = "android:id/text1"; UiObject selectedLocation = new UiObject(new UiSelector().resourceId(editLocationResId)); selectedLocation.click(); 来自adder textview的id也不起作用。

任何人都可以帮助我从UIAutomator的AutoCompleteTextView中select项目? 或者更多的方法获得欲望的输出。

Solutions Collecting From Web of "在uiautomator中从AutoCompleteTextView中select项目"

尝试下面的代码为我工作。

我正在使用AutoCompleteText来自动完成用户当前所在的位置,locationList不过是我在strings.xml文件中编写的数组,所以在这里使用您自己的string数组。

  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(); } }); 

下面是在位置字段中validation文本input的代码,fixText()方法可以防止用户inputstring数组中不存在的文本,例如:如果用户键入的“germany”不存在于你的string数组列表,它将被replace为你的edittextinput字段中的空string“”

  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(); } } } 

获取文本字段的坐标:

 int x = element.getLocation().getX(); int y = elmement.getLocation().getY(); 

添加值来获得正确的坐标。

 x = x+x1 y = y+y1 

使用点击function点击它。

TouchAction action = new TouchAction(driver);

action.tap(X,Y).perform();

首先打开拾取列表,然后尝试使用UiDevice.pressKey()发送DPAD_DOWN或UP事件,然后按Enter键select所需的项目。

如果您需要按下下拉列表中的第一个元素,我find了一个有用的解决方法:

 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(); } 

给定一个声明为autoCompleteTextView的AutoCompleteTextView,你可以得到屏幕上的当前位置,并计算将要位于它下面的项目。 希望能帮助到你!