Comments (4)
@matzuk @eakurnikov Давайте обсудим
from kaspresso.
@RuslanMingaliev предлагаю еще раз обсудить
from kaspresso.
@almaz010891, привет!
Выделил из issue две проблемы и предложения их решения:
- Нет механизма, который бы позволил дождаться момента, когда кнопка появится в иерархии и выполнить с ней какое-либо действие
- Нет механизма, который бы позволил дождаться определенного состояния кнопки и выполнить с ней действие.
Обе проблемы можно решить, используя механизм 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.
Пока закрываю issue. @almaz010891 переоткрой, если ещё остались вопросы, обсудим. Можно даже созвониться.
from kaspresso.
Related Issues (20)
- Update Kakao lib version
- Add Leak canary test rule
- Update Kaspresso version in README and Docs HOT 1
- Use single interface in the screenshot tests
- If adbserver receives two commands at the same time it drops the first one
- Allure tests without videos
- New version of adbserver-dekstop.jar doesnt work and requires modern version HOT 1
- How to disable isAndroidSystemDetected when I use allure? HOT 1
- Kaspresso runner doen't hande crashes HOT 1
- Копировать артефакты после завершения теста по таймауту
- Update ui automator
- Can't take screenshot in compose project tests
- Kaspresso rewrite original stack on internal espresso errors HOT 1
- Easy way to toggle multiple interceptors
- Unresolved reference for flakySafely HOT 1
- Migrate to kotlin 2.0.0 and gradle 8.7
- Missed clean FlakySafeSemanticsBehaviorInterceptor when removing flakySafely intrceptors inside FlakySafeInterceptorScalpel
- com.kaspersky.kaspresso.flakysafety.FlakySafetyProviderGlobalImpl#flakySafely() missing try catch statement
- com.kaspersky.kaspresso.flakysafety.scalpel.ScalpelSwitcher work incorrect with nested flakySafely
- Permissions.allowViaDialog() only works for PERMISSIONS.Button.ALLOW
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kaspresso.