From e72ff912b98829c838f6143ac4775679c8e8b8d0 Mon Sep 17 00:00:00 2001 From: Lukas Tschaftary Date: Mon, 22 Dec 2025 17:16:13 +0100 Subject: [PATCH] Added an E2E tool that works well with web apps such as Microsoft Dynamics 365. Called kogiQA --- docs/automated-testing/e2e-testing/README.md | 12 ++++++++++++ .../e2e-testing/images/logo-kogiQA-small.png | Bin 0 -> 13873 bytes 2 files changed, 12 insertions(+) create mode 100644 docs/automated-testing/e2e-testing/images/logo-kogiQA-small.png diff --git a/docs/automated-testing/e2e-testing/README.md b/docs/automated-testing/e2e-testing/README.md index 3dde56102c..cb0db6b2fc 100644 --- a/docs/automated-testing/e2e-testing/README.md +++ b/docs/automated-testing/e2e-testing/README.md @@ -167,6 +167,18 @@ The biggest advantage of BugBug is its user-friendliness. Most tests created wit [BugBug Website](https://bugbug.io?utm_source=microsoft_github&utm_medium=referral) +### 7. kogiQA + +![kogiQA](images/logo-kogiQA-small.png) + +**kogiQA** is a UI automation tool for web applications that does not use CSS or XPath selectors. Instead, it uses a custom algorithm to select the element to interact with in a deterministic way, based on the meaning of the action derived from the DOM tree. + +This means that typing `page.click("Add Client")` will click the button labelled `[Add Customer]`. + +kogiQA reduces the need for test maintenance as the tests continue to work as long as the meaning of the text on the page remains unchanged. It is also the best option when it is not possible to change the code of the page being tested, for example when testing Microsoft Dynamics 365 or Salesforce applications. + +[kogiQA Website](https://kogiQA.com) + ## Conclusion Hope you learned various aspects of E2E testing like its processes, metrics, the difference between Unit, Integration and E2E testing, and the various recommended E2E test frameworks and tools. diff --git a/docs/automated-testing/e2e-testing/images/logo-kogiQA-small.png b/docs/automated-testing/e2e-testing/images/logo-kogiQA-small.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb1456d919b7efe9ee064769283657579cbffbb GIT binary patch literal 13873 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