3 July 2024 Leave a comment QA
Encountering the NoSuchElementException while writing Selenium/WebDriver automation scripts can be a common issue. This article outlines strategies to diagnose and resolve this exception effectively.
1. Trust Your Code and Doubt the Software Under Test (SUT)
When tests that previously worked fine start failing, begin by checking the actual product. Visually inspect the application to see if the development team has modified the element or if the element is no longer displayed.
2. Trust Your Code and Doubt the Environment
If tests work locally but fail in a CI/CD environment, investigate the product behavior on the test server. Differences in OS and configuration can cause discrepancies. If this is the case, raise a bug report.
3. Verify Your Scripts (Avoid Absolute XPATH)
Using absolute XPATH can result in flaky tests when the DOM structure changes. Prefer relative XPATH or CSS selectors. Avoid using XPATH if a unique ID or name is available for the element.
4. Implement Explicit Waits
Scripts often fail due to the absence of explicit waits, especially when interacting with dynamic elements. Ensure that your script waits for the element to be available in the DOM before interacting with it.
5. Handle Spinners Appropriately
Spinners can delay interactions. Check for the visibility of spinners and wait for them to become invisible before proceeding with other dynamic elements.
6. Manage iFrames Correctly
Elements within iFrames require scripts to switch between frames. Ensure your script checks for frame or iframe tags and switches context appropriately.
7. Disable Wait for Angular Operations
If your application uses Angular, spinners might wait for asynchronous operations. Ensure the waitforangular flag is set correctly to avoid waiting unnecessarily for tasks to complete, which can remove temporary overlays like spinners from the DOM.
Additional Tips
For CSS selectors, test them in the browser console using document.querySelector(selector);
. For XPath, use document.evaluate(selector, document).iterateNext();
. These commands return the first matching element or null if none is found, and they throw a SyntaxError if the selector is invalid.
Practical Example
Consider a scenario where your test fails after a login operation due to a spinner not disappearing. Implement a wait condition to check for the spinner’s invisibility before interacting with subsequent elements.