22using System.Collections.Generic;
23using System.Diagnostics;
27using System.Threading.Tasks;
28using System.Windows.Forms.DataVisualization.Charting;
37 #region <Selector Settings>
38 [Interface(Description =
"Selector Settings")]
44 [
Selector(Description =
"Locate element using a CSS path (browser only)")]
46 [
Selector(Description =
"Locate element matching a partial or full HRef (browser only)")]
48 [
Selector(Description =
"Locate element using an XPath")]
50 [
Selector(Description =
"Locate element searching visible text to find")]
52 [
Selector(Description =
"Locate element with the given value")]
54 [
Selector(Description =
"Locate element with the given name")]
56 [
Selector(Description =
"Locate element with the given class name")]
58 [
Selector(Description =
"Locate element with the given placeholder (browser only)")]
60 [
Selector(Description =
"Locate element using an AutomationID (application only)")]
62 [
Selector(Description =
"Locate element loading the given image file to match")]
64 [
Selector(Description =
"Locate element loading the given image file to match")]
66 [
Selector(Description =
"Locate element using the supplied image to match")]
68 [Settings(Description =
"Name of selector (used in messages and column names)")]
70 [Settings(Description =
"X offset to click inside element, also starting X location in element for drag-and-drop")]
72 [Settings(Description =
"Y offset to click inside element, also starting X location in element for drag-and-drop")]
74 [Settings(Description =
"X delta for drag-and-drop")]
76 [Settings(Description =
"Y delta for drag-and-drop")]
78 [Settings(Description =
"Scroll down a page to see if the selector comes into view [image/ocr]")]
80 IAllowSelectorSettings WithHardware { [Settings(Description =
"Use hardware emulation to interact with this element [mouse/keyboard]")]
get; }
81 IAllowSelectorSettings WithJavaScript { [Settings(Description =
"Use javascript injection to interact with this element")]
get; }
82 IAllowSelectorSettings WithSelenium { [Settings(Description =
"Use selenium to interact with this element [default]")]
get; }
83 [Settings(Description =
"Smoothly move mouse to interact with this element [instead of jump to]. Implies .WithHardware")]
85 [Settings(Description =
"Stop the workflow if this selector is not found")]
87 [Data(Description =
"When retrieving data from the element, get data from the named attribute. [visible text is default]")]
89 [Data(Description =
"Located elements will match only if the text contains the supplied string")]
92 [Data(Description =
"Located elements will match only if they have this named attribute")]
94 [Data(Description =
"Located elements will match only if the attribute name matches this regular expression")]
96 [Data(Description =
"Located elements will match only if the text contains the supplied string")]
99 [Data(Description =
"Located elements will match only if they have this href")]
101 [Data(Description =
"Located elements will match only if the href matches this regular expression")]
103 [Data(Description =
"Located elements will match only if the text contains the supplied string")]
106 [Data(Description =
"Located elements will match only if the placeholder value matches the supplied string")]
108 [Data(Description =
"Located elements will match only if the placebolder value matches this regular expression")]
110 [Data(Description =
"Located elements will match only if the text contains the supplied string")]
113 [Data(Description =
"Located elements will match only if the src matches the supplied string")]
115 [Data(Description =
"Located elements will match only if the src matched the regular expression")]
117 [Data(Description =
"Located elements will match only if the text contains the supplied string")]
120 [Data(Description =
"Located elements will match only if the text matches the regular expression")]
122 [Data(Description =
"Located elements will match only if the text matches the regular expression")]
125 [Data(Description =
"Located elements will match only if the text contains the supplied string")]
127 [Data(Description =
"Located elements will match only if the value matches the supplied string")]
129 [Data(Description =
"Located elements will match only if the value matches the regular expression")]
131 [Data(Description =
"Custom Application UIAutomation Element matching method to examine and 'match' located elements using your algorithm.")]
133 [Data(Description =
"Custom browser webElement matching method to examine and 'match' located elements using your algorithm")]
142 [Callback(Description =
"Selector based callback if this selector is found")]
144 [Callback(Description =
"Selector based callback if this selector is NOT found")]
150 #endregion <Selector Settings>
151 #region <GPAL Interfaces>
152 [Interface(Description =
"Global Settings")]
155 [
GPALSettings(Description =
"Print GPAL published information or exception messages to the supplied database. One column for each GPALEventArgs property. ")]
157 [
GPALSettings(Description =
"Stops publishing events to a logger, for a workflow that logged a stretch of work to its own place and is done with it")]
159 [
GPALSettings(Description =
"Print GPAL published information or exception messages to the output window in VisualStudio. [true (default)]")]
160 IAllowGPALSettings WithPublishToDebug(GPALEventType eventTypes = GPALEventType.INFO | GPALEventType.WARNING | GPALEventType.ERROR | GPALEventType.EXCEPTION | GPALEventType.NOTICE | GPALEventType.CAUTION | GPALEventType.FAILURE);
161 [
GPALSettings(Description =
"Indicate which published events to print to the console. [None (default)]")]
162 IAllowGPALSettings WithPublishToConsole(GPALEventType eventTypes = GPALEventType.INFO | GPALEventType.WARNING | GPALEventType.ERROR | GPALEventType.EXCEPTION | GPALEventType.NOTICE | GPALEventType.CAUTION | GPALEventType.FAILURE);
163 [Settings(Description =
"Write specified GPAL events to a text area on a form. [none (default)]")]
165 [Settings(Description =
"Which GPAL events reach an attached handler. [all (default)]")]
167 [Settings(Description =
"Which GPAL events reach the information handler. [all (default)]")]
169 [Settings(Description =
"Which GPAL events reach the exception handler. [all (default)]")]
171 [Settings(Description =
"Which GPAL events reach the form control. [all (default)]")]
173 [
GPALSettings(Description =
"Print stack track when GPAL prints it's own published messages (PublishToConsole/PublishToDebug == true). [false (default)]")]
175 [
GPALSettings(Description =
"Callback for failures a workflow can decide about, used by any browser without its own CallOnFail")]
177 [
GPALSettings(Description =
"Intercharacter typing delay [0ms (default), no pacing]")]
179 [
GPALSettings(Description =
"Handler to receive GPAL Exception events")]
180 IAllowGPALSettings WithExceptionHandler(EventHandler<GPALEventArgs> ExceptionEventHandler);
181 [
GPALSettings(Description =
"Handler to receive GPAL Information events")]
182 IAllowGPALSettings WithInformationHandler(EventHandler<GPALEventArgs> InformationEventHandler);
183 [
GPALSettings(Description =
"Image matching similarity percentage. [80 (default)]")]
185 [
GPALSettings(Description =
"How many nodes a YAML payload may hold before GPAL stops writing aliases for shared references. Above it a shared reference is written out again instead of as an alias, which is what keeps a large flat collection from stalling. A graph that holds a cycle always keeps its aliases, because YAML cannot write a cycle without them. 0 never stops")]
187 [
GPALSettings(Description =
"Simulate moving the mouse for every action (implies .WithHardware). [false (default)]")]
189 [
GPALSettings(Description =
"Stop workflow if any selector is not found")]
191 [
GPALSettings(Description =
"Global location for browser drivers. [./ (default)(same dir as exe)]")]
192 IAllowGPALSettings WithDriverLocation([Directory(Description =
"Global location for browser drivers. [./ (default)(same dir as exe)]")]
string driverPath =
"./");
193 [
GPALSettings(Description =
"The folder GPAL writes its own throwaway files to")]
194 IAllowGPALSettings WithTempDirectory([Directory(Description =
"Where GPAL writes files it created itself and nobody asked to keep. [GPALfilesSafeToDelete beside the exe (default)]")]
string tempPath);
195 [
GPALSettings(Description =
"Set the default location to store temporary profiles if WithDefaultDataDir is not used. default [C:\\profiles]. Also saved in GPAL.yaml that loads on startup.")]
196 IAllowGPALSettings WithTempProfileParentDirectory([Directory(Description =
"Global location for temp profiles. [c:\\profiles (default)(saved in GPAL.yaml that is loaded on startup)]")]
string tempProfileDirectory);
197 [
GPALSettings(Description =
"Substitue string when data cannot be retrieved for an element [##UNABLE TO GET## (default)]")]
199 [
GPALSettings(Description =
"Automatically update the Chrome webdriver when running a GPAL application. Manually deploy first Chrome driver, tho.")]
200 IAllowGPALSettings WithAutomationEngine(AutomationEngine automationEngine = AutomationEngine.PuppeteerPort);
201 [
GPALSettings(Description =
"Automatically update the Chrome webdriver when running a GPAL application. Manually deploy first Chrome driver, tho.")]
203 [
GPALSettings(Description =
"Do not try alternate methods to interact with an element if an error occurs.")]
205 [
GPALSettings(Description =
"Ticks to wait for element to show up before continuing. Applies to every element in every workflow. Override in a Unit of Work with .WaitFor().")]
207 [
GPALSettings(Description =
"Global CallIfFound handler for all selectors in any Unit of Work")]
209 [
GPALSettings(Description =
"Global CallIfFound handler for all selectors in any Unit of Work")]
211 [
GPALSettings(Description =
"Global CallIfFound handler for all application selectors in any Unit of Work")]
213 [
GPALSettings(Description =
"Global CallIfFound handler for all application selectors in any Unit of Work")]
216 #endregion <GPAL Interfaces>
217 #region <Clipboard Interfaces>
219 , IAllowToGPALObject<IGPALClipboard>
223 [Settings(Description =
"Text to put on the clipboard")]
225 [Settings(Description =
"Grid to put on the clipboard, rows as lines and cells separated by tabs")]
227 [Settings(Description =
"File whose text goes on the clipboard, or the file itself for a FileList")]
229 [Action(Description =
"Read the clipboard. Text when no type is given.")]
231 [Action(Description =
"Empty the clipboard")]
236 [Action(Description =
"Put what WithInput named on the clipboard. Text when no type is given.")]
237 IGPALClipboard SetClipboard(ClipboardType clipboardType = ClipboardType.Text);
241 [Action(Description =
"What is on the clipboard, as text")]
243 [Action(Description =
"What is on the clipboard, split into a grid")]
245 [Action(Description =
"Writes what is on the clipboard to a file")]
248 #endregion <Clipboard Interfaces>
249 #region <Database Interfaces>
253 IGPALGrid<string> Tokens { [Data(Description =
"The rows/columns returned from the database")]
get; }
264 [Fluent(Description =
"Per-statement breakdown (via SqlCommand.StatementCompleted) instead of the single aggregate count")]
267 [Fluent(Description =
"Per-statement breakdown (via SqlCommand.StatementCompleted) instead of the single aggregate count")]
283 [Data(Description =
"Only SaveTo(out IGPALGrid<string>) returns this - meaningless for SaveTo(DataTable)/SaveTo(DataSet), which already separate results by table")]
296 [Settings(Description =
"Set the connectrion string used to connect to the database", Submenu =
"Connection")]
298 [Settings(Description =
"How long a command may run before the provider gives up. [the provider's own default]", Submenu =
"Connection")]
300 [Action(Description =
"Close the connection and roll back a transaction still open on it. The database can be used again after.")]
302 [Settings(Description =
"Set the username used to connect to the database", Submenu =
"Connection")]
304 [Settings(Description =
"Set the password used to connect to the database", Submenu =
"Connection")]
306 [Settings(Description =
"Set the database servername", Submenu =
"Connection")]
308 [Settings(Description =
"Set the database instance name", Submenu =
"Connection")]
310 [Settings(Description =
"Set the type of database GPAL is interacting with", Submenu =
"Connection")]
312 [Settings(Description =
"Set the table name to query for input", Submenu =
"SQL")]
314 [Settings(Description =
"The SQL command to execute for the input data grid (tokens)", Submenu =
"SQL")]
316 [Settings(Description =
"The stored procedure to execute for the input data grid (tokens)", Submenu =
"SQL")]
318 [Settings(Description =
"Add a parameter name to the parameter names list", Submenu =
"Parameters")]
320 [Settings(Description =
"Define a DateTime column", Submenu =
"Parameters")]
322 [Settings(Description =
"Define a Time column", Submenu =
"Parameters")]
324 [Settings(Description =
"Define a Timestamp column", Submenu =
"Parameters")]
326 [Settings(Description =
"Define a Decimal column", Submenu =
"Parameters")]
328 [Settings(Description =
"Define a Float column [Double/Real]", Submenu =
"Parameters")]
330 [Settings(Description =
"Define an Image column", Submenu =
"Parameters")]
332 [Settings(Description =
"Define an Integer column", Submenu =
"Parameters")]
334 [Settings(Description =
"Define a Money column", Submenu =
"Parameters")]
336 [Settings(Description =
"Define a VarChar column", Submenu =
"Parameters")]
338 [Settings(Description =
"Define an NVarChar column", Submenu =
"Parameters")]
340 [Settings(Description =
"Define a Char column", Submenu =
"Parameters")]
342 [Settings(Description =
"Define an NChar column", Submenu =
"Parameters")]
344 [Settings(Description =
"Define a Text column", Submenu =
"Parameters")]
346 [Settings(Description =
"Define a NText column", Submenu =
"Parameters")]
348 [Settings(Description =
"Pass a table to a stored procedure as a table-valued parameter with this name", Submenu =
"Parameters")]
350 [Settings(Description =
"How many rows to read", Submenu =
"SQL")]
352 [Settings(Description =
"The SQL that Create runs, in place of the one GPAL builds", Submenu =
"SQL")]
354 [Settings(Description =
"The SQL that Read runs, in place of the one GPAL builds", Submenu =
"SQL")]
356 [Settings(Description =
"The SQL that Update runs, in place of the one GPAL builds", Submenu =
"SQL")]
358 [Settings(Description =
"The SQL that Delete runs, in place of the one GPAL builds", Submenu =
"SQL")]
360 [Settings(Description =
"Callback for a database error the workflow can decide about", Submenu =
"SQL")]
362 [Settings(Description =
"The user-defined table type of the table parameter", Submenu =
"Parameters")]
367 [Action(Description =
"Reads a single value: the first column of the first row, without building a grid around it")]
369 [Action(Description =
"Reads a single value: the first column of the first row, without building a grid around it")]
371 [Action(Description =
"Reads a single value: the first column of the first row, without building a grid around it")]
373 [Action(Description =
"Reads a single value: the first column of the first row, without building a grid around it")]
378 [Settings(Description =
"The rows to write", Submenu =
"SQL")]
380 [Settings(Description =
"The rows to write", Submenu =
"SQL")]
385 IAllowParameters ClearParameters { [Action(Description =
"If you have already defined parameter objectss on a GPAL.Database, you can clear them and add new parameter objects;")]
get; }
386 [Settings(Description =
"Add a parameter to the parameters list", Submenu =
"Parameters")]
388 [Settings(Description =
"Add a parameter to the parameters list", Submenu =
"Parameters")]
398 IAllowDatabaseActions Rollback { [Action(Description =
"Undo the transaction", Submenu =
"Transactions")]
get; }
399 IAllowDatabaseActions Commit { [Action(Description =
"Commit the transaction", Submenu =
"Transactions")]
get; }
415 #endregion <DatabaseInterfaces>
427 [Settings(Description =
"The login for the credential service itself, built once and handed to every request that queries it")]
433 [Settings(Description =
"Selects which password manager or cloud identity service this credentials request targets")]
439 [Settings(Description =
"Sets the username, either as a credential to retrieve directly (with CredentialServiceType.None) or as part of WithCredentials' master login")]
448 [Settings(Description =
"Service key is a custom string consisting of your ClientID:ClientSecret")]
453 [Settings(Description =
"Like WithServiceKey, but reads the key from an environment variable (checking process, user, then machine scope) instead of taking it as a literal string")]
459 [Settings(Description =
"Like WithServiceKey, but fetches the key via a GET request made with the supplied, already-configured RESTClient")]
465 [Settings(Description =
"Call this endpoint on the RESTClient given to WithKeyFromApi and use the answer as the service key")]
471 [Settings(Description =
"Sets the password, either as a credential to retrieve directly (with CredentialServiceType.None) or as part of WithCredentials' master login")]
476 [Settings(Description =
"Sets the OAuth client ID used to authenticate to ServiceType")]
478 [Settings(Description =
"Loads a Google Cloud service account key from a JSON key file, used to fetch an access token without an interactive OAuth flow")]
480 [Settings(Description =
"Supplies a Google Cloud service account key as a raw JSON string, used to fetch an access token without an interactive OAuth flow")]
482 [Settings(Description =
"Supplies a Google Cloud service account key as a deserialized object, used to fetch an access token without an interactive OAuth flow")]
487 [Settings(Description =
"Sets the OAuth client secret and derives ServiceKey as 'ClientId:ClientSecret'")]
492 [Settings(Description =
"How the site expects to be told who you are, which decides what a browser given this credential does with it")]
494 [Settings(Description =
"A token the workflow already holds, presented according to the WebAuthType")]
496 [Settings(Description =
"Where the OAuth redirect lands, which has to be the URI registered with the provider")]
502 [Data(Description =
"Find the vault item matching this search term, such as a site name or url")]
504 [Settings(Description =
"Restricts GetCredentialsFor/SaveTo results to vault items whose URL contains this domain")]
506 [Action(Description =
"Looks up the credential matching.GetCredentialsFor's target (filtered by.WithDomain if set) and appends a [Username, Password] row to the given grid")]
508 [Settings(Description =
"Supplies a previously-obtained OAuth authorization code, skipping the interactive authorization step")]
510 [Settings(Description =
"Supplies a previously-obtained OAuth refresh token, used to fetch a new access token without re-authorizing")]
512 [Settings(Description =
"Sets the OAuth scope to request when an access token is fetched")]
519 [Action(Description =
"Fetches a new access token for ServiceType using the credentials/configuration supplied so far, and stores it in AccessToken/IssueTime/ExpiresIn")]
520 void FetchAccessToken(out
string accessToken);
527 #endregion Credentials
531 [Settings(Description =
"The API key for the AI provider")]
533 [Settings(Description =
"The API key for the AI provider")]
539 [Settings(Description =
"Which model to call")]
544 [Settings(Description =
"What to ask the AI to do")]
546 [Settings(Description =
"Settings for the task")]
548 [Settings(Description =
"The kind of classification")]
550 [Settings(Description =
"Your own categories for a custom classification")]
555 [Settings(Description =
"Where the answers go")]
557 [Settings(Description =
"Where the answers go")]
562 [Settings(Description =
"What the AI works on: text, a file or a grid")]
579 [Callback(Description =
"Callback for each answer the AI gives")]
581 [Fluent(Description =
"Send the task to the AI")]
586 [Settings(Description =
"A status strip to show progress in")]
591 [Settings(Description =
"What to ask the AI to do")]
596 [Settings(Description =
"Which AI provider to call")]
603 #region <Converter Interfaces>
611 [Settings(Description =
"Get input data to convert using the Database object")]
613 [Settings(Description =
"Input data is contained in this GPALGrid")]
615 [Settings(Description =
"Input data is in this string")]
617 [Settings(Description =
"Input data file (extension denotes type, override using WithInputType)")]
619 [Settings(Description =
"Input class, uses reflection to map to output format")]
621 [Settings(Description =
"[Global] Register a custom struct type for the converter to recognize. Structs cannot be reliably determined. If you have a custom struct to convert, register it first.")]
626 [Settings(Description =
"Specify input data format")]
628 [Settings(Description =
"Specify output data format")]
630 [Settings(Description =
"[Global] First line is a column name list (for flat files: csv, txt, prn)")]
632 [Settings(Description =
"[Global] Ignore first line column name list (for flat files: csv, txt, prn)")]
634 [Settings(Description =
"[Global] Each field is contained in quotes (for flat files: csv, txt, prn)")]
636 [Settings(Description =
"Column names for this conversion. Overrides the input source's own columns positionally; unsupplied columns are backfilled from the source.")]
638 [Settings(Description =
"Append a single column name for this conversion. Repeated calls build the list in order.")]
643 [Action(Description =
"Write the converted data into this database")]
645 [Action(Description =
"Write the converted data into this grid")]
647 [Action(Description =
"Add the converted data to the end of this file, keeping what is already there")]
649 [Action(Description =
"Write the converted data to this file, replacing what is there. The output format comes from the file's extension")]
651 [Action(Description =
"Fill this object's properties from the converted data")]
664 [Action(Description =
"Pretty print the input to a new string.")]
669 [Action(
"Save to a string the decoded Base64 content")]
671 [Action(
"Save to a file based upon content type")]
685 #endregion <Converter Interfaces>
686 #region <File Interfaces>
689 string First {
get; }
692 string Filename {
get; }
693 List<string> Filenames {
get; }
694 string DirectoryPart {
get; }
695 string FilePart {
get; }
696 List<string> DirectoryParts {
get; }
697 List<string> FileParts {
get; }
698 List<string> ReturnFilenames {
get; }
699 string SourceUrl {
get; }
703 internal interface IGPALFileInternal
705 internal GPALFileSettings FileSettings {
get;
set; }
706 internal List<IGPALGrid<string>> TokenList {
get;
set; }
707 internal List<string> FileData {
get;
set; }
708 internal List<char?> Delimiter {
get;
set; }
709 internal List<bool> FieldsEnclosedInQuotes {
get;
set; }
710 internal List<bool> FirstLineIsColumnNames {
get;
set; }
711 internal List<bool> IgnoreFirstLineColumnNames {
get;
set; }
712 internal bool UseOneHeaderForAllFiles {
get;
set; }
713 internal List<Dictionary<object, dynamic>> FileDictionary {
get;
set; }
714 internal List<IGPALGrid<string>> FileGrid {
get;
set; }
715 internal bool AlreadyTokenized {
get;
set; }
719 [Settings(Description =
"IF this file is delimited, the delimiter used.")]
721 [Settings(Description =
"Add a column name to the column name list. (If no header in file or to override.)")]
723 [Settings(Description =
"Add column names to the column name list using the .WithDelimiter. Use this to add headers for multiple files.")]
725 [Settings(Description =
"Add column names to the column name list using the supplied array. One column per element. Use this to add headers for multiple files.")]
727 [Settings(Description =
"Each field is contained in quotes (for flat files: csv, txt, prn)")]
729 [Settings(Description =
"First line is a column name list (for flat files: csv, txt, prn)")]
731 [Settings(Description =
"Ignore first line header list")]
733 [Settings(Description =
"Overwrite the file or generate a new filename. Overwrite is default.")]
735 [Settings(Description =
"One column list is defined, use it for all files in the file list. Without it each file takes the column list given for it, in file order.")]
736 IAllowFileSettings WithUseSameColumnNamesForAllFiles(
bool useHeaderForAllFiles =
true);
737 [Settings(Description =
"Order in which files matched by a wildcard (e.g. *.csv) are added to the file list. Default is Name (alphabetical).")]
739 [Settings(Description =
"How Next builds a new unique filename (timestamp, date, or an incrementing counter). Default is CounterPadded.")]
740 IAllowFileSettings WithNextFilePattern(Enums.NextFilePattern nextFilePattern = Enums.NextFilePattern.CounterPadded);
744 [Action(Description =
"Copy the defined GPALFile(s) to a destination file or directory")]
745 void CopyTo(
string destination);
746 [Action(Description =
"Move the defined GPALFile(s) to a destination file or directory")]
747 void MoveTo(
string destination);
748 [Action(Description =
"Delete the destination file or files (wildcard) or all in the directory (no filename)")]
749 void Delete(
string destination);
750 [Action(Description =
"Delete the defined GPALFile underlying file(s)")]
755 [Settings(Description =
"Add a filename to the GPALFile list. Actual output filenames added to end.")]
757 [Settings(Description =
"A browser already holding the session a url needs. Set before .WithFileName. GPAL tries its own connection first and falls back to this browser, downloading in a new tab.")]
760 #endregion <File Interfaces>
762 public interface IGPALGrid<T> : IAllowGridActions<T>, IEnumerable<List<T>>
764 [Data(Description =
"The rows as a list")]
766 [Settings(Description =
"Enable duplicate-row detection for this grid when it is passed into GetGrid (off by default).")]
767 IGPALGrid<T> WithDedupeData(
bool useDedupe =
true);
769 public interface IAllowGridActions<T> : IAllowToGPALObject<IGPALGrid<T>>
771 [Action(Description =
"Add the rows of another grid")]
772 IAllowGridActions<T> Add(IGPALGrid<T> grid);
773 [Action(Description =
"Add a row")]
774 IAllowGridActions<T> AddRow(List<T> row);
775 [Action(Description =
"Add a column")]
776 IAllowGridActions<T> AddColumn(List<T> column);
777 int Rows { [Data(Description =
"How many rows the grid has")]
get; }
778 int Columns { [Data(Description =
"How many columns the grid has")]
get; }
779 IAllowGridActions<T> AddCell(T value,
int row,
int column);
780 T GetCell(
int row,
int column);
781 [Action(Description =
"Remove every row")]
782 IAllowGridActions<T> Clear();
783 [Action(Description =
"Remove the first or the last row")]
784 IAllowGridActions<T> DeleteRow(RowPosition rowPosition = RowPosition.Last);
785 [Action(Description =
"Read rows from a file")]
786 IAllowGridActions<T> InputFrom(
GPALFile input);
787 [Action(Description =
"Write the rows to a file")]
788 IAllowGridActions<T> SaveTo(
GPALFile output);
789 [Action(Description =
"Read rows from a database")]
791 [Action(Description =
"Write the rows to a database")]
793 List<T>
this[
int index] { [Data(Description =
"The row at the given index")]
get;
set; }
794 T
this[
int row,
int column] {
get;
set; }
795 [Data(Description =
"How many rows the grid has")]
797 [Data(Description =
"Whether any row holds the given value")]
798 bool Contains(T value);
799 [Action(Description =
"A copy of the grid")]
800 public object Clone();
803 #region <Email Interfaces>
807 string SMTPServerName { [Data(Description =
"The SMTP server mail is sent through, as set by WithSMTPServerName or read from a settings file")]
get; }
808 int SMTPPortNum { [Data(Description =
"The port used to reach SMTPServerName")]
get; }
809 string IMAPServerName { [Data(Description =
"The IMAP server mail is read from, null when a POP server is the one named")]
get; }
810 int IMAPPortNum { [Data(Description =
"The port used to reach IMAPServerName")]
get; }
811 string POPServerName { [Data(Description =
"The POP server mail is read from, null when an IMAP server is the one named")]
get; }
812 int POPPortNum { [Data(Description =
"The port used to reach POPServerName")]
get; }
813 string FromAddress { [Data(Description =
"The address messages are sent from, as text, with the display name when there is one")]
get; }
815 DateTime? Sent { [Data(Description =
"When the last Send went out, null when it did not")]
get; }
817 GPALMail.MailError LastError { [Data(Description =
"The last failure, or null when the last call did not fail")]
get; }
821 [Settings(Description =
"The IMAP server to receive from, by host name")]
823 [Settings(Description =
"The port the IMAP server listens on")]
825 [Settings(Description =
"The POP3 server to receive from, by host name")]
827 [Settings(Description =
"The port the POP3 server listens on")]
829 [Settings(Description =
"The SMTP server to send through, by host name")]
831 [Settings(Description =
"The port the SMTP server listens on")]
833 [Settings(Description =
"Send even when the server's certificate cannot be validated. Off unless asked for, and it means nothing checks who is on the other end")]
835 [Settings(Description =
"The credential to authenticate with, whose username and password win over WithUserName and WithPassword")]
837 [Settings(Description =
"The account name to sign in to the mail server with")]
839 [Settings(Description =
"The password to sign in to the mail server with")]
844 [Action(Description =
"Send the message the envelope settings built")]
846 [Action(Description =
"Read waiting mail from the IMAP or POP server")]
848 [Action(Description =
"Read the mail and hand back the messages")]
850 [Action(Description =
"Write every attachment on every message received into the given directory")]
852 [Action(Description =
"Mark every message Receive collected as read on the server, in one connection. IMAP only.")]
854 [Action(Description =
"Delete every message Receive collected from the server, in one connection. IMAP only.")]
856 [Action(Description =
"Empty the envelope so the next message starts from nothing")]
858 [Action(Description =
"Read the mail server settings from a file, or from the default settings file when none is named")]
860 [Action(Description =
"Write the mail server settings to a file, or to the default settings file when none is named")]
865 [Settings(Description =
"The address the mail is sent from")]
867 [Settings(Description =
"Add a recipient")]
869 [Settings(Description =
"Add a copy recipient")]
871 [Settings(Description =
"Add a blind copy recipient")]
873 [Settings(Description =
"Add recipients, one per entry")]
875 [Settings(Description =
"Add copy recipients, one per entry")]
877 [Settings(Description =
"Add blind copy recipients, one per entry")]
879 [Settings(Description =
"Attach a file to the message. Call it again for each further attachment")]
881 [Settings(Description =
"The body text of the message")]
883 [Settings(Description =
"The subject line of the message")]
888 [Settings(Description =
"Fetch only the messages the server still has as unread. Every message when false, which is the default.")]
890 [Settings(Description =
"The most messages one Receive may fetch, newest first. Every message by default.")]
893 public interface IAllowName { [Settings(Description =
"Sets the display name on the address added just before this call, whether that was the from, a to, a cc or a bcc")]
IAllowEmailEnvelopeAndActions WithName(
string name); }
898 , IAllowToGPALObject<IGPALMail>
903 , IAllowToGPALObject<IGPALMail>
910 #endregion <Email Interfaces>
915 string LogDirectory { [Data(Description =
"The folder the last entry was written to, with DirectoryStructure applied, e.g. logs/231")]
get; }
916 string LogFilename { [Data(Description =
"The name of the file the last entry was written to, with FilenamePattern applied, e.g. DeadMikes_20260819.log")]
get; }
917 string LogFullPath { [Data(Description =
"LogDirectory and LogFilename joined: the file the last entry went into")]
get; }
921 [Settings(Description =
"Write log entries to this database rather than to a file")]
923 [Settings(Description =
"The directory the log files are written under")]
925 [Settings(Description =
"How the directories under the root are named, by year, month, day and hour in the combination chosen. None writes them all in the root")]
927 [Settings(Description =
"The name of the log file")]
929 [Settings(Description =
"How the filename varies from one file to the next, by date and time down to the part chosen. None keeps one file")]
931 [Settings(Description =
"Which event types this logger writes, published or called directly. Defaults to all")]
933 [Settings(Description =
"The character written between the fields on a line")]
935 [Settings(Description =
"How the date and time are written at the start of each entry")]
943 [Action(Description =
"Saves the loaded workbook(s) to the file(s) matching gpalFile's filenames (which may include wildcard patterns), or to _gpalFile if gpalFile is null")]
945 [Action(Description =
"Append every row read into this grid. Pass null and GPAL makes one, the same as GetGrid")]
947 [Action(Description =
"Write the range read into the sheet at this 1-based index, creating it if it is missing")]
949 [Action(Description =
"Writes the previously read range data into the sheet named sheetName of every loaded workbook, creating the sheet if it does not exist")]
951 [Action(Description =
"Closes every loaded workbook, optionally saving each back to its source path first, and clears all cached state")]
952 void Close(
bool saveOnClose);
958 [Settings(Description =
"The workbook to read, by name or by a wildcard naming several")]
960 [Settings(Description =
"Start a workbook of your own at this name, with one sheet and nothing in it. Nothing is written until SaveTo or Close(true)")]
967 [Settings(Description =
"The sheet to work on, counting from 1, which is the sheet a workbook opens on")]
969 [Settings(Description =
"The sheet to work on, by name")]
971 [Settings(Description =
"Add a sheet of this name and work on it. Called once per tab a workbook is to hold")]
978 [Data(Description =
"Compares each previously read range against grid, recording any cell-level differences for retrieval via GetCompareResults")]
980 [Data(Description =
"Compare each range read against the same range in another workbook, recording the differences")]
982 [Data(Description =
"Compare each range read against the same range on the selected sheet, recording the differences")]
989 [Action(Description =
"Write a grid into the sheet, at the cell WithCell named or A1. This is how data of your own gets into a workbook")]
991 [Settings(Description =
"Read the cell range from the selected sheet of every loaded workbook, for the steps that follow")]
993 [Action(Description =
"Writes the range data previously read via WithRange (or another data-producing operation) to range on the currently selected sheet of every loaded workbook")]
995 [Action(Description =
"Clears any range data read via WithRange, WithColumn, or WithRowNumber, along with any comparison differences accumulated by the CompareTo* methods")]
997 [Settings(Description =
"The cell, such as B3, that the cell steps that follow work on")]
999 [Settings(Description =
"Sets the value to search for in subsequent ReplaceWith operations")]
1001 [Settings(Description =
"Read every value in the column from the selected sheet")]
1003 [Settings(Description =
"Read every value in the row from the selected sheet")]
1005 [Action(Description =
"Sums every numeric value across all previously read range data (non-numeric values are ignored)")]
1007 [Action(Description =
"Counts every non-empty value across all previously read range data")]
1009 [Data(Description =
"The differences the CompareTo steps found, as a grid")]
1016 [Settings(Description =
"Sets where InsertValue places its value relative to the current cell content: 0 inserts before the existing content, any other value inserts after")]
1018 [Settings(Description =
"Sets the separator that InsertValue places between the inserted value and the cell's existing content")]
1020 [Action(Description =
"Insert the value into the cell chosen with WithCell, joined to what is there by the WithInsertSeparator text")]
1022 [Action(Description =
"Sets the value of the cell selected via WithCell on every loaded workbook, replacing any existing content")]
1024 [Action(Description =
"Appends value to the end of the existing content of the cell selected via WithCell on every loaded workbook")]
1026 [Action(Description =
"Prepends value to the beginning of the existing content of the cell selected via WithCell on every loaded workbook")]
1033 [Action(Description =
"Replace every cell in the range holding the search value with this one")]
1035 [Action(Description =
"Every cell in the range holding the search value, as a grid of File, Sheet, Cell, Row, Column, with a header row. Empty apart from the header when nothing matched")]
1048 [Settings(Description =
"The executable to run, or a url or document to open with whatever is registered for it")]
1050 [Settings(Description =
"Add one argument. Called once per argument, so a path with a space in it needs nothing done to it")]
1052 [Settings(Description =
"A name for this launcher, used in the events it publishes")]
1054 [Settings(Description =
"The directory the process starts in. Set before Launch, because that is when the process is built")]
1056 [Settings(Description =
"An environment variable the process starts with. Called once per variable")]
1058 [Settings(Description =
"Where each line the process writes to standard output goes")]
1060 [Settings(Description =
"Where each line the process writes to standard error goes")]
1062 [Action(Description =
"Start the process with everything set above it")]
1071 [Action(Description =
"Whether the process is still running")]
1073 [Action(Description =
"Wait up to this many milliseconds for the process to end")]
1080 [Action(Description =
"Stop the process. What it started keeps running; KillTree is for those")]
1082 [Action(Description =
"Stop the process and everything it started, children first so nothing is orphaned")]
1090 [Settings(Description =
"Sets the API base URL with download path", Submenu =
"Request")]
1093 [Action(Description =
"Load an OpenAPI description so its endpoints can be called by name")]
1095 [Action(Description =
"Load an OpenAPI description so its endpoints can be called by name")]
1101 [Settings(Description =
"Sets the endpoint as a string", Submenu =
"Request")]
1103 [Settings(Description =
"Sets the endpoint from an ApiEndpoint enum", Submenu =
"Request")]
1105 [Settings(Description =
"Sets the result name for the next execution", Submenu =
"Request")]
1107 [Settings(Description =
"Sets the client name", Submenu =
"Request")]
1109 [Action(Description =
"List the endpoints the loaded OpenAPI description offers")]
1115 [Settings(Description =
"Sets the URL parameter", Submenu =
"Navigation")]
1117 [Data(Description =
"Sets the URL from a result by index", Submenu =
"From Result")]
1119 [Data(Description =
"Sets the URL from a result by name", Submenu =
"From Result")]
1121 [Settings(Description =
"Sets the tab ID parameter", Submenu =
"Navigation")]
1123 [Data(Description =
"Sets the tab ID from a result by index", Submenu =
"From Result")]
1125 [Data(Description =
"Sets the tab ID from a result by name", Submenu =
"From Result")]
1127 [Settings(Description =
"Sets the window ID parameter", Submenu =
"Navigation")]
1129 [Data(Description =
"Sets the window ID from a result by index", Submenu =
"From Result")]
1131 [Data(Description =
"Sets the window ID from a result by name", Submenu =
"From Result")]
1133 [Settings(Description =
"Sets the storage path parameter", Submenu =
"Storage")]
1135 [Settings(Description =
"Sets the key parameter", Submenu =
"Storage")]
1137 [Data(Description =
"Sets the key from a result by index", Submenu =
"From Result")]
1139 [Data(Description =
"Sets the key from a result by name", Submenu =
"From Result")]
1141 [Settings(Description =
"Sets the CSS parameter", Submenu =
"Element")]
1143 [Data(Description =
"Sets the CSS from a result by index", Submenu =
"From Result")]
1145 [Data(Description =
"Sets the CSS from a result by name", Submenu =
"From Result")]
1147 [ElementAssitant(Description =
"Sets the element parameter")]
1149 [Settings(Description =
"Sets the XPath parameter", Submenu =
"Element")]
1151 [Data(Description =
"Sets the XPath from a result by index", Submenu =
"From Result")]
1153 [Data(Description =
"Sets the XPath from a result by name", Submenu =
"From Result")]
1155 [Settings(Description =
"Sets the pixels parameter", Submenu =
"Drag and Scroll")]
1157 [Data(Description =
"Sets the pixels from a result by index", Submenu =
"From Result")]
1159 [Data(Description =
"Sets the pixels from a result by name", Submenu =
"From Result")]
1161 [Settings(Description =
"Sets the referrer parameter", Submenu =
"Navigation")]
1163 [Data(Description =
"Sets the referrer from a result by index", Submenu =
"From Result")]
1165 [Data(Description =
"Sets the referrer from a result by name", Submenu =
"From Result")]
1167 [Settings(Description =
"Sets the text parameter", Submenu =
"Element")]
1169 [Data(Description =
"Sets the text from a result by index", Submenu =
"From Result")]
1171 [Data(Description =
"Sets the text from a result by name", Submenu =
"From Result")]
1173 [Action(Description =
"Where a file the browser downloads should end up")]
1175 [Action(Description =
"Saves the response to a file if the endpoint returns a downloadable content")]
1177 [Settings(Description =
"Sets the element ID parameter", Submenu =
"Element")]
1179 [Data(Description =
"Sets the element from a result by index", Submenu =
"From Result")]
1181 [Data(Description =
"Sets the element from a result by name", Submenu =
"From Result")]
1183 [Action(Description =
"Sets the value of the destination element identified by destSelector from the source element identified by the preceding WithCss or WithElementId call")]
1185 [Data(Description =
"Sets the horizontal pixels from a result by index", Submenu =
"From Result")]
1187 [Data(Description =
"Sets the horizontal pixels from a result by name", Submenu =
"From Result")]
1189 [Data(Description =
"Sets the vertical pixels from a result by index", Submenu =
"From Result")]
1191 [Data(Description =
"Sets the vertical pixels from a result by name", Submenu =
"From Result")]
1193 [Settings(Description =
"Sets the CSS parameter", Submenu =
"Request")]
1199 [Settings(Description =
"Sets the HTTP method", Submenu =
"Request")]
1205 [Settings(Description =
"Specifies the value for SetRange operation", Submenu =
"Element")]
1210 [Fluent(Description =
"Executes the request synchronously with type")]
1211 string Execute(
bool publishEvent =
true);
1212 [Fluent(Description =
"Executes the request synchronously with type")]
1213 T Execute<T>(
bool publishEvent =
true);
1214 [Fluent(Description =
"Executes and chains the request with type")]
1216 [Fluent(Description =
"Executes and chains the request with type")]
1218 [Action(Description =
"Executes the request asynchronously with type")]
1219 Task<string> ExecuteAsync(
bool publishEvent =
true);
1220 [Action(Description =
"Executes the request asynchronously with type")]
1221 Task<T> ExecuteAsync<T>(
bool publishEvent =
true);
1222 [Data(Description =
"The results of the calls made so far")]
1224 [Data(Description =
"Every result stored under name, in the order it was stored, so a loop that ran five times answers with five")]
1225 IReadOnlyList<object> GetExecutionResults(
string name);
1226 [Action(Description =
"Empties what WithResultName has stored, so GetExecutionResults answers about what has happened since rather than everything since the client was made")]
1229 [Settings(Description =
"How long one attempt is given before it is abandoned", Submenu =
"Request")]
1235 [Settings(Description =
"Sets parameters as a variable argument list", Submenu =
"Request")]
1237 [Settings(Description =
"Sets parameters as a single object", Submenu =
"Request")]
1239 [Data(Description =
"Sets parameters from a result by index", Submenu =
"From Result")]
1241 [Data(Description =
"Sets parameters from a result by name", Submenu =
"From Result")]
1243 [Settings(Description =
"Specifiy the encoiding type for posted parameters: json or urlencoded", Submenu =
"Request")]
1249 [Workflow(Description =
"Adds a workflow definition")]
1251 [Workflow(Description =
"Gets the execution results")]
1253 [Workflow(Description =
"Executes workflows while condition holds")]
1255 [Workflow(Description =
"Executes workflows until condition holds")]
1261 [Settings(Description =
"Sets the timeout in milliseconds", Submenu =
"Network Idle")]
1263 [Settings(Description =
"Sets the prune interval in milliseconds", Submenu =
"Network Idle")]
1265 [Settings(Description =
"Sets the maximum connections", Submenu =
"Network Idle")]
1271 [Settings(Description =
"Sets the horizontal pixels parameter", Submenu =
"Drag and Scroll")]
1273 [Settings(Description =
"Sets the vertical pixels parameter", Submenu =
"Drag and Scroll")]
1279 [Settings(Description =
"Sets the horizontal drop offset for a drag-and-drop operation", Submenu =
"Drag and Scroll")]
1281 [Settings(Description =
"Sets the vertical drop offset for a drag-and-drop operation", Submenu =
"Drag and Scroll")]
1283 [Settings(Description =
"Sets the horizontal grab offset within the element for a drag-and-drop operation", Submenu =
"Drag and Scroll")]
1285 [Settings(Description =
"Sets the vertical grab offset within the element for a drag-and-drop operation", Submenu =
"Drag and Scroll")]
1291 [Data(Description =
"Specifies the attribute name for get or set operation")]
1293 [Settings(Description =
"Specifies the value for set operation", Submenu =
"Element")]
1299 [Settings(Description =
"Sets the text parameter")]
1305 [Settings(Description =
"Set the value to choose from the Select menu", Submenu =
"Element")]
1307 [Settings(Description =
"Pick the option at this index", Submenu =
"Element")]
1312 [Settings(Description =
"The name the download is saved as", Submenu =
"Files")]
1317 [Settings(Description =
"Sets the timeout in milliseconds", Submenu =
"Files")]
1319 [Settings(Description =
"Sets the timeout in milliseconds", Submenu =
"Files")]
1325 [Settings(Description =
"Records only the calls whose url holds this, so a page that talks to a dozen places narrows to the one worth having", Submenu =
"Calls")]
1327 [Settings(Description =
"Forgets what was already recorded before starting, so a second capture is not read as the first", Submenu =
"Calls")]
1333 [
Browser(Description =
"Sets the storage domain parameter")]
1335 [
Browser(Description =
"Sets the storage path parameter")]
1337 [
Browser(Description =
"Sets the storage key parameter")]
1339 [
Browser(Description =
"Sets the storage domain parameter")]
1341 [Settings(Description =
"Sets the set storage data parameter", Submenu =
"Request")]
1343 [Settings(Description =
"Delete the storage on every origin, not only the current one", Submenu =
"Storage")]
1350 [
Browser(Description =
"Navigates browser history back", Submenu =
"Navigation")]
1352 [Action(Description =
"Get a screenshot of the current tab visble contents", Submenu =
"Page")]
1354 [
Browser(Description =
"Closes a tab by URL", Submenu =
"Tabs")]
1356 [
Browser(Description =
"Closes a tab by tab ID", Submenu =
"Tabs")]
1358 [
Browser(Description =
"Closes a window by URL, optionally switching to the main window", Submenu =
"Windows")]
1360 [
Browser(Description =
"Closes every window the browser has, which is how it is asked to quit", Submenu =
"Windows")]
1362 [
Browser(Description =
"Closes a window by window ID, optionally switching to the main window", Submenu =
"Windows")]
1364 [Action(Description =
"Delete the specified storage type", Submenu =
"Storage")]
1366 [Action(Description =
"Executes JavaScript code", Submenu =
"Page")]
1368 [
Browser(Description =
"Registers a script to run on every new document load", Submenu =
"Scripts")]
1370 [
Browser(Description =
"Removes all scripts previously registered via InjectScript", Submenu =
"Scripts")]
1372 [Action(Description =
"Appends text to an element", Submenu =
"Input")]
1374 [Action(Description =
"Appends text to an element", Submenu =
"Input")]
1376 [Action(Description =
"Appends text to an element", Submenu =
"Input")]
1378 [
Browser(Description =
"Navigates browser history forward", Submenu =
"Navigation")]
1380 [
Browser(Description =
"Sets browser to full screen", Submenu =
"Windows")]
1382 [Data(Description =
"Gets the ready status", Submenu =
"Page")]
1384 [Action(Description =
"Checks if network is idle with max connections", Submenu =
"Page")]
1386 [Data(Description =
"Gets the shadow root for a CSS selector", Submenu =
"Find Elements")]
1388 [Data(Description =
"Get the specified storage type", Submenu =
"Page")]
1390 [
Browser(Description =
"Gets the current URL", Submenu =
"Navigation")]
1392 [
Browser(Description =
"Gets the current window's ID and URL", Submenu =
"Windows")]
1394 [Data(Description =
"Gets the current URL and the document identity in one call", Submenu =
"Page")]
1396 [Data(Description =
"Gets the page title, the __NEXT_DATA__ payload and any React Flight chunks, read from the document rather than its markup", Submenu =
"Page")]
1398 [Data(Description =
"Get the options in a Select manue", Submenu =
"Element")]
1400 [Data(Description =
"Gets the browser's preferred languages, most preferred first", Submenu =
"Page")]
1402 [Action(Description =
"Starts or stops recording what the page asks for", Submenu =
"Page")]
1404 [Data(Description =
"Everything recorded so far, oldest first, as the json the extension keeps", Submenu =
"Page")]
1406 [Data(Description =
"Gets the user agent", Submenu =
"Page")]
1408 [
Browser(Description =
"Navigates to a URL", Submenu =
"Navigation")]
1410 [
Browser(Description =
"Navigates to a tab by URL", Submenu =
"Tabs")]
1412 [
Browser(Description =
"Navigates to a tab by tab ID", Submenu =
"Tabs")]
1414 [
Browser(Description =
"Switches to a window by URL", Submenu =
"Windows")]
1416 [
Browser(Description =
"Switches to a window by window ID", Submenu =
"Windows")]
1418 [
Browser(Description =
"Maximizes the browser window", Submenu =
"Windows")]
1420 [
Browser(Description =
"Minimizes the browser window", Submenu =
"Windows")]
1422 [Action(Description =
"Moves to an element", Submenu =
"Mouse")]
1424 [Action(Description =
"Opens a new tab with optional URL", Submenu =
"Tabs and Windows")]
1426 [
Browser(Description =
"Switches to the next tab", Submenu =
"Tabs")]
1428 [
Browser(Description =
"How many tabs the browser actually has open, which is not the same as how many GPAL opened", Submenu =
"Tabs")]
1430 [
Browser(Description =
"Switches to the next window", Submenu =
"Windows")]
1432 [
Browser(Description =
"Restores the browser window to normal", Submenu =
"Windows")]
1434 [Action(Description =
"Opens a new window with the specified URL", Submenu =
"Tabs and Windows")]
1436 [Action(Description =
"Overrides the referrer URL", Submenu =
"Referrer and User Agent")]
1438 [Scroll(Description =
"Scrolls the page down by pages")]
1440 [Scroll(Description =
"Scrolls to the page end")]
1442 [Scroll(Description =
"Scrolls to the page top")]
1444 [Scroll(Description =
"Scrolls the page up by pages")]
1446 [Data(Description =
"Press the modifier keys specified", Submenu =
"Keyboard")]
1448 [
Browser(Description =
"Switches to the previous tab", Submenu =
"Tabs")]
1450 [
Browser(Description =
"Switches to the next window", Submenu =
"Windows")]
1452 [
Browser(Description =
"Refreshes the current page", Submenu =
"Navigation")]
1454 [Data(Description =
"Press the modifier keys specified", Submenu =
"Keyboard")]
1456 [
Browser(Description =
"Restores the browser window", Submenu =
"Windows")]
1458 [Scroll(Description =
"Scrolls the window horizontally by pixels")]
1460 [Scroll(Description =
"Scrolls the window vertically by pixels")]
1468 [Data(Description =
"Sends a key", Submenu =
"Keyboard")]
1470 [Data(Description =
"Starts setting an attribute of an element by ID", Submenu =
"Keyboard")]
1472 [Action(Description =
"Set data for the specified storage type", Submenu =
"Storage")]
1474 [Action(Description =
"Overrides the browser's user agent string", Submenu =
"Referrer and User Agent")]
1476 [Action(Description =
"Overrides referrer stealthily - sets to google.com", Submenu =
"Referrer and User Agent")]
1478 [
Browser(Description =
"Switches to default content", Submenu =
"Frames")]
1480 [
Browser(Description =
"Switches to an element to search for selectors contained", Submenu =
"Frames")]
1482 [
Browser(Description =
"Switches to a frame", Submenu =
"Frames")]
1484 [
Browser(Description =
"Switches to a shadow root", Submenu =
"Frames")]
1486 [Data(Description =
"Gets the workflow", Submenu =
"Recorder")]
1488 [Data(Description =
"Gets settings", Submenu =
"Recorder")]
1490 [Data(Description =
"Gets GPAL settings", Submenu =
"Recorder")]
1492 [Data(Description =
"Gets browser settings", Submenu =
"Recorder")]
1494 [Action(Description =
"Fires a change event on an element by ID", Submenu =
"Input")]
1496 [Action(Description =
"Focuses an element by ID", Submenu =
"Mouse")]
1498 [Data(Description =
"Gets the bounding client rect of an element by ID", Submenu =
"Element")]
1503 [Data(Description =
"Gets the attribute hash of an element", Submenu =
"Element")]
1505 [Action(Description =
"The HTML of the page", Submenu =
"Page")]
1507 [Data(Description =
"Gets the parent node of an element by ID", Submenu =
"Find Elements")]
1509 [Data(Description =
"The content and styles of the element", Submenu =
"Element")]
1511 [Data(Description =
"The computed styles of the element", Submenu =
"Element")]
1513 [Data(Description =
"The attributes of the element", Submenu =
"Element")]
1515 [Data(Description =
"The DOM properties of the element", Submenu =
"Element")]
1517 [
Browser(Description =
"The position and size of the browser window", Submenu =
"Windows")]
1519 [Action(Description =
"Hides an element by ID", Submenu =
"Input")]
1521 [Data(Description =
"Checks if an element is clickable by ID", Submenu =
"Element")]
1523 [Data(Description =
"Checks if an element is displayed by ID", Submenu =
"Element")]
1525 [Data(Description =
"Checks if an element is enabled by ID", Submenu =
"Element")]
1527 [Scroll(Description =
"Checks if the page is at the end")]
1529 [Data(Description =
"Checks if an element is visible in viewport by ID", Submenu =
"Element")]
1531 [Action(Description =
"Performs a left click on an element by ID", Submenu =
"Clicks")]
1533 [Action(Description =
"Performs a left click and download on an element", Submenu =
"Files")]
1535 [Action(Description =
"The name the next download is saved as", Submenu =
"Files")]
1537 [Action(Description =
"Purely headless mode, attaches the file to the input[type=file]", Submenu =
"Files")]
1539 [Action(Description =
"Performs a left double click on an element by ID", Submenu =
"Clicks")]
1541 [Action(Description =
"Performs a left click on an element by ID", Submenu =
"Clicks")]
1543 [Action(Description =
"Performs a right click on an element by ID", Submenu =
"Clicks")]
1545 [Scroll(Description =
"Scrolls an element into view by ID")]
1547 [Data(Description =
"Gets the window inner height", Submenu =
"Window")]
1549 [Data(Description =
"Gets the window inner width", Submenu =
"Window")]
1551 [Data(Description =
"Gets the window outer height", Submenu =
"Window")]
1553 [Data(Description =
"Gets the window outer width", Submenu =
"Window")]
1555 [Fluent(Description =
"Send an API request from inside the page, carrying the browser's cookies, TLS fingerprint and headers")]
1557 [Settings(Description =
"Sets the verb of the request being fetched", Submenu =
"Request")]
1559 [Settings(Description =
"Sets the body of the request being fetched", Submenu =
"Request")]
1561 [Settings(Description =
"Sets the content type of the body of the request being fetched", Submenu =
"Request")]
1563 [Settings(Description =
"Sets extra headers for the request being fetched, flattened to name, value, name, value", Submenu =
"Request")]
1565 [Settings(Description =
"True to bring the fetched response body back base64 encoded, which is what a file needs", Submenu =
"Request")]
1567 [Data(Description =
"Gets the window page offset X", Submenu =
"Window")]
1569 [Data(Description =
"Gets the window page offset Y", Submenu =
"Window")]
1571 [Data(Description =
"Gets the window screen left position", Submenu =
"Window")]
1573 [Data(Description =
"Gets the window screen top position", Submenu =
"Window")]
1575 [Action(Description =
"Hovers over an element by ID", Submenu =
"Mouse")]
1577 [Data(Description =
"Evaluates an XPath expression", Submenu =
"Find Elements")]
1579 [Data(Description =
"Evaluates an XPath expression for multiple elements", Submenu =
"Find Elements")]
1581 [Data(Description =
"Queries a single element using a CSS selector", Submenu =
"Find Elements")]
1583 [Data(Description =
"Queries multiple elements using a CSS selector", Submenu =
"Find Elements")]
1585 [Data(Description =
"Evaluates an XPath expression", Submenu =
"Find Elements")]
1587 [Data(Description =
"Evaluates an XPath expression for multiple elements", Submenu =
"Find Elements")]
1589 [Data(Description =
"Queries a single element using a CSS selector", Submenu =
"Find Elements")]
1591 [Data(Description =
"Queries multiple elements using a CSS selector", Submenu =
"Find Elements")]
1594 [
Browser(Description =
"Top the browser, bring it into focus", Submenu =
"Windows")]
1596 [Action(Description =
"Clears the referrer", Submenu =
"Referrer and User Agent")]
1601 [Action(Description =
"Click a Select menu option", Submenu =
"Clicks")]
1603 [Action(Description =
"Starts setting an attribute of an element by ID", Submenu =
"Input")]
1605 [Scroll(Description =
"Starts scrolling an element by ID")]
1608 [Action(Description =
"Drags an element from its current position by the given offset and drops it", Submenu =
"Mouse")]
1610 [Data(Description =
"Starts getting an attribute of an element by ID", Submenu =
"Element")]
1618 string Name { [Data(Description =
"Gets or sets the client name")]
get; }
1621 int StatusCode { [Data(Description =
"The HTTP status code the last call came back with")]
get; }
1624 int RetryAfterSeconds { [Data(Description =
"The seconds the last call was asked to wait before asking again, zero when it was not asked")]
get; }
1635 string TagName {
get; }
1636 string Text {
get; }
1637 bool Enabled {
get; }
1638 bool Selected {
get; }
1639 bool? Checked {
get; }
1640 bool Displayed {
get; }
1641 Point Location {
get; }
1643 string GetAttribute(
string attributeName);
1644 void SetAttribute(
string attributeName,
string value);
1645 string GetCssValue(
string propertyName);
1646 string GetDomAttribute(
string attributeName);
1647 string GetDomProperty(
string propertyName);
1649 void Click(ModifierKeys modifierKeys);
1650 void MiddleClick(ModifierKeys modifierKeys = ModifierKeys.NONE);
1652 void SendKeys(
string text);
1655 Dictionary<string, object> Attributes {
get; }
1656 Dictionary<string, object> CssAttributes {
get; }
1657 Dictionary<string, object> DomAttributes {
get; }
1658 Dictionary<string, object> DomProperties{
get; }
1659 string AttributeName {
get; }
1660 string Href {
get; }
1662 string Value {
get; }
1663 string Placeholder {
get; }
1664 string Xpath {
get; }
1667 string FullXPath {
get; }
1675 string PageURL {
get; }
1677 dynamic WebElement {
get; }
1678 bool IsClickable(
bool publishEvent =
true);
1683 #endregion GPALElement
1684 #region Cryptography
1687 [Action(Description =
"Generate a random initialization vector")]
1693 [Settings(Description =
"The data to work on")]
1699 [Action(Description =
"Encrypt the data")]
1705 [Action(Description =
"Decrypt the data")]
1711 [Action(Description =
"Sign the data")]
1717 [Action(Description =
"Check the signature against the data")]
1723 [Action(Description =
"Hash the data")]
1729 [Action(Description =
"Generate a random key")]
1739 [Settings(Description =
"The algorithm to use")]
1741 [Settings(Description =
"The key to use")]
1743 [Settings(Description =
"The initialization vector to use")]
1745 [Settings(Description =
"The cipher mode")]
1747 [Settings(Description =
"The padding mode")]
1749 [Settings(Description =
"The salt for deriving a key from a password")]
1751 [Settings(Description =
"How many rounds of key derivation")]
1753 [Settings(Description =
"The signature to verify")]
1777 #endregion Cryptography
1781 [Action(Description =
"Runs the 'Given' precondition step immediately")]
1783 IAllowWhen Given<T1>(Action<T1> step, T1 arg1);
1784 IAllowWhen Given<T1, T2>(Action<T1, T2> step, T1 arg1, T2 arg2);
1785 IAllowWhen Given<T1, T2, T3>(Action<T1, T2, T3> step, T1 arg1, T2 arg2, T3 arg3);
1790 [Fluent(Description =
"Runs the 'When' action step immediately")]
1792 IAllowAnd When<T1>(Action<T1> step, T1 arg1);
1793 IAllowAnd When<T1, T2>(Action<T1, T2> step, T1 arg1, T2 arg2);
1794 IAllowAnd When<T1, T2, T3>(Action<T1, T2, T3> step, T1 arg1, T2 arg2, T3 arg3);
1799 [Fluent(Description =
"Runs an additional 'And' step immediately")]
1801 IAllowThen And<T1>(Action<T1> step, T1 arg1);
1802 IAllowThen And<T1, T2>(Action<T1, T2> step, T1 arg1, T2 arg2);
1803 IAllowThen And<T1, T2, T3>(Action<T1, T2, T3> step, T1 arg1, T2 arg2, T3 arg3);
1808 [Fluent(Description =
"Runs the 'Then' assertion/outcome step immediately")]
1810 IAllowThen Then<T1>(Action<T1> step, T1 arg1);
1811 IAllowThen Then<T1, T2>(Action<T1, T2> step, T1 arg1, T2 arg2);
1812 IAllowThen Then<T1, T2, T3>(Action<T1, T2, T3> step, T1 arg1, T2 arg2, T3 arg3);
1815 #region <Request Settings>
1816 [Interface(Description =
"Describe an API request for .Fetch to issue from inside the page")]
1819 [Settings(Description =
"Replace a query parameter's value with the next numbered token")]
1821 [Settings(Description =
"Path or full URL to request. A path rides the origin the browser is already on")]
1823 [Settings(Description =
"HTTP method, for example GET, POST, PUT, DELETE. [GET (default)]")]
1825 [Settings(Description =
"Add a query parameter written as \"name=value\". Call once per parameter")]
1827 [Settings(Description =
"Add a request header written as \"Name: value\". Call once per header")]
1829 [Settings(Description =
"Body to send, used as-is")]
1831 [Settings(Description =
"Content type of the body. [application/json (default)]")]
1833 [Settings(Description =
"What this API calls its first page, which the page token counts on from. [0 (default)]")]
1835 [Settings(Description =
"The marker replaced with the page number, wherever it appears in the path, a parameter value, a header value or the body. Give it a numbered token to hand GPAL one of the token positions. [{page} (default)]")]
1837 [Settings(Description =
"Handler called after each row of tokens is fetched, with that row's pages. Return -1 to stop")]
1839 [Settings(Description =
"Name of request (used in messages and errors)")]
1840 IAllowToGPALObject<GPALRequest> WithName(
string name);
1842 #endregion <Request Settings>
1843 public interface IAllowToGPALObject<TResult>
1845 [Fluent(Description =
"Ends a declaration or workflow, returning a GPAL object which can be assigned. Use instead of an explicit cast. [ Selector mySel = GPAL.Selector.WithCSS(css).ToGPALObject() ]")]
1846 TResult ToGPALObject();
1853 [Settings(Description =
"The Google account to upload as")]
1855 [Settings(Description =
"The title of the video")]
1857 [Settings(Description =
"The description of the video")]
1859 [Settings(Description =
"The tags for the video")]
1861 [Settings(Description =
"Public, unlisted or private")]
1862 IGPALYouTube WithPrivacy(Enums.YouTubePrivacy privacy);
1863 [Settings(Description =
"The YouTube category for the video")]
1864 IGPALYouTube WithCategory(Enums.YouTubeCategory category);
1865 [Action(Description =
"Upload the video file with the title, description and settings given")]
1868 [Settings(Description =
"The uploaded video the next steps work on")]
1870 [Settings(Description =
"The uploaded videos the next steps work on")]
1871 IGPALYouTube WithVideos(IEnumerable<Browser.YouTubeUploadResult> results);
1872 [Wait(Description =
"Wait for YouTube to finish processing, checking every so many seconds")]
1873 IGPALYouTube WaitForProcessing(
int pollIntervalSeconds = 60);
1874 [Settings(Description =
"Pipes scheduling status to a TextBox or RichTextBox on a WinForms form")]
1875 IGPALYouTube WithOutputTo(System.Windows.Forms.TextBoxBase control);
1876 [Action(Description =
"Starts a background thread that polls each video's processing status and schedules a premiere as each one completes")]
1878 [Wait(Description =
"Blocks the calling thread until ScheduleAt finishes scheduling all videos")]
1879 void WaitForCompletion();
1881 [Settings(Description =
"The playlist the next steps work on")]
1883 [Action(Description =
"Create the playlist")]
1885 [Action(Description =
"Add the videos to the playlist")]
1888 [Settings(Description =
"The id of an existing video to work on")]
1890 [Settings(Description =
"What to search YouTube for")]
1892 [Settings(Description =
"What to search YouTube for")]
1894 [Data(Description =
"The videos the search found")]
1896 [Data(Description =
"The videos the search found")]
1899 [Data(Description =
"Every video on your channel, with its privacy, category and thumbnail")]
1901 [Data(Description =
"Every playlist on your channel")]
1903 [Data(Description =
"Every entry in the playlist, in playlist order")]
1905 [Settings(Description =
"The place in the playlist, counted from 0, that the videos are added at. [the end (default)]")]
1907 [Action(Description =
"Take the videos out of the playlist")]
1909 [Action(Description =
"Change the video's title, description, tags, category or privacy, keeping whatever is not given")]
1911 [Action(Description =
"Set the image as the video's thumbnail")]
1913 [Action(Description =
"Delete the video from YouTube")]
1915 [Action(Description =
"Upload a new file in place of the video, keeping its details, thumbnail and playlist places")]
Application object that contains the fluent methods to create your Application workflow....
delegate CallIfStatus CallIfDelegate(Application application, List< IGPALAutomationElement > foundElements, List< IGPALAutomationElement > matchedElements, Selector selector, bool matchedAll)
Delegate callback for the CallIfFound/CallIfNotFound EventHandlers which will be invoked when a selec...
Browser object that contains the fluent methods to create your Browser workflow. Instatiated using G...
delegate CallIfStatus CallOnFailDelegate(IBrowser browser, GPALFailure failure, string detail)
Delegate for the CallOnFail handler, invoked when something fails that the workflow,...
delegate CallIfStatus CallAfterFetchDelegate(IBrowser browser, List< string > results, IGPALGrid< string > tokens, int tokenIdx)
Delegate callback for the CallAfterFetch handler declared on a GPALRequest, invoked after each row of...
delegate CallIfStatus CallIfDelegate(IBrowser browser, List< IGPALElement > foundElements, List< IGPALElement > matchedElements, Selector selector, bool matchedAll)
Delegate callback for the CallIfFound/CallIfNotFound EventHandlers which will be invoked when a selec...
Represents a URL with optional pre-navigation storage cleanup / inspection actions....
A playlist on the authenticated channel, returned by GPALYouTube.GetMyPlaylists.
One entry in a playlist, returned by GPALYouTube.GetPlaylistItems. PlaylistItemId names the entry,...
Result returned by GPALYouTube.CreatePlaylist containing the playlist ID and public URL.
Result returned by GPALYouTube.Upload containing the assigned video ID, public URL,...
Video metadata returned by GPALYouTube.GetResults and GPALYouTube.GetMyVideos. Tags,...
Represents a client-side bounding rectangle (similar to DOMRect) with additional convenience properti...
Class to define database usage. Currently only used for input from a table, sql or stored procedure....
Pseudo element used in Applications and Browser workflows for image matching and unified automation....
GPAL File object instantied with GPAL.File Used to load tokens into a GPALGrid [rows/columns].
A GPAL multiline textare instantiated with GPAL.TextArea for use on GPAL forms. Callback EventHandle...
Everything starts here, all the GPAL controls and global settings using fluent syntax are here....
What went wrong on the last call, and enough about it to act on. Sent says whether the mail went....
Deserialized contents of a Google Cloud service account JSON key file, used by GoogleHandler....
Fluent REST client for making API calls with a chained interface. Supports defining workflows,...
GPAL Selector used to locate Application and Browser elements. Instantiated with GPAL....
delegate CallIfStatus webMatchingFunction(List< IGPALElement > foundElements, out List< IGPALElement > matchedElements, out bool matchedAll, Selector selector, bool ExactMatch=true)
Custom matching function, must return all matched elements and an indicator as to whether all element...
delegate CallIfStatus appMatchingFunction(List< GPALAutomationElement > foundElements, out List< GPALAutomationElement > matchedElements, out bool matchedAll, Selector selector, bool ExactMatch=true)
Custom matching function, must return all matched elements and an indicator as to whether all element...
Represents XPath matching information returned by advanced selector strategies.
IAllowAIOutput WithLiveInputFrom(GPALForm.GPALTextArea textArea, int debounceMilliseconds=500)
Like WithInputFrom(object), but also wires the control's TextChanged event (debounced) to call Execut...
IAllowAIOutput WithLiveInputFrom(GPALForm.GPALInput input, int debounceMilliseconds=500)
Like WithInputFrom(object), but also wires the control's TextChanged event (debounced) to call Execut...
The ways a credential can identify itself, which is everything WithService leads to.
IAllowParametersAndActions Execute(out List< int > rowCountsPerStatement)
Per-statement breakdown (via SqlCommand.StatementCompleted) instead of the single aggregate count.
SaveTo(...) already ran the read (an out parameter forces that), so chaining .Execute() afterward wou...
IAllowDatabaseSettings GetRowCount(out List< int > rowCountsPerTable)
Only SaveTo(out IGPALGrid<string>) returns this - meaningless for SaveTo(DataTable)/SaveTo(DataSet),...
What a database is, not what to do with it: the connection, the command, and the definitions of the p...
IAllowRESTExecution SendString(string text, int delayMs=0)
Simulates typing in OttoMagic: dispatches key events character-by-character. Honors GPAL....
int StatusCode
The HTTP status code the last call came back with.
int RetryAfterSeconds
The seconds the last call was asked to wait before asking again, zero when it was not asked.
Represents a premiere schedule time. Presets (In5Minutes, In1Hour, etc.) store a relative offset and ...