19using System.Collections.Concurrent;
20using System.Collections.Generic;
22using System.Threading;
23using System.Threading.Tasks;
31 internal class WorkflowManager
33 private readonly Browser _browser;
35 internal WorkflowManager(Browser browser)
37 _browser = browser ??
throw new ArgumentNullException(nameof(browser));
40 public IAllowWorkflowExecution WithWorkflow(Action<IBrowser> workflow)
43 GPAL.PublishSimpleEvent(GPALEventType.WARNING,
"Workflow is null in WithWorkflow. Adding empty workflow.", _browser, GPALObjectType.Browser);
44 _browser.BrowserSettings.Workflows.Add(workflow ?? (b => { }));
48 public IAllowBrowserActionOrAnySelector While(Func<Browser, bool> predicate)
50 if (_browser.BrowserSettings.Workflows.Count == 0)
52 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"No workflows defined for While. Continuing without execution.", _browser, GPALObjectType.Browser);
55 if (predicate ==
null)
57 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"Predicate is null for While. Continuing without execution.", _browser, GPALObjectType.Browser);
61 GPAL.PublishSimpleEvent(GPALEventType.INFO, $
"Starting While loop with [{_browser.BrowserSettings.Workflows.Count}] workflow(s).", _browser, GPALObjectType.Browser);
63 var startTime = DateTime.UtcNow;
66 while (predicate(_browser) && (DateTime.UtcNow - startTime).TotalMilliseconds < _browser.BrowserSettings.WhileLoopTimeoutMs && iteration < _browser.BrowserSettings.WhileLoopMaxIterations)
68 _browser.WorkflowSetup(checkWaitFor:
true, doMaintenance:
true);
69 foreach (var workflow
in _browser.BrowserSettings.Workflows)
75 if (iteration >= _browser.BrowserSettings.WhileLoopMaxIterations)
76 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"While loop reached maximum iterations ([{_browser.BrowserSettings.WhileLoopMaxIterations}]).", _browser, GPALObjectType.Browser);
77 else if ((DateTime.UtcNow - startTime).TotalMilliseconds >= _browser.BrowserSettings.WhileLoopTimeoutMs)
78 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"While loop timed out after [{_browser.BrowserSettings.WhileLoopTimeoutMs}]ms.", _browser, GPALObjectType.Browser);
80 GPAL.PublishSimpleEvent(GPALEventType.INFO,
"While loop completed.", _browser, GPALObjectType.Browser);
82 _browser.BrowserSettings.Workflows.Clear();
86 public IAllowBrowserActionOrAnySelector Until(Selector selector)
88 if (_browser.BrowserSettings.Workflows.Count == 0)
90 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"No workflows defined for Until(selector). Continuing without execution.", _browser, GPALObjectType.Browser);
95 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"Selector is null for Until. Continuing without execution.", _browser, GPALObjectType.Browser);
99 GPAL.PublishSimpleEvent(GPALEventType.INFO, $
"Starting Until(selector) loop with [{_browser.BrowserSettings.Workflows.Count}] workflow(s).", _browser, GPALObjectType.Browser);
101 var startTime = DateTime.UtcNow;
103 bool elementsFound =
false;
105 while (!elementsFound && (DateTime.UtcNow - startTime).TotalMilliseconds < _browser.BrowserSettings.WhileLoopTimeoutMs && iteration < _browser.BrowserSettings.WhileLoopMaxIterations)
107 _browser.WorkflowSetup(checkWaitFor:
true, doMaintenance:
true);
108 foreach (var workflow
in _browser.BrowserSettings.Workflows)
111 var foundElements = ElementHelper.FindWebElements(_browser, _browser.CurrentUOW, selector, out
bool matchedAll, out List<GPALElement> matchedElements, _browser.CurrentUOW.ShadowRoot);
112 elementsFound = foundElements !=
null && foundElements.Count > 0;
118 if (iteration >= _browser.BrowserSettings.WhileLoopMaxIterations)
119 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"Until(selector) loop reached maximum iterations ([{_browser.BrowserSettings.WhileLoopMaxIterations}]).", _browser, GPALObjectType.Browser);
120 else if ((DateTime.UtcNow - startTime).TotalMilliseconds >= _browser.BrowserSettings.WhileLoopTimeoutMs)
121 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"Until(selector) loop timed out after [{_browser.BrowserSettings.WhileLoopTimeoutMs}]ms.", _browser, GPALObjectType.Browser);
123 GPAL.PublishSimpleEvent(GPALEventType.INFO,
"Until(selector) loop completed.", _browser, GPALObjectType.Browser);
125 _browser.BrowserSettings.Workflows.Clear();
129 public IAllowBrowserActionOrAnySelector Until(Func<Browser, bool> predicate)
131 if (_browser.BrowserSettings.Workflows.Count == 0)
133 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"No workflows defined for Until(predicate). Continuing without execution.", _browser, GPALObjectType.Browser);
136 if (predicate ==
null)
138 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"Predicate is null for Until. Continuing without execution.", _browser, GPALObjectType.Browser);
142 GPAL.PublishSimpleEvent(GPALEventType.INFO, $
"Starting Until(predicate) loop with [{_browser.BrowserSettings.Workflows.Count}] workflow(s).", _browser, GPALObjectType.Browser);
144 var startTime = DateTime.UtcNow;
147 while (!predicate(_browser) && (DateTime.UtcNow - startTime).TotalMilliseconds < _browser.BrowserSettings.WhileLoopTimeoutMs && iteration < _browser.BrowserSettings.WhileLoopMaxIterations)
149 _browser.WorkflowSetup(checkWaitFor:
true, doMaintenance:
true);
150 foreach (var workflow
in _browser.BrowserSettings.Workflows)
156 if (iteration >= _browser.BrowserSettings.WhileLoopMaxIterations)
157 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"Until(predicate) loop reached maximum iterations ([{_browser.BrowserSettings.WhileLoopMaxIterations}]).", _browser, GPALObjectType.Browser);
158 else if ((DateTime.UtcNow - startTime).TotalMilliseconds >= _browser.BrowserSettings.WhileLoopTimeoutMs)
159 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"Until(predicate) loop timed out after [{_browser.BrowserSettings.WhileLoopTimeoutMs}]ms.", _browser, GPALObjectType.Browser);
161 GPAL.PublishSimpleEvent(GPALEventType.INFO,
"Until(predicate) loop completed.", _browser, GPALObjectType.Browser);
163 _browser.BrowserSettings.Workflows.Clear();
168 if (_browser.BrowserSettings.Workflows.Count == 0)
170 GPAL.PublishSimpleEvent(GPALEventType.ERROR,
"No workflows defined for Run. Continuing without execution.", _browser, GPALObjectType.Browser);
174 GPAL.PublishSimpleEvent(GPALEventType.INFO, $
"Starting Run with [{_browser.BrowserSettings.Workflows.Count}] workflow(s).", _browser, GPALObjectType.Browser);
176 var workflows = _browser.BrowserSettings.Workflows.ToList();
177 _browser.BrowserSettings.Workflows.Clear();
179 foreach (var workflow
in workflows)
183 _browser.WorkflowSetup(checkWaitFor:
true, doMaintenance:
true);
188 GPAL.PublishSimpleEvent(GPALEventType.EXCEPTION, $
"Workflow failed", _browser, GPALObjectType.Browser, ex);
192 GPAL.PublishSimpleEvent(GPALEventType.INFO, $
"Run completed with [{workflows.Count}] workflow(s).", _browser, GPALObjectType.Browser);