Giter VIP home page Giter VIP logo

Comments (4)

RuslanMingaliev avatar RuslanMingaliev commented on August 24, 2024

@matzuk @eakurnikov Давайте обсудим

from kaspresso.

matzuk avatar matzuk commented on August 24, 2024

@RuslanMingaliev предлагаю еще раз обсудить

from kaspresso.

RuslanMingaliev avatar RuslanMingaliev commented on August 24, 2024

@almaz010891, привет!

Выделил из issue две проблемы и предложения их решения:

  1. Нет механизма, который бы позволил дождаться момента, когда кнопка появится в иерархии и выполнить с ней какое-либо действие
  2. Нет механизма, который бы позволил дождаться определенного состояния кнопки и выполнить с ней действие.

Обе проблемы можно решить, используя механизм flakySafely. Например,

@Test
fun sample() = run {
    MainActivityScreen {
        flakySafely(timeoutMs = 60_000, intervalMs = 500, allowedExceptions(...)) {
            moreBtn {
                isVisible()
                isEnabled()
                click()
                withText(...)
            }
        }
    }
}

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

Таким образом, в примере, который я привел выше, будет пытаться выполниться проверка на видимость кнопки, затем на её доступность (enabled), и когда оба условия выполнятся, произойдет клик на кнопку и проверка withText(). То есть этот код идентичен примеру из issue. withText можно вынести в отдельный блок flakySafely, если не нужно при фейле заново проверять на видимость, доступность и делать клик. Ну и если нужного исключения нет в списке стандартных исключений (a ViewNotFoundException там нет), то надо его добавить в allowedExceptions.

Если не очень удобно делать такую проверку в тесте, и надо унести в Screen, в котором нет BaseTestContext, то можно сделать так:

object MainActivityScreen {
    val moreBtn = KButton { withId(R.id.btn_more) }

    fun BaseTestContext.waitForButtonVisibleState(timeoutMs: Long) {
        flakySafely(timeoutMs = timeoutMs) {
            moreBtn.isVisible()
        } 
    }
} 

Ну и вызывать в тесте таким образом:

@Test
fun sample() = run {
    MainActivityScreen {
        waitForButtonVisibleState(timeoutMs = 5_000) 
        moreBtn.click()
    }
}

Согласен, что по названию метода flakySafely может быть не очевидно, как он на самом деле работает. @almaz010891, @matzuk, предлагайте названия, можем переименовать, а flakySafely оставить для обратной совместимости и сделать deprecated

from kaspresso.

RuslanMingaliev avatar RuslanMingaliev commented on August 24, 2024

Пока закрываю issue. @almaz010891 переоткрой, если ещё остались вопросы, обсудим. Можно даже созвониться.

from kaspresso.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.