Skip to content

Commit 6e24482

Browse files
committed
Updated scan method and workflow
1 parent d56ee51 commit 6e24482

File tree

7 files changed

+196
-6
lines changed

7 files changed

+196
-6
lines changed

.github/workflows/ios-appium-tests.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ env:
3131
APPIUM_SKIP_CHROMEDRIVER_INSTALL: 1
3232
APPIUM_TEST_SERVER_PORT: 4723
3333
APPIUM_TEST_SERVER_HOST: 127.0.0.1
34-
AGORA_NPM_EMAIL: ${{ secrets.DQ_AGORA_USER }}
35-
AGORA_NPM_AUTH: ${{ secrets.APPIUM_AUTH }}
34+
ADT_APIKEY: ${{ secrets.AXE_APIKEY }}
35+
AGORA_NPM_EMAIL: ${{ secrets.AGORA_NPM_EMAIL }}
36+
AGORA_NPM_AUTH: ${{ secrets.DQ_AGORA_IDENTITY_TOKEN }}
3637
AGORA_REGISTRY_URL: //agora.dequecloud.com/artifactory/api/npm/axe-devtools-mobile-appium-qa/
3738

3839
jobs:

appium-tests/README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,50 @@ npm run test:appium3
114114
npm test
115115
```
116116

117+
## Axe Accessibility Scanning
118+
119+
The tests include automated axe accessibility scanning that sends results to the QA dashboard.
120+
121+
### Setup for Axe Scans
122+
123+
1. **Set API Key** (required for scans to run):
124+
```bash
125+
export ADT_APIKEY="your-api-key-here"
126+
# OR for dev environment
127+
export ADT_DEV_APIKEY="your-dev-api-key"
128+
```
129+
130+
2. **Run tests** - axe scans will run automatically during tests:
131+
```bash
132+
npm test
133+
```
134+
135+
### Axe Scan Features
136+
137+
- **Automatic scanning** on every screen navigation
138+
- **Results sent to QA Dashboard** at `https://mobile-qa.dequelabs.com`
139+
- **Tagged scans** for easy filtering:
140+
- Screen names (home, catalog, cart, profile)
141+
- Test types (navigation, accessibility, etc.)
142+
- Platform (ios, appium_webdriverio)
143+
144+
### Viewing Scan Results
145+
146+
1. Go to https://mobile-qa.dequelabs.com
147+
2. Log in with your credentials
148+
3. View scans filtered by:
149+
- Scan name (e.g., "Home Screen Accessibility Scan")
150+
- Tags (e.g., "home", "catalog", "accessibility")
151+
- Date/time
152+
153+
### Scan Coverage
154+
155+
The tests scan accessibility for:
156+
- **App Launch**: Initial app state
157+
- **Tab Navigation**: All tab screens (Home, Catalog, Cart, Profile)
158+
- **Home Screen**: Main view, search bar, scrolled content, navigation bar
159+
- **Comprehensive Suite**: Full WCAG compliance checks on all screens
160+
117161
## Configuration Options
118162

119163
You can customize test execution using environment variables:

appium-tests/test/helpers/utils.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,63 @@ class Utils {
101101
async wait(ms = 1000) {
102102
await driver.pause(ms);
103103
}
104+
105+
/**
106+
* Run axe accessibility scan and send results to QA dashboard
107+
* @param {string} scanName - Name for the scan
108+
* @param {string[]} tags - Tags for the scan
109+
* @returns {Object} Scan result
110+
*/
111+
async runAxeScan(scanName, tags = ['appium_webdriverio']) {
112+
const apiKey = process.env.ADT_APIKEY || process.env.ADT_DEV_APIKEY || '';
113+
114+
if (!apiKey) {
115+
console.warn('⚠ ADT_APIKEY not set, skipping axe scan');
116+
return null;
117+
}
118+
119+
const axeSettings = {
120+
apiKey: apiKey,
121+
axeServiceUrl: 'https://mobile-qa.dequelabs.com',
122+
scanName: scanName,
123+
tags: tags
124+
};
125+
126+
try {
127+
console.log(`🔍 Running axe scan: ${scanName}`);
128+
const scanResult = await driver.executeScript('mobile: axeScan', [axeSettings]);
129+
130+
if (scanResult && scanResult.axeError) {
131+
console.error(`❌ Axe scan failed: ${scanResult.axeError}`);
132+
throw new Error(`Axe scan failed: ${scanResult.axeError}`);
133+
}
134+
135+
console.log(`✓ Axe scan completed: ${scanName}`);
136+
if (scanResult && scanResult.violations) {
137+
console.log(` - Violations found: ${scanResult.violations.length}`);
138+
}
139+
140+
return scanResult;
141+
} catch (error) {
142+
console.error(`❌ Error running axe scan: ${error.message}`);
143+
throw error;
144+
}
145+
}
146+
147+
/**
148+
* Run axe scan for a specific screen after navigation
149+
* @param {string} screenName - Name of the screen
150+
* @param {string[]} tags - Additional tags
151+
*/
152+
async scanScreen(screenName, tags = []) {
153+
// Wait for screen to stabilize
154+
await this.wait(1500);
155+
156+
const scanTags = ['appium_webdriverio', 'ios', screenName.toLowerCase(), ...tags];
157+
const scanName = `${screenName} Screen Accessibility Scan`;
158+
159+
return await this.runAxeScan(scanName, scanTags);
160+
}
104161
}
105162

106163
module.exports = new Utils();

appium-tests/test/specs/accessibility.spec.js

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ describe('Accessibility Tests', () => {
2121

2222
console.log(`✓ ${tab.label} tab is accessible`);
2323
}
24+
25+
// Run axe scan on tab bar accessibility
26+
await utils.scanScreen('Tab Bar Accessibility', ['accessibility', 'tab-labels']);
2427
});
2528

2629
it('should verify all tabs are clickable', async () => {
@@ -41,6 +44,9 @@ describe('Accessibility Tests', () => {
4144
}
4245

4346
console.log('✓ All tabs are clickable');
47+
48+
// Run axe scan on tab clickability
49+
await utils.scanScreen('Tabs Clickable', ['accessibility', 'interactive']);
4450
});
4551

4652
it('should verify screen navigation is accessible', async () => {
@@ -61,6 +67,9 @@ describe('Accessibility Tests', () => {
6167
await utils.takeScreenshot(`accessibility-${test.name.toLowerCase()}`);
6268

6369
console.log(`✓ ${test.name} screen accessible and screenshot captured`);
70+
71+
// Run axe scan on each navigated screen
72+
await utils.scanScreen(`${test.name} Navigation`, ['accessibility', test.name.toLowerCase(), 'navigation']);
6473
}
6574
});
6675

@@ -77,5 +86,45 @@ describe('Accessibility Tests', () => {
7786
expect(size.height).to.be.at.least(44);
7887

7988
console.log(`✓ Tab touch targets meet minimum size requirements (${size.width}x${size.height})`);
89+
90+
// Run axe scan on touch targets
91+
await utils.scanScreen('Touch Targets', ['accessibility', 'touch-targets', 'sizing']);
92+
});
93+
94+
it('should run comprehensive accessibility scan on all screens', async () => {
95+
const screens = [
96+
{ tab: selectors.homeTab, name: 'Home' },
97+
{ tab: selectors.catalogTab, name: 'Catalog' },
98+
{ tab: selectors.cartTab, name: 'Cart' },
99+
{ tab: selectors.profileTab, name: 'Profile' }
100+
];
101+
102+
console.log('🔍 Running comprehensive accessibility scan on all screens...');
103+
104+
for (const screen of screens) {
105+
// Navigate to screen
106+
const tab = await $(screen.tab);
107+
await utils.tapWithRetry(tab);
108+
await utils.wait(1500);
109+
110+
console.log(`Scanning ${screen.name} screen...`);
111+
112+
// Run comprehensive axe scan
113+
const scanResult = await utils.runAxeScan(
114+
`${screen.name} Comprehensive Scan`,
115+
['comprehensive', 'full-suite', screen.name.toLowerCase(), 'wcag']
116+
);
117+
118+
if (scanResult) {
119+
console.log(`✓ ${screen.name} scan completed`);
120+
if (scanResult.violations && scanResult.violations.length > 0) {
121+
console.log(` ⚠ Found ${scanResult.violations.length} violation(s) on ${screen.name} screen`);
122+
} else {
123+
console.log(` ✓ No violations found on ${screen.name} screen`);
124+
}
125+
}
126+
}
127+
128+
console.log('✓ Comprehensive accessibility scan completed for all screens');
80129
});
81-
});
130+
});

appium-tests/test/specs/app-launch.spec.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ describe('App Launch Tests', () => {
1212
expect(appState).to.equal(4); // 4 = running in foreground
1313

1414
console.log('✓ App launched successfully');
15+
16+
// Run axe scan on app launch
17+
await utils.scanScreen('App Launch', ['app-start', 'initial-load']);
1518
});
1619

1720
it('should display the tab bar with all tabs', async () => {
@@ -29,11 +32,17 @@ describe('App Launch Tests', () => {
2932
await utils.verifyElementDisplayed(catalogTab, 'Catalog Tab');
3033
await utils.verifyElementDisplayed(cartTab, 'Cart Tab');
3134
await utils.verifyElementDisplayed(profileTab, 'Profile Tab');
35+
36+
// Run axe scan on tab bar
37+
await utils.scanScreen('Tab Bar', ['navigation', 'tab-bar']);
3238
});
3339

3440
it('should display Home screen by default', async () => {
3541
// Verify Home header is displayed
3642
const homeHeader = await $(`-ios predicate string:${selectors.homeHeader}`);
3743
await utils.verifyElementDisplayed(homeHeader, 'Home Header');
44+
45+
// Run axe scan on default home screen
46+
await utils.scanScreen('Home Default', ['home', 'default-screen']);
3847
});
39-
});
48+
});

appium-tests/test/specs/home-screen.spec.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ describe('Home Screen Tests', () => {
1616
await utils.verifyElementDisplayed(homeHeader, 'Home Header');
1717

1818
console.log('✓ Home screen elements displayed');
19+
20+
// Run axe scan on Home screen
21+
await utils.scanScreen('Home Screen', ['home', 'main-view']);
1922
});
2023

2124
it('should display search bar on Home screen', async () => {
@@ -27,6 +30,9 @@ describe('Home Screen Tests', () => {
2730
const isDisplayed = await searchBar.isDisplayed();
2831
if (isDisplayed) {
2932
console.log('✓ Search bar is displayed');
33+
34+
// Run axe scan on search bar
35+
await utils.scanScreen('Home Screen Search', ['home', 'search-bar']);
3036
}
3137
} catch (error) {
3238
console.log('⚠ Search bar may not be visible or accessible');
@@ -38,6 +44,9 @@ describe('Home Screen Tests', () => {
3844
await utils.swipeUp();
3945
await utils.wait(1000);
4046

47+
// Run axe scan after scrolling down
48+
await utils.scanScreen('Home Screen Scrolled', ['home', 'scrolled-view']);
49+
4150
// Scroll back up
4251
await utils.swipeDown();
4352
await utils.wait(1000);
@@ -53,5 +62,8 @@ describe('Home Screen Tests', () => {
5362
expect(isDisplayed).to.be.true;
5463

5564
console.log('✓ Navigation bar is displayed');
65+
66+
// Run axe scan on navigation bar
67+
await utils.scanScreen('Home Screen Navigation', ['home', 'navigation-bar']);
5668
});
57-
});
69+
});

appium-tests/test/specs/tab-navigation.spec.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ describe('Tab Navigation Tests', () => {
2121
await utils.verifyElementDisplayed(catalogHeader, 'Catalog Header');
2222

2323
console.log('✓ Successfully navigated to Catalog tab');
24+
25+
// Run axe scan on Catalog screen
26+
await utils.scanScreen('Catalog Screen', ['catalog', 'tab-navigation']);
2427
});
2528

2629
it('should navigate to Cart tab', async () => {
@@ -34,6 +37,9 @@ describe('Tab Navigation Tests', () => {
3437
await utils.verifyElementDisplayed(cartHeader, 'Cart Header');
3538

3639
console.log('✓ Successfully navigated to Cart tab');
40+
41+
// Run axe scan on Cart screen
42+
await utils.scanScreen('Cart Screen', ['cart', 'tab-navigation']);
3743
});
3844

3945
it('should navigate to Profile tab', async () => {
@@ -47,6 +53,9 @@ describe('Tab Navigation Tests', () => {
4753
await utils.verifyElementDisplayed(profileHeader, 'Profile Header');
4854

4955
console.log('✓ Successfully navigated to Profile tab');
56+
57+
// Run axe scan on Profile screen
58+
await utils.scanScreen('Profile Screen', ['profile', 'tab-navigation']);
5059
});
5160

5261
it('should navigate between all tabs', async () => {
@@ -68,6 +77,9 @@ describe('Tab Navigation Tests', () => {
6877
await utils.verifyElementDisplayed(header, `${tab.name} Header`);
6978

7079
console.log(`✓ Successfully navigated to ${tab.name} tab`);
80+
81+
// Run axe scan on each screen during navigation
82+
await utils.scanScreen(`${tab.name} Screen`, [tab.name.toLowerCase(), 'full-navigation']);
7183
}
7284
});
7385

@@ -77,6 +89,9 @@ describe('Tab Navigation Tests', () => {
7789
await utils.tapWithRetry(catalogTab);
7890
await utils.wait(1000);
7991

92+
// Run axe scan on Catalog before switching
93+
await utils.scanScreen('Catalog Before Switch', ['catalog', 'state-test']);
94+
8095
// Navigate away and back
8196
const homeTab = await $(selectors.homeTab);
8297
await utils.tapWithRetry(homeTab);
@@ -90,5 +105,8 @@ describe('Tab Navigation Tests', () => {
90105
await utils.verifyElementDisplayed(catalogHeader, 'Catalog Header');
91106

92107
console.log('✓ Tab state maintained successfully');
108+
109+
// Run axe scan on Catalog after switching back
110+
await utils.scanScreen('Catalog After Switch', ['catalog', 'state-maintained']);
93111
});
94-
});
112+
});

0 commit comments

Comments
 (0)