t.me/atinfo_chat Telegram группа по автоматизации тестирования

Нестабильный и медленный поиск элементов используя findElement(s) на android-устройстве

Теги: #<Tag:0x00007f9afa5f7390> #<Tag:0x00007f9afa5f6f80> #<Tag:0x00007f9afa5f6e68>

Всем доброго дня.

У меня возникла неприятная ситуация
После перехода на хранение локаторов базе данных, мне пришлось во многих местах использовать методы findElement и findElements.
Всё это имеет вид наподобие:

if (!elementPath.equals("")){
    List elementFound = driverCommands.findElements(By.xpath(elementPath));
        if (elementFound.size() == 0){
            return null;
        }
        return (AndroidElement) elementFound.get(0);
}

и

driverCommands.findElement(By.xpath(elementPath));

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

try {
    Thread.sleep(4000);
} catch (InterruptedException e) {
     e.printStackTrace();
}
if (!elementPath.equals("")){
    List elementFound = driverCommands.findElements(By.xpath((elementPath));
        if (elementFound.size() == 0){
            return null;
        }
        return (AndroidElement) elementFound.get(0);
}

Сама проблема, как я предполагаю, берёт свои корни из того что дерево элементов на андроиде строится весьма небыстро.

Хочу спросить сталкивался кто-нибудь с таким и как решал подобную проблему.

во первих if (!elementPath.equals("")) так не пишет никто - elementPath.isEmpty() , тоже самое elementFound.size() == 0 на elementFound.isEmpty();
добавить ExpectedCondition.presenceOfAllElementsLocatedBy(elementPath) можно вместо Thread.sleep

По крайней мере в Selenium ExpectedConditions позволял возвращать WebElement из Wait напр:

WebElement element = wait.until(ExpectedConditions.visibilityOf(driver
		.findElement(By.cssSelector("img[src *= 'post_an_article.png']"))));

не пробовали ? Или это плохой стиль ?

я б ето в Optional.ofNullable() тогда заврапил, а то там если не найдет null будет