GPAL supports 7 stable automation engine variants across 3 technology stacks and works with Chrome, Edge, and Firefox. The same workflow code runs on any of the 19 resulting combinations. Firefox is not supported by the Puppeteer-based engines.
PuppeteerPort is GPAL's default engine and works out of the box. It talks to Chrome directly over the Chrome DevTools Protocol (CDP) using SDi's own custom CDP implementation, with no separate driver to install. Selenium is the industry-standard WebDriver protocol, compatible with Chrome, Edge, and Firefox, but takes an extra setup step: a WebDriver binary matching your browser version. OttoMagic is GPAL's exclusive browser extension stack that communicates via the GPAL REST API and requires installing that extension. Each stack has a Hardware (HW) variant that adds real OS-level mouse and keyboard events. Selenium additionally has a JavaScript (JS) variant. Its seventh and most unique. Which injects JavaScript into the page to interact with elements instead of using Selenium's own DOM interaction.
Hardware and JavaScript interaction types can be overridden at three levels: globally on GPAL, at the UOW level inline after WithSelector(), or per selector definition. This lets you mix interaction methods within a single workflow. Hardware for one element, Selenium for another, JavaScript for a third. JavaScript injection is Selenium-only. Hardware emulation works across all three stacks.
// Global engine setting
GPAL.WithAutomationEngine(AutomationEngine.Selenium);
// Inline UOW-level override
browser
.LeftClick("#normal-btn") // uses global Selenium
.WithSelector("#stubborn-btn").WithHardware
.LeftClick() // hardware for this one
.WithSelector("#js-only-field").WithJavaScript
.TypeIn("value"); // JS injection for this one
// Pre-defined selector-level override - built once, settings live on the object
var trickyBtn = GPAL.Selector
.WithCSS("#tricky")
.WithHardware
.ToGPALObject();
The WithJavaScript interaction type only applies when using a Selenium-based engine. It is not available for OttoMagic or Puppeteer engines.
PuppeteerPort is the default and needs no extra setup, so it's the natural starting point. Use Selenium when you need maximum browser compatibility (Edge, Firefox) and have a matching WebDriver in place. Use SeleniumJS when elements resist standard DOM interaction. Use hardware variants when you need to simulate real user input at the OS level. Alternately, use OttoMagic's browser extension and REST API native app to run pure JavaScript against the browser via accessible REST endpoints.
PuppeteerPipe and PuppeteerPipeHW are defined in the engine enum but are currently under development. Use PuppeteerPort for all CDP-based automation.
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();