Selenium C# SDK
The Evinced Selenium C# SDK integrates with new or existing Selenium WebDriver tests to automatically detect accessibility issues. By adding a few lines of code to your Selenium WebDriver project, you can begin analyzing all the web pages and DOM changes to provide a dynamic view of how your site can become more accessible. As a result of the test, a rich and comprehensive report is generated to easily track issues to resolution.
Interested in seeing this in action? Contact us to get started!
Prerequisites
The C# support for this SDK is currently limited to projects built using .NET Standard or .NET Core. It does not support projects built on .NET Framework 4.8 or below.
- Selenium.WebDriver version 4.10.0 or higher
- .Net Core version 7 or higher
- ChromeDriver
Get Started
Installation
Install Selenium C# SDK from a locally provided file
- Download the Selenium.CS.SDK.version.nupkg file.
- Add it to the project
1# To install the SDK.2dotnet add package Selenium.CS.SDK -v <version> -s <path-to-folder-with-nupkg-file>34# To restore all needed .NET dependencies.dotnet add reference <path-to-dll>Selenium.CS.SDK.dll5dotnet restore
Authentication
To launch Selenium C# SDK you need to have a Service ID and an API Key.
Where to find your Evinced SDK credentials
These credentials are available via the Evinced Product Hub in the
Automation for Web or Automation for Mobile product areas. Click the
Get SDK
button to see the Service Account ID and API Key at the bottom of the page.
Authenticate for Offline Testing
There are two methods to provide the token: offline mode and online mode. Online mode contacts the Evinced Licensing Server. Offline mode assumes that an Evinced employee already supplied you a JSON Web Token (JWT). If an offline token is required, please reach out to your account team or support@evinced.com.
We encourage setting credentials in environment variables and setting them in code by reference.
1# Online mode2export EVINCED_SERVICE_ID=<serviceId>3export EVINCED_API_KEY=<apiKey>45# Offline mode6# If provided a JWT by Evinced7export EVINCED_SERVICE_ID=<serviceId>8export EVINCED_AUTH_TOKEN=<token>
Example
1using Evinced.SDK;23// Online mode (not yet implemented)4EvincedSDK.SetCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_API_KEY"));56// Offline mode7EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));
Your First Test
SDK Initialization
To use Selenium C# SDK you need to authenticate. Please refer to Authentication section for details. The only command you need to add is to wrap the existing WebDriver object
1using Evinced.SDK;23IEvincedDriver driver = EvincedDriverFactory.Create(new ChromeDriver());
Add Evinced accessibility checks (Single Run Mode)
This is a simple example of how to add an Evinced accessibility scan to a test. Please note the inline comments that give detail on each test step.
1[Test]2public void EvAnalyzeTest() {3 EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));45 // Initialize EvincedWebDriver which wraps a ChromeDriver instance6 IEvincedDriver driver = EvincedDriverFactory.Create(new ChromeDriver());78 try {9 // Navigate to the site under test10 driver.Navigate().GoToUrl("https://www.google.com");1112 // Run analysis and get the accessibility report13 IReport result = driver.EvAnalyze();1415 // Assert that there are no accessibility issues16 Assert.That(result.GetIssues(), Has.Count.EqualTo(0));17 } finally {18 driver.Quit();19 }20}
Add Evinced accessibility checks (Continuous Mode)
This is an example of how to add a continuous Evinced accessibility scan to a test. Using the EvStart
and EvStop
methods, the Evinced engine will continually scan in the background capturing all DOM changes and page navigations as the test is executed. This will capture all accessibility issues as clicking on drop-downs or similar interactions reveals more of the page. The advantage of continuous mode is that no interaction with the actual test code is needed.
1[Test]2public void StartStopSimpleTest() {3 EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));45 // Initialize EvincedWebDriver which wraps a ChromeDriver instance6 IEvincedDriver driver = EvincedDriverFactory.Create(new ChromeDriver());78 try {9 // Navigate to the site under test10 driver.Navigate().GoToUrl("https://www.google.com");11 // Start the Evinced engine scanning for accessibility issues12 driver.EvStart();1314 // More test code to interact with the page1516 // Stop the Evinced engine17 IReport report = driver.EvStop();18 // Output the Evinced report in either JSON or HTML format19 EvincedSDK.EvSaveFile("test-results", report, FileFormat.JSON);20 EvincedSDK.EvSaveFile("test-results", report, FileFormat.HTML, driver);2122 // Reports will be stored in the current directory23 Console.WriteLine(Directory.GetCurrentDirectory());2425 } finally {26 driver.Quit();27 }28}
API
global initialization
Initializes the Evinced object within the project.
Example
The EvincedDriverFactory.Create
method expects an instance of ChromeDriver
. It is possible to pass an instance of a
class that implements a IWebDriver
interface.
1ChromeDriver chromeDriver = new ChromeDriver();2IEvincedDriver evincedWebDriver = EvincedDriverFactory.Create(chromeDriver);
Please refer to configuration to see examples of using init with options.
EvAnalyze(options)
Scans the current page and returns a list of accessibility issues.
Note: This method is not supported if EvStart
is already running.
Please refer to configuration to see examples of using init with options.
Example
1IReport result = evincedWebDriver.EvAnalyze();
Return value
1IReport
A Report object is returned containing accessibility issues. This is the recommended method for static page analysis.
For more information regarding reports as well as the Report
object itself, please refer to our detailed Web Reports page.
EvStart(options)
Continually watches for DOM mutations and page navigation and records all accessibility issues until the EvStop
method is called. This method is recommended for dynamic page flows.
Example
1evincedWebDriver.EvStart();
Return value
1void
EvStop
Stops the process of issue gathering started by EvStart
command.
Example
1evincedWebDriver.EvStart();2IReport report = evincedWebDriver.EvStop();
Return value
1IReport
Returns an object containing recorded accessibility issues from the point in time at which the EvStart
method
was instantiated. For more information regarding reports as well as the returned object itself, please refer to detailed
Web Reports page.
EvSaveFile(destination, format, issues)
Saves list of the issues in a file, with the specified format and location. For example, format could be ‘json
',
'html
, 'sarif
' or 'csv
'. Please find detailed information on Web Reports page.
Example
1IReport report = evincedWebDriver.EvStop();2 -- or --3IReport report = evincedWebDriver.EvAnalyze();45// create a JSON file named jsonReport.json6EvincedSDK.EvSaveFile.EvSaveFile("jsonReport", report, EvincedReporter.FileFormat.JSON);78// create an HTML file named htmlReport.html9EvincedSDK.EvSaveFile("htmlReport", report, EvincedReporter.FileFormat.HTML);1011// create an SARIF file named sarifReport.sarif.json12EvincedSDK.EvSaveFile("sarifReport", report, EvincedReporter.FileFormat.SARIF);1314// create an CSV file named csvReport.csv15EvincedSDK.EvSaveFile("csvReport", report, EvincedReporter.FileFormat.CSV);
Note: To generate a report in the specific format (but JSON) we are running some code on the browser side. If you are using custom WebDriver or there are some environmental issues with starting browser or driver during report generation, please use the command where you can provide the WebDriver object.
1WebDriver driver = yourCustomMethodToInstaantiateDriver();2EvincedSDK.EvSaveFile("sarifReport", report, EvincedReporter.FileFormat.SARIF, driver);3driver.Quit();
FileFormat
Defines the file type of the report. Options are JSON
, HTML
, SARIF
and CSV
.
Return value
1string
The string object representing the location where the result file was stored.
Aggregated Report
The aggregated report feature allows you to have a general aggregated report for the
whole run (not only for one test or suite).
This report will contain all the issues found by the tests where EvStart
and EvStop
commands were called.
It is still possible to use the EvSaveFile
command in any place of your code along with this Aggregated Report feature.
Example
1EvincedSDK.EvSaveFile("evinced-html-report-json", FileFormat.JSON);
Configuration
The same configuration object can be used in global initialization, EvStart
and EvAnalyze
methods but
with a bit different consequences. By providing some options in global initialization method you define a global
configuration for all calls of EvStart
or EvAnalyze
methods. Please note that global configuration is not
intended to be altered from tests due to it will affect all the rest tests as well as tests running in parallel threads.
To alter configuration in specific tests you can provide config on the method's level, for instance with EvStart
it
defines local configuration for this particular session until EvStop
is called.
If provided in both levels, the command's level config will override the global one.
Engines configuration
Evinced uses two separate engines when scanning for accessibility issues, one is the aXe engine and the other is the Evinced engine. By default, Evinced disables the aXe Needs Review and Best Practices issues based on customer request and due to the fact they are mostly false positives. Please note this setting when comparing issue counts directly. See an example of how to enable Needs Review and Best practices issues in our toggles section.
Configuration object type
Global.Config
is a global configuration of type EvincedConfig
that will be used with all commands by default.
1Global.Config.RootSelector = "#some-selector";
The configurations can be passed to a specific command, such as EvAnalyze
or EvStart
, it will override the
global configuration for a single run.
1EvincedConfig config = new EvConfig();2config.RootSelector = "#some-selector";3driver.EvStart(config);
Root Selector
Sets a CSS selector to limit the Evinced Engine to scan only the selected element and its children. Must be a valid CSS selector. If not set, the Evinced Engine will scan the entire document.
null
by default.
Example
1EvincedConfig config = new();2config.RootSelector = ".some-selector";
AXE Configuration
Evinced leverages Axe open-source accessibility toolkit as part of its own accessibility detection engine. The Evinced engine is able to pinpoint far more issues than Axe alone.
For the full Axe config options, see Axe Core API.
Example
The feature **is not yet implemented** in this SDK. If you'd like to increase the priority of it, please contact support@evinced.com.
Errors Strict Mode
When set to true
it switches SDK in mode when Evinced SDK errors are thrown as runtime errors and stops current test
execution. Otherwise errors are printed into console except critical ones.
false
by default.
Example
The feature **is not yet implemented** in this SDK. If you'd like to increase the priority of it, please contact support@evinced.com.
Engine Logging
Switches logging on for engine. Log messages from the engine will be printed to console.
Levels are: debug
, info
, warn
, error
null
by default.
error
is a default level on engine side.
The feature **is not yet implemented** in this SDK. If you'd like to increase the priority of it, please contact support@evinced.com.
Reports Screenshots
The Screenshots feature allows to include screenshots to the Evinced reports. When the feature is enabled, Evinced will take screenshots of the page, highlight an element with a specific accessibility issue, and include them to the report.
false
by default.
Note: The Screenshots feature may affect the test run performance.
Enabling the Screenshots feature
1// On global level2Global.Config.EnableScreenshots = true;34// OR56// On command level7EvincedConfig config = new() {8 EnableScreenshots = false9};10evincedWebDriver.EvAnalyze(config);
Toggles
Toggles are feature flags which controls SDK and Engine behavior. With toggles we introduce experimental features or manage the way how accessibility issues are gathered. The list of toggles is not specified so we suggest not to rely on specific toggle name or value and use them in investigation purposes only.
Example enabling aXe Best Practices and Needs Review Issues
1// Globally2Global.Config.AddToggle(USE_AXE_NEEDS_REVIEW, true)3 .AddToggle(USE_AXE_BEST_PRACTICES, true);
Skip Validations
Skips specific validations for the given URL pattern and the selector.
SkipValidation[]
by default.
Example
1string selector1 = "test.1--selector";2string type1 = "NO_DESCRIPTIVE_TEXT";3string type2 = "NOT_FOCUSABLE";4Global.Config.AddSkipValidation(selector1, "http://url.to.skip/path1", new List<string> { type1, type2 });
How to identify ID for the specific issue type is described in web reports section.
Knowledge Base Link overrides
This custom parameter helps to customize knowledge base links in the reports. Those links are displayed in the reports as follows:
The knowledge base link can be overridden for every issue type ID.
Example
The feature **is not yet implemented** in this SDK. If you'd like to increase the priority of it, please contact support@evinced.com.
Shadow DOM support
Example
The feature **is not yet implemented** in this SDK. If you'd like to increase the priority of it, please contact support@evinced.com.
IFrames support
When set to true
, the accessibility tests run analysis on iframes that exist inside the page. Default is false
.
The feature **is not yet implemented** in this SDK. If you'd like to increase the priority of it, please contact support@evinced.com.
Proxy
If your organization is using proxy server for outbound communication, you should set up these proxy server settings to the SDK so it can work properly. Setting the proxy details is done as in the following example:
Example
1...2string proxyString = "ip:port";3Proxy proxy = new(){4 Kind = ProxyKind.Manual,5 IsAutoDetect = false,6 HttpProxy = proxyString,7 SslProxy = proxyString,8};9options.Proxy = proxy;10ChromeDriver chromeDriver = new(options);11IEvincedDriver evincedWebDriver = EvincedDriverFactory.Create(chromeDriver);12...
Global Switch
Global Switch allows to disable or enable Evinced functionality. It could be needed, for example, while working on functional tests in your local environment or for running some CI jobs that are not intended to gather information regarding accessibility issues.
When switched off
EvStart
andEvSaveFile
will be bypassed.EvStop
andEvAnalyze
will return an empty report.
true
by default.
Important! Global Switch environment variable overrides the global configuration option.
Switch on/off Evinced functionality in config
1EvincedSDK.SwitchOn(false);
Switching off Evinced functionality with environment variable
1export EV_SWITCH_ON=false
Uploading reports to Evinced Platform
Introduction
Evinced Platform allows you to seamlessly collect, organize, visualize and monitor Evinced accessibility reports in one place.
In this section, we will guide you through the key functionalities of the upload methods of the accessibility reports from the Evinced SDK to the Evinced Platform,
which was introduced in version 2.2.2
. This upload method is fully compatible with the previous versions of the Evinced SDK API, and is disabled by default.
Enabling upload to Platform
To enable the uploading functionality of accessibility reports to
the Evinced Platform you will need to set the UploadToPlatform
method to "true":
1EvincedSDK.UploadToPlatform = true;
Automatic Upload of Reports
Once the UploadToPlatform
method is set to "true", then by default all generated reports will be uploaded to the Platform upon calling the EvStop
command.
If you want to change this behavior, set the PlatfomUploadByDefult
feature flag to "false":
1EvincedSDK.PlatfomUploadByDefult = false;
If the PlatfomUploadByDefult
is disabled, you can still upload selected reports to the platform.
For that, use the following parameter in the EvStop
command:
1driver.EvStop(PlatformUpload.Enabled);
Test names
To facilitate report management and be able to distinguish between different reports on the Platform, use the SetTestInfo
method to inform the test name and test class.
It's recommended to do that in the "beforeEach" hook.
NUnit
1[SetUp]2public virtual void BeforeTestMethod() {3 driver.SetTestInfo(TestContext.CurrentContext.Test.Name, TestContext.CurrentContext.Test.FullName);4}
Labels and Custom Fields
You can attach labels and custom fields to your report to enhance readability in the platform. The labels will be added to the uploaded reports. See the following code example of how to set that up:
1EvincedSDK.TestRunInfo()2 .AddLabel(Label.GIT_BRANCH, "main")3 .AddLabel(Label.GIT_USERNAME, "testUser")4 .CustomLabel("ProductVersion", "1.2.3")5 .CustomLabel("TestRunType", "Demo c# selenium test run");
Use of beforeEach and afterEach Hooks
We recommend using the beforeEach and afterEach hooks to control analysis sessions and upload reports to the platform. This way, each test will be uploaded separately with its own report.
In beforeEach hook use EvStart
to start Evinced analysis and set any labels you want for the report to contain when uploading to the platform.
In the afterEach hook call EvStop
to stop analysis and upload reports to the platform. See this code example:
NUnit
1[SetUp]2public virtual void BeforeTestMethod() {3 driver.SetTestInfo(TestContext.CurrentContext.Test.Name, TestContext.CurrentContext.Test.FullName);4 driver.EvStart();5}67[TearDown]8public virtual void AfterTestMethod() => _driver.EvStop();
Putting all of this together
Here is a complete code snippet of how to perform uploads to the platform on a per-test basis.
1using Evinced.SDK.Implementation.ResultsUpload;2using OpenQA.Selenium;34namespace Test {5 [SetUpFixture]6 public class OneTimeSetup {7 [OneTimeSetUp]8 public void BeforSuite() {9 EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));10 EvincedSDK.UploadToPlatform = true;11 EvincedSDK.TestRunInfo()12 .AddLabel(Label.GIT_BRANCH, "main")13 .AddLabel(Label.GIT_USERNAME, "testUser")14 .CustomLabel("ProductVersion", "1.2.3")15 .CustomLabel("TestRunType", "test example run");16 }17 }1819 public class BaseTest {2021 internal static protected IEvincedDriver _driver;2223 [OneTimeSetUp]24 public void BeforeTest() => _driver = getDriver();2526 private static IEvincedDriver getDriver() {27 ChromeOptions options = new();28 return EvincedDriverFactory.Create(new ChromeDriver(options));29 }3031 [SetUp]32 public virtual void BeforeTestMethod() {33 _driver.SetTestInfo(TestContext.CurrentContext.Test.Name, TestContext.CurrentContext.Test.FullName);34 _driver.EvStart();35 }3637 [TearDown]38 public virtual void AfterTestMethod() => _driver.EvStop();3940 [OneTimeTearDown]41 public void AfterTest() {42 _driver.Quit();43 }4445 [Test]46 public void testUrl() {47 _driver.Navigate().GoToUrl("https://demo.evinced.com");48 }49 }50}
Tutorials
You can find fully functional example projects on our GitHub
Step-by-step adding Evinced to existing test suite.
Preface: Existing test suite
1using Evinced.SDK;2using NUnit.Framework;3using OpenQA.Selenium;4using OpenQA.Selenium.Chrome;5using OpenQA.Selenium.Support.UI;6using SeleniumExtras.WaitHelpers;789namespace Tests {10 public static class Locators {11 public const string HOUSE_DROPDOWN = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(1) > div > div.dropdown.line";12 public const string TENT_OPTION = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(1) > div > ul > li:nth-child(4)";13 public const string LOCATION_DROPDOWN = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(2) > div > div.dropdown.line";14 public const string CANADA_OPTION = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(2) > div > ul > li:nth-child(1)";15 public const string SEARCH_BUTTON = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > a";16 public const string SEARCH_RESULTS = "#gatsby-focus-wrapper > main > h1";17 }1819 public class AccessibilityTests {20 private IEvincedDriver driver;2122 [OneTimeSetUp]23 public void OneTimeSetUp() {24 EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));25 this.driver = new ChromeDriver();26 }2728 [OneTimeTearDown]29 public void OneTimeTearDown() {30 driver.Quit();31 }3233 [Test]34 public void TutorialTest1() {35 driver.Navigate().GoToUrl("https://demo.evinced.com");36 Assert.That(driver.FindElement(By.CssSelector(Locators.SEARCH_BUTTON)).Displayed, Is.True);37 }3839 [Test]40 public void TutorialTest2() {41 driver.Navigate().GoToUrl("https://demo.evinced.com");42 driver.FindElement(By.CssSelector(Locators.HOUSE_DROPDOWN)).Click();43 driver.FindElement(By.CssSelector(Locators.TENT_OPTION)).Click();44 driver.FindElement(By.CssSelector(Locators.LOCATION_DROPDOWN)).Click();45 driver.FindElement(By.CssSelector(Locators.CANADA_OPTION)).Click();46 driver.FindElement(By.CssSelector(Locators.SEARCH_BUTTON)).Click();47 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));48 wait.Until(ExpectedConditions.ElementExists(By.TagName("body")));49 Assert.That(driver.FindElement(By.CssSelector(Locators.SEARCH_RESULTS)).Displayed, Is.True);50 }51 }52}
Step 1: Add Evinced, use snapshot scan and partial report
1using Evinced.SDK;2using NUnit.Framework;3using OpenQA.Selenium;4using OpenQA.Selenium.Chrome;5using OpenQA.Selenium.Support.UI;6using SeleniumExtras.WaitHelpers;789namespace Tests {10 public static class Locators {11 public const string HOUSE_DROPDOWN = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(1) > div > div.dropdown.line";12 public const string TENT_OPTION = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(1) > div > ul > li:nth-child(4)";13 public const string LOCATION_DROPDOWN = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(2) > div > div.dropdown.line";14 public const string CANADA_OPTION = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(2) > div > ul > li:nth-child(1)";15 public const string SEARCH_BUTTON = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > a";16 public const string SEARCH_RESULTS = "#gatsby-focus-wrapper > main > h1";17 }1819 public class AccessibilityTests {20 private IEvincedDriver driver;2122 [OneTimeSetUp]23 public void OneTimeSetUp() {24 EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));25 this.driver = EvincedDriverFactory.Create(new ChromeDriver());26 }2728 [OneTimeTearDown]29 public void OneTimeTearDown() {30 driver.Quit();31 }3233 [Test]34 public void TutorialTest1() {35 driver.Navigate().GoToUrl("https://demo.evinced.com");36 Assert.That(driver.FindElement(By.CssSelector(Locators.SEARCH_BUTTON)).Displayed, Is.True);37 IReport report = driver.EvAnalyze();38 EvincedSDK.EvSaveFile(TestContext.CurrentContext.Test.Name, report, FileFormat.JSON);39 }4041 [Test]42 public void TutorialTest2() {43 driver.Navigate().GoToUrl("https://demo.evinced.com");44 driver.FindElement(By.CssSelector(Locators.HOUSE_DROPDOWN)).Click();45 driver.FindElement(By.CssSelector(Locators.TENT_OPTION)).Click();46 driver.FindElement(By.CssSelector(Locators.LOCATION_DROPDOWN)).Click();47 driver.FindElement(By.CssSelector(Locators.CANADA_OPTION)).Click();48 driver.FindElement(By.CssSelector(Locators.SEARCH_BUTTON)).Click();49 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));50 wait.Until(ExpectedConditions.ElementExists(By.TagName("body")));51 Assert.That(driver.FindElement(By.CssSelector(Locators.SEARCH_RESULTS)).Displayed, Is.True);52 // Get issues snapshot on the result page53 IReport report = driver.EvAnalyze();54 // Assert page does not contain accessibility issues55 Assert.That(result.GetIssues(), Has.Count.EqualTo(0));56 }57 }58}
Step 2: Use continuous mode
Let's do a step back to the original test and start modifying it again. Some steps will be similar.
1using Evinced.SDK;2using NUnit.Framework;3using OpenQA.Selenium;4using OpenQA.Selenium.Chrome;5using OpenQA.Selenium.Support.UI;6using SeleniumExtras.WaitHelpers;789namespace Tests {10 public static class Locators {11 public const string HOUSE_DROPDOWN = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(1) > div > div.dropdown.line";12 public const string TENT_OPTION = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(1) > div > ul > li:nth-child(4)";13 public const string LOCATION_DROPDOWN = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(2) > div > div.dropdown.line";14 public const string CANADA_OPTION = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > div:nth-child(2) > div > ul > li:nth-child(1)";15 public const string SEARCH_BUTTON = "#gatsby-focus-wrapper > main > div.wrapper-banner > div.filter-container > a";16 public const string SEARCH_RESULTS = "#gatsby-focus-wrapper > main > h1";17 }1819 public class AccessibilityTests {20 private IEvincedDriver driver;2122 [OneTimeSetUp]23 public void OneTimeSetUp() {24 EvincedSDK.SetOfflineCredentials(Environment.GetEnvironmentVariable("EVINCED_SERVICE_ID"), Environment.GetEnvironmentVariable("EVINCED_AUTH_TOKEN"));25 this.driver = EvincedDriverFactory.Create(new ChromeDriver());26 }2728 [OneTimeTearDown]29 public void OneTimeTearDown() {30 driver.Quit();31 }3233 [SetUp]34 public void SetUp() {35 // Start the Evinced Engine36 driver.EvStart();37 }3839 [TearDown]40 public void TearDown() {41 // Stop the Evinced Engine42 IReport report = driver.EvStop();43 EvincedSDK.EvSaveFile(TestContext.CurrentContext.Test.Name, report, FileFormat.HTML, driver);44 }4546 [Test]47 public void TutorialTest1() {48 driver.Navigate().GoToUrl("https://demo.evinced.com");49 Assert.That(driver.FindElement(By.CssSelector(Locators.SEARCH_BUTTON)).Displayed, Is.True);50 }5152 [Test]53 public void TutorialTest2() {54 driver.Navigate().GoToUrl("https://demo.evinced.com");55 driver.FindElement(By.CssSelector(Locators.HOUSE_DROPDOWN)).Click();56 driver.FindElement(By.CssSelector(Locators.TENT_OPTION)).Click();57 driver.FindElement(By.CssSelector(Locators.LOCATION_DROPDOWN)).Click();58 driver.FindElement(By.CssSelector(Locators.CANADA_OPTION)).Click();59 driver.FindElement(By.CssSelector(Locators.SEARCH_BUTTON)).Click();60 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));61 wait.Until(ExpectedConditions.ElementExists(By.TagName("body")));62 Assert.That(driver.FindElement(By.CssSelector(Locators.SEARCH_RESULTS)).Displayed, Is.True);63 }64 }65}
Fail the test if critical issues are found
Here you can see a way of failing your test if critical accessibility issues are found using the Selenium C# SDK.
Using evAnalyze:
1IReport result = driver.EvAnalyze();23List<Issue> criticalIssues = report.GetIssues()4 .Where(issue => issue.Severity.Name == "Critical")5 .ToList();67Assert.That(criticalIssues, Is.Empty, "Critical issues found");
Using evStart/evStop:
1driver.EvStart();23IReport report = driver.EvStop();45List<Issue> criticalIssues = report.GetIssues()6 .Where(issue => issue.Severity.Name == "Critical")7 .ToList();89Assert.That(criticalIssues, Is.Empty, "Critical issues found");
The criticalIssues
array will contain all the critical issues found during the scan. If the array is not empty, the test will fail on the assertion.
Support
Please feel free to reach out to support@evinced.com with any questions.
FAQ
- Can I configure which validations to run?
Yes, see the configuration section for details on how to configure Axe validations to your needs.
- Can I run tests with Evinced using cloud-based services like Sauce Labs, Perfecto, or BrowserStack?
Yes, we have tested the Evinced SDK on many of these types of cloud-based services and expect no issues.