How to best use Cucumber's retry logic on appium w/o getting errors?
WebdriverIO Version
"@wdio/appium-service": "8.15.0"
"@wdio/cli": "8.15.0"
"@wdio/cucumber-framework": "8.15.0"
"@wdio/local-runner": "8.15.0"
Node.js Version: 18.16.1
Mode: Wdio Test Runner
Which capabilities are you using?
capabilities: [{
platformName: 'Android',
browserName: 'chrome',
'appium:deviceName': 'R58M7123XXX', // emulator: emulator-5554, real: R58M7123XXX, studio: Pixel_3a_API_34_extension_level_7_arm64-v8a
'appium:platformVersion': '11', // emulator: 10, real: 11, studio: 14
'appium:automationName': 'UiAutomator2',
'appium:orientation': 'PORTRAIT',
'appium:newCommandTimeout': 240,
}]
What happened?
When running multiple scenarios in one feature file and using Cucumber's retry logic the session will be deleted after the last test run - failed or passed.
Hence, the re-run or any other commands after that will cause the error message: "ERROR webdriver: Request failed with status 404 due to A session is either terminated or not started".
This will cause an issue on any cloud provider setup like Browserstack or SauceLabs as the device is already disconnected after the command "deleteSession()".
Relevant log output
INFO @wdio/local-runner: Run worker command: run
DEBUG @wdio/runner: init remote session
DEBUG @wdio/utils:initialiseServices: initialise service "appium" as NPM package
DEBUG @wdio/runner: init remote session
INFO webdriver: Initiate new session using the WebDriver protocol
INFO @wdio/utils: Connecting to existing driver at localhost:4723/
INFO webdriver: [POST] localhost:4723/session
INFO webdriver: DATA {
capabilities: {
alwaysMatch: {
platformName: 'Android',
browserName: 'Chrome',
'appium:deviceName': 'R58M7193KHH',
'appium:platformVersion': '11',
'appium:automationName': 'UiAutomator2',
'appium:orientation': 'PORTRAIT',
'appium:newCommandTimeout': 240
},
firstMatch: [ {} ]
},
desiredCapabilities: {
platformName: 'Android',
browserName: 'Chrome',
'appium:deviceName': 'R58M7193KHH',
'appium:platformVersion': '11',
'appium:automationName': 'UiAutomator2',
'appium:orientation': 'PORTRAIT',
'appium:newCommandTimeout': 240
}
}
DEBUG @wdio/utils:shim: Finished to run "beforeScenario" hook in 0ms
DEBUG @wdio/utils:shim: Finished to run "beforeStep" hook in 0ms
INFO webdriver: COMMAND navigateTo("url.domain")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/url
INFO webdriver: DATA { url: 'url.domain' }
INFO webdriver: RESULT null
DEBUG @wdio/utils:shim: Finished to run "beforeStep" hook in 0ms
INFO webdriver: COMMAND findElement("css selector", "*[data-test="login-button"]")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/element
INFO webdriver: DATA { using: 'css selector', value: '*[data-test="login-button"]' }
[...]
INFO webdriver: COMMAND findElements("css selector", ".title")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '.title' }
INFO webdriver: RESULT {
ELEMENT: '78FF30F4BA2AA2D0713CED058AE1EE7A_element_496',
'element-6066-11e4-a52e-4f735466cecf': '78FF30F4BA2AA2D0713CED058AE1EE7A_element_496'
}
INFO webdriver: COMMAND findElement("css selector", "*[data-test="checkout"]")
INFO webdriver: COMMAND getElementText("78FF30F4BA2AA2D0713CED058AE1EE7A_element_496")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/element
INFO webdriver: DATA { using: 'css selector', value: '*[data-test="checkout"]' }
INFO webdriver: [GET] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/element/78FF30F4BA2AA2D0713CED058AE1EE7A_element_496/text
INFO webdriver: RESULT []
INFO webdriver: RESULT {
error: 'no such element',
message: 'no such element: Unable to locate element: {"method":"css selector","selector":"*[data-test="checkout"]"}\n' +
' (Session info: chrome=115.0.5790.166)',
stacktrace: '0 chromedriver-mac-arm64_v115.0.5790. 0x0000000100ed2a6c chromedriver-mac-arm64_v115.0.5790. + 4303468\n' +
'1 chromedriver-mac-arm64_v115.0.5790. 0x0000000100ecb198 chromedriver-mac-arm64_v115.0.5790. + 4272536\n' +
'2 chromedriver-mac-arm64_v115.0.5790. 0x0000000100aff594 chromedriver-mac-arm64_v115.0.5790. + 292244\n' +
'3 chromedriver-mac-arm64_v115.0.5790. 0x0000000100b3c8fc chromedriver-mac-arm64_v115.0.5790. + 542972\n' +
'4 chromedriver-mac-arm64_v115.0.5790. 0x0000000100b75628 chromedriver-mac-arm64_v115.0.5790. + 775720\n' +
'5 chromedriver-mac-arm64_v115.0.5790. 0x0000000100b30b40 chromedriver-mac-arm64_v115.0.5790. + 494400\n' +
'6 chromedriver-mac-arm64_v115.0.5790. 0x0000000100b31988 chromedriver-mac-arm64_v115.0.5790. + 498056\n' +
'7 chromedriver-mac-arm64_v115.0.5790. 0x0000000100e93924 chromedriver-mac-arm64_v115.0.5790. + 4045092\n' +
'8 chromedriver-mac-arm64_v115.0.5790. 0x0000000100e97e68 chromedriver-mac-arm64_v115.0.5790. + 4062824\n' +
'9 chromedriver-mac-arm64_v115.0.5790. 0x0000000100e9e088 chromedriver-mac-arm64_v115.0.5790. + 4087944\n' +
'10 chromedriver-mac-arm64_v115.0.5790. 0x0000000100e9896c chromedriver-mac-arm64_v115.0.5790. + 4065644\n' +
'11 chromedriver-mac-arm64_v115.0.5790. 0x0000000100e70e64 chromedriver-mac-arm64_v115.0.5790. + 3903076\n' +
'12 chromedriver-mac-arm64_v115.0.5790. 0x0000000100eb455c chromedriver-mac-arm64_v115.0.5790. + 4179292\n' +
'13 chromedriver-mac-arm64_v115.0.5790. 0x0000000100eb46b4 chromedriver-mac-arm64_v115.0.5790. + 4179636\n' +
'14 chromedriver-mac-arm64_v115.0.5790. 0x0000000100ec4978 chromedriver-mac-arm64_v115.0.5790. + 4245880\n' +
'15 libsystem_pthread.dylib 0x000000019b66ffa8 _pthread_start + 148\n' +
'16 libsystem_pthread.dylib 0x000000019b66ada0 thread_start + 8\n'
}
INFO webdriver: COMMAND findElements("css selector", ".cart_list")
DEBUG webdriverio: command getText was called on an element ("*[data-test="checkout"]") that wasn't found, waiting for it...
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '.cart_list' }
INFO webdriver: COMMAND findElements("css selector", "*[data-test="checkout"]")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '*[data-test="checkout"]' }
INFO webdriver: RESULT Remove
INFO webdriver: RESULT []
INFO webdriver: COMMAND findElements("css selector", ".cart_list")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '.cart_list' }
INFO webdriver: COMMAND getLogTypes()
INFO webdriver: [GET] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/log/types
INFO webdriver: RESULT []
INFO webdriver: RESULT []
DEBUG webdriver: request failed due to response error: unknown command
WARN webdriver: Request failed with status 404 due to unknown command: Cannot call non W3C standard command while in W3C mode
INFO webdriver: Retrying 1/1
INFO webdriver: [GET] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/log/types
DEBUG webdriver: request failed due to response error: unknown command
ERROR webdriver: Request failed with status 404 due to unknown command: unknown command: Cannot call non W3C standard command while in W3C mode
INFO webdriver: COMMAND deleteSession()
INFO webdriver: [DELETE] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107
INFO webdriver: COMMAND findElements("css selector", ".title")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '.title' }
DEBUG webdriver: request failed due to response error: invalid session id
2023-08-15T10:24:00.041Z WARN webdriver: Request failed with status 404 due to A session is either terminated or not started
INFO webdriver: Retrying 1/1
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '.title' }
DEBUG webdriver: request failed due to response error: invalid session id
ERROR webdriver: Request failed with status 404 due to invalid session id: A session is either terminated or not started
INFO webdriver: COMMAND findElements("css selector", "*[data-test="checkout"]")
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '*[data-test="checkout"]' }
DEBUG webdriver: request failed due to response error: invalid session id
WARN webdriver: Request failed with status 404 due to A session is either terminated or not started
INFO webdriver: Retrying 1/1
INFO webdriver: [POST] localhost:4723/session/3b5e45f0-f308-4201-9772-8390cdcbf107/elements
INFO webdriver: DATA { using: 'css selector', value: '*[data-test="checkout"]' }
DEBUG webdriver: request failed due to response error: invalid session id
ERROR webdriver: Request failed with status 404 due to invalid session id: A session is either terminated or not started
INFO webdriver: RESULT null
INFO webdriver: COMMAND findElements("css selector", ".title")
What is your expected behavior?
Cucumber's retry logic will work with multiple scenarios in one feature file on a failed test re-run.
GitHub Repo: https://github.com/vaidasian/webdriverio-appium-cucumber
GitHub Issue: https://github.com/webdriverio/webdriverio/issues/10963