When a Selenium action throws, GPAL does not just give up. It logs an EXCEPTION event and retries the action, usually via JavaScript injection, so the workflow keeps moving. WithNoFallbackActions(true) turns this safety net off for workflows that should fail loudly at the first sign of trouble.
Selenium's WebDriver calls can throw for reasons that have nothing to do with whether the element is actually interactable. A stale element reference after a re-render, a click intercepted by an overlay, an input type SendKeys does not handle well. By default, GPAL catches these exceptions in ElementHelper, publishes an EXCEPTION event describing what went wrong, and retries the action by injecting JavaScript directly against the element. Clicking it, setting its value, focusing it, scrolling it into view. Whatever the original action needed to do. Most of the time the workflow simply continues as if nothing happened.
The same flag governs several related recovery paths: a stale element reference triggers GPAL to re-find the element (or refresh the page) and retry; a click intercepted by a popup or overlay triggers a scroll-into-view and another attempt; a hardware click that resolves to invalid screen coordinates falls back to a JavaScript, Puppeteer, or OttoMagic click instead. Even Puppeteer CDP clicks fall back to JavaScript if the CDP command fails. Subscribe to GPAL.ExceptionHandler or GPAL.InformationHandler to watch every recovery attempt as it happens.
// Default behavior - no extra code needed
browser.WithSelector("#tricky-input")
.FillInFrom(data);
// If Selenium SendKeys throws, GPAL logs an EXCEPTION event
// and retries by setting the value via JavaScript instead.
GPAL never fails silently, and it never recovers silently either. Each fallback publishes an EXCEPTION (or INFO/WARNING) event naming the selector, the original error, and what GPAL is trying next. So you can see exactly how often a workflow relies on the safety net, even when it does not fail outright.
GPAL.WithNoFallbackActions() switches off all of this. The first exception is published and the action simply fails, with no retry and no JavaScript fallback. This is the right call when a workflow should fail fast and loud, such as in CI, where a silent recovery could mask a real regression in the page under test.
// Strict mode - fail immediately, no recovery attempts
GPAL.WithNoFallbackActions();
browser.WithSelector("#tricky-input")
.FillInFrom(data);
// If Selenium SendKeys throws here, GPAL publishes the
// EXCEPTION event and stops - no JavaScript fallback is tried.
NoFallbackRecoveryActions defaults to false. Fallback and retry behavior is active in every new GPAL workflow unless WithNoFallbackActions() is called. This makes workflows resilient out of the box, but it also means a page that is quietly broken (e.g. An input that no longer accepts native SendKeys) can keep passing because GPAL JavaScript fallback is doing the real work. If a workflow seems to be passing for the wrong reasons, try WithNoFallbackActions() temporarily to see what actually fails.
Showing off some plain text in these paragraphs eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Here you can find different accents and emphasis sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
This is a link and how it could look like bestlinkinthebeautifulworld. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Here's just some classic bold text adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam notBoldSecondbestlinkinthebeautifulworld illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Obcaecati, iste distinctio veritatis eligendi laboriosam adipisicing elit illo nostrum corporis at adipisicing elit libero vel voluptas? Expedita, adipisicing facere dolores voluptatem ad ab rem assumenda soluta!
Other cuple of colors in case we want to emphasize several ways adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam adipisicing elit illo nostrum corporis at voluptatem libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta! Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quod veniam, quam ad expedita laborum sed at voluptates culpa ipsam ut vel. Ullam temporibus a mollitia quod aliquam ratione exercitationem nesciunt.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta! Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quod veniam, quam ad expedita laborum sed at voluptates culpa ipsam ut vel. Ullam temporibus a mollitia quod aliquam ratione exercitationem nesciunt.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Repudiandae quas consequuntur illo numquam assumenda autem exercitationem distinctio perspiciatis in natus. Eius dicta similique ipsam ipsa minima, nemo quae enim tempore.
GPAL
.CallIfNotFound(GenericCallIfNotFound)
.WithPublishToConsole();
//System.Drawing.Rectangle windowSize = new System.Drawing.Rectangle(10, 10, 1500, 1024);
// NOTE: we have to set browser = before we execute any steps
// this is due to the 'GenericCallIfNotFound' which might throw an exception, and BankScraper will not have the browser set when it calls scraper.Close()
// until the complete fluent line gets executed (meaning every step, meaning browser is not set until everything else succeeds)
browser = GPAL.Browser
.WithBrowserType(Enums.BrowserType.Chrome)
.WithProfileDataDirectory(ChromeProfileLocation)
.WithUseAutomationEngine(AutomationEngine.Selenium)
.WithWindowSize(new System.Drawing.Rectangle(0,0,1920,1080))
.ToGPALObject();