Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
76409a1
TD-2899 - New project accessibilty unit test
binon Feb 20, 2024
21d1a68
Refactored some of the code
binon Feb 27, 2024
bfc8d58
Td-2899 Minor updated chrome driver configuration
binon Feb 27, 2024
5642367
Merge branch 'release/accessibility' into Develop/Features/TD-2899-ad…
binon Feb 27, 2024
035056c
Merge pull request #156 from TechnologyEnhancedLearning/CI
binon Feb 28, 2024
7a40e5c
Merge pull request #157 from TechnologyEnhancedLearning/release/acces…
binon Feb 28, 2024
95d550f
TD-2899, Merged changes from CI, removed copyright and suppressed war…
binon Feb 28, 2024
1f24c67
Merge pull request #154 from TechnologyEnhancedLearning/Develop/Featu…
binon Feb 28, 2024
750f491
TD-5044: Implement changes for automated accessibility unit testing p…
ArunimaGeorge Nov 25, 2024
b0b4cde
Merge pull request #754 from TechnologyEnhancedLearning/Develop/Featu…
ArunimaGeorge Nov 28, 2024
04bc1fe
Automated accessbility test latest changes
ArunimaGeorge Jan 27, 2025
31eaed0
Latest from RC
ArunimaGeorge Jan 31, 2025
a598b1b
latest changes
ArunimaGeorge Feb 17, 2025
40a869b
latest changes
ArunimaGeorge Feb 26, 2025
71ce486
node package update
ArunimaGeorge Feb 26, 2025
5196a33
merge changes
ArunimaGeorge Feb 26, 2025
de3f22b
TD-4303: Adding automated accessibility tests for LH
ArunimaGeorge Feb 26, 2025
ee994b9
TD-4303: Updated search results test.
ArunimaGeorge Feb 27, 2025
b325fa3
Merge pull request #1007 from TechnologyEnhancedLearning/Develop/Feat…
ArunimaGeorge Mar 18, 2025
1649f4c
Merging release/accessibility to English Ivy 1.3.1
ArunimaGeorge Mar 18, 2025
537c1bf
Changes made on Automated UI Test project part of build error.
ArunimaGeorge Mar 19, 2025
2d4865e
Merge pull request #1039 from TechnologyEnhancedLearning/MergeAccessi…
AnjuJose011 Mar 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
namespace LearningHub.Nhs.WebUI.AutomatedUiTests.AccessibilityTests
{
using FluentAssertions;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestFixtures;
using LearningHub.Nhs.WebUI.Startup;
using OpenQA.Selenium;
using Selenium.Axe;
using Xunit;

/// <summary>
/// Accessibility Tests Base.
/// </summary>
[Collection("Selenium test collection")]
public class AccessibilityTestsBase
{
/// <summary>
/// Gets the base URL for the tests.
/// </summary>
internal readonly string BaseUrl;

/// <summary>
/// Gets the WebDriver used for the tests.
/// </summary>
internal readonly IWebDriver Driver;

/// <summary>
/// Initializes a new instance of the <see cref="AccessibilityTestsBase"/> class.
/// </summary>
/// <param name="fixture">fixture.</param>
public AccessibilityTestsBase(AccessibilityTestsFixture fixture)
{
this.BaseUrl = fixture.BaseUrl;
this.Driver = fixture.Driver;
}

/// <summary>
/// Analyze Page Heading And Accessibility.
/// </summary>
/// <param name="pageTitle">Page Title.</param>
public void AnalyzePageHeadingAndAccessibility(string pageTitle)
{
this.ValidatePageHeading(pageTitle);

// then
// Exclude conditional radios, see: https://github.com/alphagov/govuk-frontend/issues/979#issuecomment-872300557
var axeResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();
axeResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
}

/// <summary>
/// ValidatePageHeading.
/// </summary>
/// <param name="pageTitle">Page Title.</param>
public void ValidatePageHeading(string pageTitle)
{
var h1Element = this.Driver.FindElement(By.TagName("h1"));
h1Element.Text.Should().BeEquivalentTo(pageTitle);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
namespace LearningHub.Nhs.WebUI.AutomatedUiTests.AccessibilityTests
{
using FluentAssertions;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestFixtures;
using Selenium.Axe;
using Xunit;

/// <summary>
/// BasicAccessibilityTests.
/// </summary>
public class BasicAccessibilityTests : AccessibilityTestsBase, IClassFixture<AccessibilityTestsFixture>
{
/// <summary>
/// Initializes a new instance of the <see cref="BasicAccessibilityTests"/> class.
/// BasicAccessibilityTests.
/// </summary>
/// <param name="fixture">fixture.</param>
public BasicAccessibilityTests(AccessibilityTestsFixture fixture)
: base(fixture)
{
}

/// <summary>
/// PageHasNoAccessibilityErrors.
/// </summary>
/// <param name="url">url to the page.</param>
/// <param name="pageTitle">title of the page.</param>
[Theory]
[InlineData("/forgotten-password", "Forgotten your username or password")]
[InlineData("/Login", "Access your Learning Hub account")]
[InlineData("/Home/Contactus", "Contact us")]
[InlineData("/Home/Aboutus", "About us")]
[InlineData("/Updates", "Service updates and releases")]
[InlineData("/Policies", "Our policies")]
[InlineData("/Home/Accessibility", "Accessibility Statement for the NHS England Learning Hub")]
[InlineData("/Home/NHSsites", "NHS sites")]
[InlineData("/policies/terms-and-conditions", "NHS England Learning Hub Terms and Conditions of Use (‘Terms’)")]
[InlineData("/policies/content-policy", "NHS England Learning Hub Content Policy")]
[InlineData("/policies/privacy-policy", "PRIVACY NOTICE")]
[InlineData("/policies/cookie-policy", "Cookie policy")]
[InlineData("/policies/acceptable-use-policy", "ACCEPTABLE USE POLICY")]

public void PageHasNoAccessibilityErrors(string url, string pageTitle)
{
// when
this.Driver.Navigate().GoToUrl(this.BaseUrl + url);

// then
this.AnalyzePageHeadingAndAccessibility(pageTitle);

////this.Driver.Dispose();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
namespace LearningHub.Nhs.WebUI.AutomatedUiTests.AccessibilityTests
{
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestFixtures;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestHelpers;
using Microsoft.Azure.Management.Media.Models;
using OpenQA.Selenium;
using Xunit;

/// <summary>
/// BasicAuthenticatedAccessibilityTests.
/// </summary>
public class BasicAuthenticatedAccessibilityTests : AccessibilityTestsBase,
IClassFixture<AuthenticatedAccessibilityTestsFixture>
{
/// <summary>
/// Initializes a new instance of the <see cref="BasicAuthenticatedAccessibilityTests"/> class.
/// BasicAuthenticatedAccessibilityTests.
/// </summary>
/// <param name="fixture">fixture.</param>
public BasicAuthenticatedAccessibilityTests(AuthenticatedAccessibilityTestsFixture fixture)
: base(fixture)
{
}

/// <summary>
/// Authenticated Page Has no Accessibility Errors.
/// </summary>
/// <param name="url">url.</param>
/// <param name="pageTitle">pageTitle.</param>
[Theory]
[InlineData("/myaccount", "My account details")]
[InlineData("/MyLearning", "My learning")]
[InlineData("/allcatalogue", "A-Z of catalogues")]
[InlineData("/allcataloguesearch?term=primary#searchTab", "Search results for primary")]
public void AuthenticatedPageHasNoAccessibilityErrors(string url, string pageTitle)
{
// when
this.Driver.Navigate().GoToUrl(this.BaseUrl + url);

// then
this.AnalyzePageHeadingAndAccessibility(pageTitle);

// Dispose driver
////this.Driver.LogOutUser(this.BaseUrl);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
namespace LearningHub.Nhs.WebUI.AutomatedUiTests.AccessibilityTests
{
using FluentAssertions;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestFixtures;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestHelpers;
using Microsoft.AspNetCore.Components.Web;
using OpenQA.Selenium;
using Selenium.Axe;
using Xunit;

/// <summary>
/// Bookmarks Tests.
/// </summary>
public class BookmarksTests : AccessibilityTestsBase,
IClassFixture<AuthenticatedAccessibilityTestsFixture>
{
/// <summary>
/// Initializes a new instance of the <see cref="BookmarksTests"/> class.
/// </summary>
/// <param name="fixture">fixture.</param>
public BookmarksTests(AuthenticatedAccessibilityTestsFixture fixture)
: base(fixture)
{
}

/// <summary>
/// BookmarksPageHasNoAccessibilityErrors.
/// </summary>
[Fact]
public void BookmarksPageHasNoAccessibilityErrors()
{
// given
const string resourceUrl = "/Resource/17844/Item";
const string resourceProdUrl = "/Resource/48180/Item";
const string addBookmarkPageUrl = "/bookmark/resource?bookmarked=False&title=Understanding%20and%20managing%20conflict%20in%20children%27s%20healthcare&rri=16593&returnUrl=%2FResource%2F16593%2FItem";
const string myBookmarksPage = "/bookmark";
const string bookmarkname = "Primary care clinicians";
IWebElement renameBookmarkElement = null;
IWebElement addBookmarkElement = null;
IWebElement moveBookmarkElement = null;
AxeResult addBookmarkPageResult = null;

// when
this.Driver.Navigate().GoToUrl(this.BaseUrl + resourceProdUrl);

var h1Element = this.Driver.FindElement(By.TagName("h1"));
if (h1Element.Text == "Unknown error" || h1Element.Text != bookmarkname)
{
this.Driver.Navigate().GoToUrl(this.BaseUrl + resourceUrl);
}

try
{
addBookmarkElement = this.Driver.FindElement(By.XPath("//a[contains(text(),'Add to my bookmarks')]"));
if (addBookmarkElement.Displayed)
{
this.Driver.ClickLinkContainingText("Add to my bookmarks");
this.ValidatePageHeading("Add bookmark");
addBookmarkPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();
this.Driver.ClickButtonByText("Continue");
}
}
catch (NoSuchElementException)
{
this.Driver.Navigate().GoToUrl(this.BaseUrl + addBookmarkPageUrl);
this.ValidatePageHeading("Add bookmark");
addBookmarkPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();
this.Driver.ClickLinkContainingText("Cancel");
}

this.Driver.Navigate().GoToUrl(this.BaseUrl + myBookmarksPage);
this.ValidatePageHeading("Bookmarked learning");
var myBookmarksPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();

this.Driver.ClickLinkContainingText("Add a folder");
this.ValidatePageHeading("Add a folder");
var addBookmarkFolderPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();
this.Driver.ClickLinkContainingText("Cancel");

renameBookmarkElement = this.Driver.FindElement(By.XPath($"//tr[td//span[contains(text(), '{bookmarkname}')]]//td//div//form//span//button[contains(text(), 'Rename')]"));
renameBookmarkElement.Click();
this.ValidatePageHeading("Rename bookmark");
var renameBookmarkPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();
this.Driver.ClickLinkContainingText("Cancel");

moveBookmarkElement = this.Driver.FindElement(By.XPath($"//tr[td//span[contains(text(), '{bookmarkname}')]]//td//div//form//span//button[contains(text(), 'Move')]"));
moveBookmarkElement.Click();
this.ValidatePageHeading("Move your bookmark");
var moveBookmarkPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();
this.Driver.ClickLinkContainingText("Cancel");

// then
addBookmarkPageResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
myBookmarksPageResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
addBookmarkFolderPageResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
renameBookmarkPageResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
moveBookmarkPageResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
namespace LearningHub.Nhs.WebUI.AutomatedUiTests.AccessibilityTests
{
using FluentAssertions;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestFixtures;
using LearningHub.Nhs.WebUI.AutomatedUiTests.TestHelpers;
using Selenium.Axe;
using Xunit;

/// <summary>
/// Catalogue Folder Content Tests.
/// </summary>
public class CatalogueFolderContentTests : AccessibilityTestsBase,
IClassFixture<AuthenticatedAccessibilityTestsFixture>
{
/// <summary>
/// Initializes a new instance of the <see cref="CatalogueFolderContentTests"/> class.
/// </summary>
/// <param name="fixture">fixture.</param>
public CatalogueFolderContentTests(AuthenticatedAccessibilityTestsFixture fixture)
: base(fixture)
{
}

/// <summary>
/// DashboardPageHasNoAccessibilityErrors.
/// </summary>
[Fact]
public void CatalogueFolderContentPageHasNoAccessibilityErrors()
{
// given
const string catalogueUrl = "/catalogue/Neonatal-AHP";

// when
this.Driver.Navigate().GoToUrl(this.BaseUrl + catalogueUrl);
this.ValidatePageHeading("Enhanced Modules for Allied Health Professionals Working in Neonatal Care");
var cataloguePageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();

////this.Driver.ClickLinkContainingText("Manage this catalogue");
////this.ValidatePageHeading("Catalogue Management");
////var catalogueManagementPageResult = new AxeBuilder(this.Driver).Exclude("div.nhsuk-radios--conditional div.nhsuk-radios__item input.nhsuk-radios__input").Analyze();

// then
cataloguePageResult.Violations.Where(v => !v.Tags.Contains("best-practice")).Should().BeEmpty();
}
}
}
Loading
Loading