Кликать по элементу если он появился/если нет,то выполнять тест дальше

Добрый день,я начинающий автоматизатор.Столкнулся со следующей задачей -
Java+Appium+Android
Есть приложение,в этом приложении при логине,может рандомно выскакивать окно с оповещением при котором нужно только нажать “ОК”.
Проблема состоит в том,что это окно может как появляться так и не появляться.Соотвественно когда оно не появляется тест проходит успешно,в противном случае,валится.Каким образом можно сделать примерно следующее

  • Проверяем появилось ли окно с оповещением -> если появилось клацаем ОК и выполняем код дальше/если не появилось просто выполняем код дальше

Код который работает для нажатия на клавишу,но дальнейший тест код в тесте все равно не выполняется,а если же оповещение не всплывает то тест валится уже на этом коде,так как не может обнаружить кнопку

Извините у меня не получилось вставить код

попробовать блок try catch.

try {
        element = driver.findElement(identifier);

    } catch (org.openqa.selenium.NoSuchElementException e)  {
        System.out.println(e);
    }


Напишите метод который будет возвращать true или false в зависимости от того найден элемент или нет через try catch
Ну и будет код выглядеть где то так

if(ElementExist(любой локатор который относится к попапу)){ 
driver.FindElement(Кнопка ок).Click();
 }

Решил таким способом

       boolean isPresent = androidDriver.findElementsById("android:id/button2").size() > 0;
        if (isPresent) {
            MobileElement message1 = (MobileElement) androidDriver.findElementById("android:id/button2");
            message1.click();
            System.out.println("clicked");
            {
            }
        }

        List<MobileElement> elementsById = androidDriver.findElementsById("ххх/rv_city_name");
        for (MobileElement element : elementsById) {
            if (element.getText().equals("Киев")) {
                element.click();
            }
        }
    }
}

теперь проблема в том что после того как просиходит нажатие на кнопку ОК,аппиум не может обнаружить других кнопок на экране.Вторая часть кода рабочая на 100%,сложилось впечатление что он пытается искать это на экране там где выскакивает месседж по которому мы кликаем.
Возможно стоит добавить ожидание в пару секунд?

Как вариант - поставить ожидание на то, что элемент не виден. Или ожидать следующий элемент, прежде чем взаимодействовать с ним.

могли бы вы написать пару строк кода,с этими вариантами?

Не скажу точно, как это с Аппиумом, но в обычном Селениуме похоже на такое:

public boolean isElementNotPresent() {
try {
WebDriverWait wait = new WebDriverWait(driver, 20, 500);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id(“progress_bar”)));
return false;
} catch (NoSuchElementException e) {
return true;
}

Взято отсюда

1 лайк

Благодарю

А то что у Вас сломано приложение в котором временами пропадает доступ к одному из внешних сервисов Вас не смущает? Я бы на Вашем месте “замокал” внешнюю зависимость которая не нужна Вам при тестировании одного из Ваших сценариев (если этот сервис действительно не влияет на Вашу функциональность). Appium Pro: Making Your Appium Tests Fast and Reliable, Part 8: Mocking External Services
Просто предложения использовать условия в тестах являются одним из анти-паттернов тестирования и стоит сразу привыкать писать тесты без них, иначе научитесь делать эти костыли-велосипеды при каждом удобном случае и будет потом тяжело отказатся от применения такого подхода. И нужно помнить что никакого рандома в коде приложения и тестов быть никогда не должно.

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

1 лайк

проблема была решена обновлением аппиума до последней версии .Сам код

boolean isPresent = androidDriver.findElementsById("android:id/button2").size() > 0;
        if (isPresent) {
            MobileElement message1 = (MobileElement) androidDriver.findElementById("android:id/button2");
            message1.click();
            System.out.println("Извините,сервис не доступен : ОК");
        }

Очень сомневаюсь что потребность бизнеса в том чтобы получить поломаный функционал с костылем который игнорирует эту поломку. И такие ответы отом что я так сделал ибо бизнес требует автотесты уже на вчера, я тоже слышу каждый день. В этом и есть разница между кодером автотестов и QA инженером, одному нужно сдать кучу говнотестов заказчику, а другому поставить качественно работающий функционал.

о эти реляции и песнопения
ваша задача как инженера тестирования сказать, насколько вы уверены в том, что что-то работает и оценить риски, не более того. решать быть релизу или нет, в большинстве случаев, не вам.
Если вы работаете в компании и на том проекте, где у вас есть право заблокировать релиз, то это реально очень круто. но когда на релизную политику завязаны премии (очень большие) серьезных дядь, ваше стремление поставить качественно работающий функционал не завтра, а через месяц, воспринято будет как минимум негативно

3 лайка

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