GitHub Actions workflow failed example CI/CD. If you have hit this error while writing automated tests, here is exactly what it means, why it happens, how to fix it properly, and how to stop it coming back.

What this error means

A step in the GitHub Actions YAML workflow exited with an error In CI/CD, it surfaces while a test runs against a live page or API, when the target was not in the state your test assumed. It is one of the most common errors in UI automation, and while it looks alarming, the cause is almost always straightforward once you know where to look.

Why it happens

There are three common root causes. The first is timing: the element or response simply was not ready when the step ran, because the page renders content asynchronously. The second is locator drift: the selector no longer matches after a UI or DOM change, so the test is looking for something that has moved or been renamed. The third is wrong state: the test was on a different page or in a different condition than expected. Single-page apps and enterprise platforms trigger this most, because their content loads dynamically and their IDs can change between sessions.

Advertisement

How to fix it

Diagnose root cause from stack trace; add proper wait/retry or fix request/config In practice, that means three things. Add an explicit wait for the exact state you need — present, visible, or clickable — rather than a blanket delay. Confirm the locator still matches the current DOM by inspecting the live page. And assert your preconditions before the failing step runs, so you fail early with a clear message instead of deep inside an action. Fixing the root cause, not adding a longer sleep, is what makes the fix stick.

// wait for the element's state instead of guessing with a fixed delay
wait.until(elementToBeClickable(locator));
locator.click();

How to prevent it in future

  • Wait on element or response state, never a fixed sleep
  • Use stable, attribute-based locators rather than auto-generated IDs
  • Assert the page or precondition before you act on it
  • Drive test-data setup through the API so each test starts from a known state
  • Keep tests independent, so one failure does not cascade into others

Debugging it step by step

When you see this error, work through it in order. First, reproduce it reliably — if it only happens sometimes, it is almost certainly a timing issue. Second, open the live page at the moment of failure and confirm the element actually exists and matches your locator. Third, check that any earlier step genuinely completed, since a silent failure upstream often surfaces here. Fixing the earliest broken assumption usually clears the error entirely.

Where to go next

If this error appears across many tests rather than one, the problem is usually structural — a shared wait strategy or locator approach that needs fixing once, centrally, rather than patched test by test.

A real-world example

Say a test clicks a button that opens a modal, then interacts with a field inside it. If the field is queried before the modal's animation finishes, this error fires — not because the field is missing, but because it is not there yet. The fix is not a longer sleep; it is waiting for the modal's field to reach a ready state, then acting. That one change turns an intermittent failure into a reliable pass, and the same pattern resolves the large majority of cases you will meet.

Frequently asked questions

What causes GitHub Actions workflow failed example CI/CD?

A step in the GitHub Actions YAML workflow exited with an error Most often it is a timing or locator issue where the element was not in the expected state.

How do I fix it?

Diagnose root cause from stack trace; add proper wait/retry or fix request/config Add an explicit wait, verify the locator, and confirm you are on the right page before the step runs.

Why does it only happen sometimes?

Intermittent failures are almost always timing-related — the element was sometimes ready and sometimes not. A proper wait on its state fixes it.