A suite that passes sequentially can fail the moment you enable parallel execution. Elements disappear mid-tap, one scenario's sendKeys lands on another scenario's screen, and a driver that worked a second ago throws NullPointerException. Rerun the failures alone and they all pass.
The cause is a single design fact. cucumber-spring builds one Spring ApplicationContext for the entire run. Your DriverManager is a @Component, so it's a singleton — one AppiumDriver, handed to every thread that asks. Your screen objects are singletons too, with their @AndroidFindBy / @iOSXCUITFindBy proxies bound to whatever driver existed when the first scenario built them.
Two threads, one Appium session, interleaved commands.
What the article covers:
⏱️ Why AppiumFieldDecorator's 1-second default stops working once drivers are created per scenario






