Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

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

java
appium
android
Теги: #<Tag:0x00007fedb9343fb0> #<Tag:0x00007fedb9343e20> #<Tag:0x00007fedb9343ce0>

(Vitekes) #1

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

У меня возникла неприятная ситуация
После перехода на хранение локаторов базе данных, мне пришлось во многих местах использовать методы 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);
}

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

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


(Taras) #2

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


(Сергей Кузьмин) #3

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

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

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


(Taras) #4

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