Как проверить в Java отсутствие на экране Android'a определенной кнопки?

Как проверить в Java отсутствие на экране Android’a определенной кнопки?

Наличие кнопки я проверяю с помощью:

assertTrue(solo.getView(“button1”).isEnabled());

А как мне проверить, что button2 отсутствует на экране? Если я пишу код

assertFalse(solo.getView(“button2”).isEnabled());

то в лог падает ошибка на данную строчку:

junit.framework.AssertionFailedError: View with id: ‘button2’ is not found!

isDisplayed ?

Если я пишу:

assertFalse(solo.getView(“button2”).isDisplayed());

то, IDEA выделяет isDisplayed красным с комментарием “Cannot resolve method isDisplayed()”. Что я делаю не правильно?

я Фукидит использую…

но может пригодится:

package Mobile;

import net.thucydides.core.pages.PageObject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

public class SearchForm extends PageObject
{
    private static final Integer CATALOG_WAIT_FOR_TIMEOUT = 20000;

    public SearchForm(WebDriver driver) {
        super(driver, CATALOG_WAIT_FOR_TIMEOUT);
    }

    @FindBy(css = "div.Reservation-information > button.ButtonLink")
    private WebElement cancelBooking;

    public void setCancelBooking()
    {
        $(cancelBooking).click();
    }

    @FindBy(name = "country")
    private WebElement selectCountry;

    public void setSelectCountry(String country) throws InterruptedException {
        $(selectCountry).click();
        $(selectCountry).selectByVisibleText(country);
        $(selectCountry).isDisplayed();
    }
}

Заметил тенденцию однотипных вопросов, ответ на которые можно легко найти на офф сайте, не имея опыта работы с mobile автоматизацией. Не является исключением и текущий вопрос.

1 лайк

Вариант с getVisibility() я пробовал и он не помог.
Однако решение было найдено следующее:

создать вспомогательный метод

public boolean viewExist(){
    try{
        solo.getView("button2");
        return true;
    }catch(AssertionError e){
        return false;
    }
}

и добавить в тест ссылку на данный метод (проверяем отсутствие кнопки):

    assertFalse(viewExist());

А что интересно возвращает getVisibility() в таком случае?

На конструкцию

assertFalse(solo.getView(“button2”).getVisibility());

IDEA ругается, что

assertFalse (boolean) is Assert cannot be applied to (int)

Если вы знаете как решить данную задачу с помощью getVisibility(), то прошу поделитесь.

Из выше приведенной ссылки:

public int getVisibility()

Из вашего лога:

Вас не смущает тот факт, что метод возвращает int, а assert ваш проверяет на boolean?
Опять-таки, возвращаясь к выше приведенному источнику:

Returns the visibility status for this view.

Related XML Attributes
android:visibility
Returns
One of VISIBLE, INVISIBLE, or GONE.

Смотрим дальше:

android:visibility

Controls the initial visibility of the view.

Must be one of the following constant values.

Constant Value Description
visible 0 Visible on screen; the default value.
invisible 1 Not displayed, but taken into account during layout (space is left for it).
gone 2 Completely hidden, as if the view had not been added.

Собственно вопрос был следующий: что возвращает вам getVisibility()? Если элемента вообще нет, то по идее должно вернуть int код GONE.

Собственно ответ: в лог падает ошибка:

View with id: ‘button2’ is not found!

Т.е. solo.getView(id) банально бросает эксепшен, если элемент не найден? Ну в таком случае, наиболее простым вариантом конечно будет обернуть в try / catch, как вы и сделали. Единственное, зачем вы ловите AssertionError? Неужели он именно его плюет?
Я бы все же еще поискал вариант проверки, существует ли элемент, в родных API Robotium’а. Наверняка что-то найдете.

Вы уверены, что у кнопки id ‘button2’ ?

Да, уверен.

Объект с id существует в момент проверки? Если Вам нужно проверить что объекта не существует, то я бы делал это так:
assertNull(solo.getView(id));
где id - это id вашего объекта, например id.button2

Нет, не существует. Задача как раз состояла в том чтобы проверить отсутствие объекта.
Данную задачу удалось решить, как я писал выше.

вы только что описали assertNull :wink: