Получение списка объектов ChildObjects - Appium

Мне трудно получить дочерние объекты списка. Таким образом, в нем есть несколько объектов, видимых и еще не видимых. Когда я спрашиваю размер, он возвращает 5 (те 5 являются видимыми). Я попытался прокрутить представление списка от нижнего элемента к верхнему элементу и сохранить эти элементы, но затем я столкнулся с проблемой, что элементы из других частей в представлении списка распознаются. Другой метод, который я попробовал, это прокрутить последний элемент немного вверх, пока новый элемент не станет видимым. Но здесь я сталкиваюсь с проблемой, что при прокрутке элемента распознается целый текст других элементов.

Код для первого метода: в этом коде я беру listviews childObjects, перебираю их и сохраняю все текстовые поля. Когда я делаю это, некоторые текстовые поля других элементов смешиваются, что делает его непригодным для использования.

List AccountList;

ArrayList<String> AccountArray = new ArrayList<String>();
String tempAccountInfo = "";
String AccountType="";
String LastItem = "";
String NewLastItem = "N/A";
List<WebElement> AccountListItems;

AccountList = driver.findElements(getObject("ElementsWithinAccountListView"));
AccountListItems = AccountList.get(AccountList.size() - 1).findElements(By.className("android.widget.TextView"));

while (!NewLastItem.equals(LastItem)) {
    for (int i=0; i<AccountList.size();i++){
        AccountList = driver.findElements(getObject("ElementsWithinAccountListView"));
        AccountListItems = AccountList.get(i).findElements(By.className("android.widget.TextView"));
        switch (AccountList.get(i).getAttribute("className")){
            case "android.widget.LinearLayout":

                    if (!AccountListItems.get(0).getText().contains("New ")){
                        switch(AccountListItems.get(0).getText()){
                        case "Current accounts":
                            AccountType = "Current accounts";
                            break;
                        case "Savings accounts":
                            AccountType = "Saving accounts";
                            break;
                        case "Investments":
                            AccountType = "Investments";
                            break;
                        case "Credit cards":
                            AccountType = "Credit cards";
                            break;
                        case "Other":
                            AccountType = "Other";
                            break;
                        }
                    }

                break;
            case "android.widget.RelativeLayout":
                AccountListItems = AccountList.get(i).findElements(By.className("android.widget.TextView"));
                if (AccountListItems.size() == 5 || AccountListItems.size() == 4){
                    tempAccountInfo = AccountType;
                    for(int j=0; j<AccountListItems.size(); j++){

                        tempAccountInfo = tempAccountInfo + "|" + AccountListItems.get(j).getText();
                        LastItem = AccountListItems.get(2).getText();

                    }

                    switch(AccountType){
                    case "Investments":
                        if (!(AccountListItems.size() == 5)) { 
                            System.out.println(tempAccountInfo);
                            AccountArray.add(tempAccountInfo);
                        }
                        break;
                    default: 
                        System.out.println(tempAccountInfo);
                        AccountArray.add(tempAccountInfo);
                        break;
                    }
                    tempAccountInfo = "";
                }
                break;
        }
    }

    driver.swipe(AccountList.get(AccountList.size()-1).getLocation().x + 70, AccountList.get(AccountList.size()-1).getLocation().y, AccountList.get(1).getLocation().x + 70, AccountList.get(1).getLocation().y, 3000);
    Thread.sleep(20000);

    AccountListItems = AccountList.get(AccountList.size() - 1).findElements(By.className("android.widget.TextView"));
    try {
        NewLastItem = AccountListItems.get(2).getText();
    } catch (Exception e){
        System.out.println("Not at the end of the listview");
        NewLastItem = "N/A";
    }
    System.out.println("LastItem:" + LastItem);
    System.out.println("NewLastItem:" + NewLastItem);
}

Объекты, просмотренные в Appium

Это код второго метода, который я пробовал:

protected void swipeToNextElement(String Element) throws Exception{

Список AccountList;

String LastItem;
String NewLastItem;
List<WebElement> AccountListItems;
Boolean loop = true;


AccountList = driver.findElements(getObject(Element));
AccountListItems = AccountList.get(AccountList.size()-1).findElements(By.className("android.widget.TextView"));

LastItem = AccountListItems.get(0).getAttribute("text");
NewLastItem = AccountListItems.get(0).getAttribute("text");
driver.swipe(AccountList.get(AccountList.size()-1).getLocation().x + (AccountList.get(AccountList.size()-1).getSize().width / 2), AccountList.get(AccountList.size()-1).getLocation().y, AccountList.get(AccountList.size()-1).getLocation().x + (AccountList.get(AccountList.size()-1).getSize().width / 2), AccountList.get(AccountList.size()-1).getLocation().y - 70, 1000);

while (loop) {


    if (NewLastItem.equals(LastItem)){
        AccountList = driver.findElements(getObject(Element));
        AccountListItems = AccountList.get(AccountList.size()-1).findElements(By.className("android.widget.TextView"));
        driver.swipe(AccountList.get(AccountList.size()-1).getLocation().x + (AccountList.get(AccountList.size()-1).getSize().width / 2), AccountList.get(AccountList.size()-1).getLocation().y, AccountList.get(AccountList.size()-1).getLocation().x + (AccountList.get(AccountList.size()-1).getSize().width / 2), AccountList.get(AccountList.size()-1).getLocation().y - 70, 1000);
        NewLastItem = AccountListItems.get(0).getAttribute("text");
    } else {
        AccountList = driver.findElements(getObject(Element));
        AccountListItems = AccountList.get(AccountList.size()-1).findElements(By.className("android.widget.TextView"));
        driver.swipe(AccountList.get(AccountList.size()-1).getLocation().x + (AccountList.get(AccountList.size()-1).getSize().width / 2), AccountList.get(AccountList.size()-1).getLocation().y, AccountList.get(AccountList.size()-1).getLocation().x + (AccountList.get(AccountList.size()-1).getSize().width / 2), AccountList.get(AccountList.size()-1).getLocation().y + 70, 1000);
        NewLastItem = AccountListItems.get(0).getAttribute("text");
        loop = false;
    }
}

System.out.println("NewLastItem: " + NewLastItem);

}

Любая помощь приветствуется ^^

Заранее спасибо!

1 ответ

Решение

Это больно, когда вы пытаетесь получить предметы из длинного списка на Android. И трудно получить полный список, если некоторые элементы невидимы, и еще сложнее, когда некоторые из них совпадают с Appium. Поэтому я предлагаю не проверять длинный список.

Другие вопросы по тегам