如何使用Appium Java将android滚动视图中的web元素名添加到ArrayList中?

问题描述:

我有一个android中的滚动视图内的元素列表。我需要将所有元素名称添加到ArrayList中。我尝试过很多种滚动方式,而且没有一种能满足我的要求。请帮我实现这一点。如何使用Appium Java将android滚动视图中的web元素名添加到ArrayList中?

这是元素列表的类名:android.support.v7.widget.RecyclerView 这是各元素的id:com.testapp.poker:id/recyclerViewCards

List <String> elementNameList = new ArrayList(); 

    public void getWebElementsNameList(String classNameOfElementList, String elementId){ 
      System.out.println("Items found:"); 
      Gauge.writeMessage("Items found:"); 
      int i = 1; 
      for(WebElement element : getWebElements(classNameOfElementList, elementId)) { 
       System.out.println(i + ") " + element.getText()); 
       Gauge.writeMessage(i + ") " + element.getText()); 
       elementNameList.add(element.getText()); 
       i++; 
      } 
     } 

上面的代码将只抓住这些都对当前视图中可见的元素。我需要一些帮助来修改滚动逻辑。

+0

你真正需要的所有元素是列表或者你希望做点别的?也许点击其中之一? –

这是预期的行为。 UIAutomator可以返回可见的元​​素。与硒不同,appium(UiAutomator)无法看到屏幕上不可见的元素。

解决您的问题是: 获取可见元素并将它们添加到数组列表,然后滚动到下一个元素并添加到数组列表,直到列表结束。

你可以尝试这样的事情

List <String> elementNameList = new ArrayList(); 

public void getWebElementsNameList(String classNameOfElementList, String elementId){ 
    nameStart = ""; 
    System.out.println("Items found:"); 
    Gauge.writeMessage("Items found:"); 
    int i = 1; 
    while(true){  
     for(WebElement element : getWebElements(classNameOfElementList, elementId)) { 
      System.out.println(i + ") " + element.getText()); 
      Gauge.writeMessage(i + ") " + element.getText()); 
      elementNameList.add(element.getText()); 
      i++; 
     } 
     if (!keepSwipping()) { 
     break; 
     } 
    } 
} 

private static String nameStart = ""; 

private boolean keepSwipping() { 
    if (isElementPresent(By.xpath(FIRST_ELEMENT_XPATH)) && isElementPresent(By.xpath(LAST_ELEMENT_XPATH))) { 
     AndroidElement firstElement = (AndroidElement) driver.findElementByXPath(FIRST_ELEMENT_XPATH); 
     AndroidElement lastElement= (AndroidElement) driver.findElementByXPath(LAST_ELEMENT_XPATH); 
     if (nameStart.equals(firstElement.getText())) { 
      return false; 
     } else { 
      nameStart = firstElement.getText(); 
      swipe(lastElement.getLocation().x, lastElement.getLocation().y, firstElement.getLocation().x, 
        firstElement.getLocation().y, 2000); 
     } 
     return true; 
    } 
    return false; 
}