docs: private void crawlThroughActions() {
  		boolean interrupted = Thread.interrupted();
  		CandidateCrawlAction action =
  				candidateActionCache.pollActionOrNull(stateMachine.getCurrentState());
  		while (action != null && !interrupted) {
  			boolean newStateFound = false;
  			CandidateElement element = action.getCandidateElement();
  			if (element.allConditionsSatisfied(browser)) {
  				Eventable event = new Eventable(element, action.getEventType());
  				handleInputElements(event);
  				waitForRefreshTagIfAny(event);
  
  				boolean fired = fireEvent(event);
  				if (fired) {
  					newStateFound = inspectNewState(event);
  				}
  			} else {
  				LOG.info(
  						"Element {} not clicked because not all crawl conditions were satisfied",
  						element);
  			}
  
  			if (newStateFound && stateMachine.getCurrentState().hasNearDuplicate()) {
  				action = null;
  			} else {
  				// We have to check if we are still in the same state.
  				action = candidateActionCache.pollActionOrNull(stateMachine.getCurrentState());
  			}
  			interrupted = Thread.interrupted();
  			if (!interrupted && crawlerLeftDomain()) {
  				/*
  				 * It's okay to have left the domain because the action didn't complete due to an
  				 * interruption.
  				 */
  				throw new CrawlerLeftDomainException(browser.getCurrentUrl());
  			}
  		}
  		if (interrupted) {
  			LOG.info(
  					"Interrupted while firing actions. Putting back the actions on the todo list");
  			if (action != null) {
  				candidateActionCache.addActions(ImmutableList.of(action),
  						stateMachine.getCurrentState());
  			}
  			interruptThread();
  		}
  	}