Skip to content

Commit 751ddbd

Browse files
Axe Utility Class (#25)
<!-- markdownlint-disable-next-line first-line-heading --> ## Description <!-- Describe your changes in detail. --> This change introduces the ability to execute axe-core accessibility scanning against a page under test. <!-- Why is this change required? What problem does it solve? --> This provides the ability to conduct initial scanning of any pages to determine if any accessibility issues exist. ## Type of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply. --> - [ ] Refactoring (non-breaking change) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would change existing functionality) - [ ] Bug fix (non-breaking change which fixes an issue) ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [ ] I am familiar with the [contributing guidelines](../docs/CONTRIBUTING.md) - [x] I have followed the code style of the project - [x] I have added tests to cover my changes - [x] I have updated the documentation accordingly - [ ] This PR is a result of pair or mob programming --- ## Sensitive Information Declaration To ensure the utmost confidentiality and protect your and others privacy, we kindly ask you to NOT including [PII (Personal Identifiable Information) / PID (Personal Identifiable Data)](https://digital.nhs.uk/data-and-information/keeping-data-safe-and-benefitting-the-public) or any other sensitive data in this PR (Pull Request) and the codebase changes. We will remove any PR that do contain any sensitive information. We really appreciate your cooperation in this matter. - [x] I confirm that neither PII/PID nor sensitive data are included in this PR and the codebase changes.
1 parent 0072e06 commit 751ddbd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+33219
-2361
lines changed

.editorconfig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,11 @@ indent_size = 4
1919

2020
[{Makefile,*.mk,go.mod,go.sum,*.go,.gitmodules}]
2121
indent_style = tab
22+
23+
[{axe.js,axe.min.js}]
24+
charset = unset
25+
end_of_line = unset
26+
insert_final_newline = unset
27+
trim_trailing_whitespace = unset
28+
indent_style = unset
29+
indent_size = unset
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
name: "Check axe-core version"
2+
description: "Checks if our copy of axe-core is up to date"
3+
4+
jobs:
5+
build:
6+
7+
runs-on: ubuntu-latest
8+
9+
steps:
10+
- uses: actions/checkout@v4
11+
- name: Create dependency update branch
12+
run: |
13+
git checkout -b axe-dependency-check
14+
git config --local user.email "[email protected]"
15+
git config --local user.name "GitHub Action"
16+
- name: Install Node.js
17+
uses: actions/setup-node@v4
18+
with:
19+
node-version: 'latest'
20+
- name: Install axe-core in temp dir
21+
run: |
22+
cd utils/resouces
23+
mkdir temp
24+
cd temp
25+
npm install axe-core
26+
- name: Retrieve axe.js file
27+
run: |
28+
cd node_modules/axe-core
29+
mv axe.js ../../../
30+
- name: Remove temp directory
31+
run: |
32+
cd ../../../
33+
rm -rf temp
34+
- name: Stage & commit file
35+
run: |
36+
git stage axe.js
37+
git diff-index --quiet HEAD || (git commit -a -m "axe.js scheduled update" --allow-empty)
38+
- name: Push changes to branch
39+
uses: ad-m/[email protected]
40+
with:
41+
github_token: ${{ secrets.PUSH_TOKEN }}
42+
branch: axe-dependency-check
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name: Run Axe Dependency Check
2+
3+
on: [workflow_dispatch]
4+
5+
jobs:
6+
axe-dependency-check:
7+
name: "Axe Version Check"
8+
timeout-minutes: 10
9+
steps:
10+
- name: "Axe Version Check"
11+
uses: ./.github/actions/check-axe-version

.github/workflows/stage-3-build.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ on:
3030

3131
jobs:
3232
run-tests:
33-
name: "Run Example Tests"
33+
name: "Run Util & Example Tests"
3434
runs-on: ubuntu-latest
3535
timeout-minutes: 3
3636
steps:
@@ -45,6 +45,8 @@ jobs:
4545
pip install -r requirements.txt
4646
- name: Ensure browsers are installed
4747
run: python -m playwright install --with-deps
48+
- name: Run util tests
49+
run: pytest -m "utils" --ignore=tests/
4850
- name: Run example tests
4951
run: pytest
5052
- uses: actions/upload-artifact@v4

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
__pycache__/
1616
.pytest_cache/
1717
test-results/
18+
axe-reports/

.gitleaks.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# This allows for the ignoring of secret scanning against axe-core, as whilst it is in our code base we don't control it
2+
3+
[allowlist]
4+
description = "global allow list"
5+
paths = [
6+
'''(.*?)(axe.js|axe.min.js)'''
7+
]

.gitleaksignore

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,150 @@
11
# SEE: https://github.com/gitleaks/gitleaks/blob/master/README.md#gitleaksignore
22

33
cd9c0efec38c5d63053dd865e5d4e207c0760d91:docs/guides/Perform_static_analysis.md:generic-api-key:37
4+
5+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
6+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
7+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
8+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
9+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
10+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
11+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
12+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
13+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
14+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
15+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
16+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
17+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
18+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
19+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
20+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
21+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
22+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
23+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
24+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
25+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
26+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
27+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
28+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
29+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
30+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
31+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
32+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
33+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
34+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
35+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
36+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
37+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
38+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
39+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
40+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
41+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
42+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
43+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
44+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
45+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
46+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
47+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
48+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
49+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
50+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
51+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
52+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
53+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
54+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
55+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
56+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
57+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
58+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
59+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
60+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
61+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
62+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
63+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
64+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
65+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
66+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
67+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
68+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
69+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
70+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
71+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
72+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
73+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
74+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
75+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
76+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
77+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.min.js:ipv4:12
78+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30726
79+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30726
80+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30745
81+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30776
82+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30785
83+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30799
84+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30814
85+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30839
86+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30839
87+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30849
88+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30859
89+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30874
90+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30888
91+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30901
92+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30915
93+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30925
94+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30940
95+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30954
96+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30969
97+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:30987
98+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31002
99+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31029
100+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31041
101+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31055
102+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31064
103+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31080
104+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31110
105+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31119
106+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31136
107+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31190
108+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31220
109+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31236
110+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31252
111+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31261
112+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31284
113+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31347
114+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31356
115+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31379
116+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31390
117+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31423
118+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31437
119+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31452
120+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31474
121+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31502
122+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31522
123+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31522
124+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31541
125+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31566
126+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31685
127+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31699
128+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31699
129+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31714
130+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31729
131+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31738
132+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31764
133+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31797
134+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31811
135+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31823
136+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31839
137+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31854
138+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31918
139+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31946
140+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31946
141+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31955
142+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31969
143+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:31987
144+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32001
145+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32032
146+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32061
147+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32070
148+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32080
149+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32089
150+
22f37d6142c38c017ed7f378a3661a0a839279b3:utils/resources/axe.js:ipv4:32103

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ NOTE: This project is currently under initial development so isn't finalised, bu
1616
- [Prerequisites](#prerequisites)
1717
- [Configuration](#configuration)
1818
- [Getting Started](#getting-started)
19+
- [Utilities](#utilities)
1920
- [Contacts](#contacts)
2021
- [Licence](#licence)
2122

@@ -66,6 +67,15 @@ We've also created a [Quick Reference Guide](./docs/getting-started/Quick_Refere
6667

6768
For additional reading and guidance on writing tests, we also recommend reviewing the [Playwright Python documentation](https://playwright.dev/python/docs/writing-tests).
6869

70+
## Utilities
71+
72+
This blueprint also provides the following utility classes, that can be used to aid in testing:
73+
74+
|Utility|Description|
75+
|-------|-----------|
76+
|[Axe](./docs/utility-guides/Axe.md)|Accessibility scanning using axe-core.|
77+
|NHSNumberTools|Basic tools for working with NHS numbers.|
78+
6979
## Contacts
7080

7181
If you have any queries regarding this blueprint, please contact [[email protected]](mailto:[email protected]).

0 commit comments

Comments
 (0)