#  2nd April 2025 — Walks Manager Upload Updated and Improved
## [Build #132](https://github.com/nbarrett/ngx-ramblers/runs/39828280734)
The bulk of the work in this release was to upgrade the version of [Serenity/JS](https://serenity-js.org) that is used to execute the automated upload of walks to [Walks Manager](https://walks-manager.ramblers.org.uk). However a number of improvements were made:
- When the upload is completed, [Serenity reports](https://serenity-bdd.github.io/docs/reporting/the_serenity_reports) are generated and are available  by clicking the **Walk upload audit** tab of the [Walks > Admin > Export page](https://ngx-ramblers.org.uk/walks/admin/export), and clicking the **Last Import Report** button.  See screenshot below for where this is located. Viewing this report is useful to help diagnose problems that might happen if the process does not complete successfully as screenshots are captured at the point a failure happens. An example of such a report [can be seen here](https://www.ekwg.co.uk/reports/target/site/serenity/bd4c46a1304f644a922c977059abf463a88fca1e8560afe6528bbcdcc6216b25.html).
- When the walk upload is initiated, if you visit the **Walk upload audit** tab, the new upload session is displayed in the **Upload** select field, however it appears with an animated "busy" icon as follows:

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/b518fcea-2aa8-4a89-ae04-4adef99110c7.jpg)

- When the walks upload is complete, the upload session is automatically updated and a summarised list of steps are displayed in the audit table:

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/68845aaa-821e-4729-9841-fb31d9d37e2c.jpg)

### Technical changes made
- Migrated serenity framework and scenarios from 2.14.0 to 3.31.12
- Upgraded mocha from 8.0.1 to 10.0.10
- Added support for webdriverio 9.12.0 but kept protractor for comparison
- Allowing selection based on process.env.WEBDRIVER_FRAMEWORK="wdio" with protractor as default
- Upgraded typescript from 4.9.5 to 5.7.3
- Moved serenity source files underneath lib directory and refactored camelCase names to be kebab-case
- Removed .upTo(Duration.ofSeconds() from all tasks and now timeouts are controlled globally in the configs
- ErrorAlertIsDisplayedOrSuccessAlertHasMessage question created which catches errors unexpectedly found in Ensure.eventually()
- TODO: Intended to use Ensure.eventually(WalksPageElements.progressIndicator, not(isVisible()))) but this fails with element not found, so instead used custom question Wait.until(TextThatMightNotYetBeThere.of(WalksPageElements.successAlert), includes(message)))
- Changed walk export component to use Websockets to receive updates. This saves polling the server for full audit refreshes when it might be busy spinning up a chrome node process