&gt;The problem lies in the fact that ABTs are highly coupled with the UI’s HTML&#x2F;DOM. ABTs can range from fairly brittle to extremely brittle. The less brittle ABTs typically use some sort of DOM traversal like XPath or CSS-style selectors which can tolerate some UI changes like colors and minor layout changes as long as the changes are via CSS only and don’t dramatically affect the DOM.<p>This is the reason I follow this pattern for automated testing - only use readable selector IDs (for individual elements) and only use readable CSS selectors (for items in a group):<p><a href="https:&#x2F;&#x2F;hitchtest.readthedocs.org&#x2F;en&#x2F;latest&#x2F;faq&#x2F;why_just_html_ids_and_classes.html" rel="nofollow">https:&#x2F;&#x2F;hitchtest.readthedocs.org&#x2F;en&#x2F;latest&#x2F;faq&#x2F;why_just_htm...</a><p>This ends up leading to tests that look a bit like this:<p><pre><code>  - Click: view-button
  - Verify text:
      item: first first_name
      text: Sanders
</code></pre>
Where such readable ids or classes are missing I either add them myself or ask the front end to add them.<p>I&#x27;ve tried most other methods of automated testing too (selenium IDE, page object), and this one is the most straightforward and sensible IMO.<p>I would probably use this for BDD + ATDD too although I&#x27;ve yet to work on a project where that&#x27;s been possible.<p>&gt;The time it takes to run the tests is often exacerbated by a lot of explicit delay statements in the test cases.<p>This is an antipattern. You shouldn&#x27;t do it:<p><a href="https:&#x2F;&#x2F;hitchtest.readthedocs.org&#x2F;en&#x2F;latest&#x2F;glossary&#x2F;sleep_oriented_testing.html" rel="nofollow">https:&#x2F;&#x2F;hitchtest.readthedocs.org&#x2F;en&#x2F;latest&#x2F;glossary&#x2F;sleep_o...</a><p>Unfortunately, avoiding in most frameworks requires the tester to write asynchronous multithreaded code (which is beyond most QA developers).