Okay, sorry for the delay, I moved on to something else ...
In any case, this is REALLY rude, but you should be able to choose the bits you need.
Noseratio .
raiseynamicevent async nav, . , . ajax. , -.
private async void Next()
{
Submission res = null;
if (_profileQueue.TryDequeue(out res))
{
_browser.Tag = res;
var cts = new CancellationTokenSource(Properties.Settings.Default.BrowserNavigationTimeout);
var html = await LoadDynamicPage(res.SiteProfile.URL, cts.Token);
ProcessSiteProfile();
Next();
}
}
async Task<string> LoadDynamicPage(string url, CancellationToken token)
{
var tcs = new TaskCompletionSource<bool>();
WebBrowserDocumentCompletedEventHandler handler = (s, arg) =>
tcs.TrySetResult(true);
_browserTasks[_browser] = tcs;
using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
{
this._browser.DocumentCompleted += handler;
try
{
if (!string.IsNullOrWhiteSpace(url))
{
this._browser.Navigate(url);
await tcs.Task;
}
}
finally
{
this._browser.DocumentCompleted -= handler;
}
}
var documentElement = this._browser.Document.GetElementsByTagName("html")[0];
var html = documentElement.OuterHtml;
while (true)
{
await Task.Delay(Properties.Settings.Default.BrowserNavigationWait, token);
if (this._browser.IsBusy)
continue;
var htmlNow = documentElement.OuterHtml;
if (html == htmlNow)
break;
html = htmlNow;
}
token.ThrowIfCancellationRequested();
_browserTasks[this._browser] = null;
return html;
}
async void ProcessSiteProfile()
{
HtmlElement parentForm = null;
parentForm = HtmlElementQuery(_browser.Document, "myTextFieldInput");
var sub = (_browser.Tag as Submission);
HtmlDocument doc = _browser.Document;
if (parentForm != null)
{
var elements = parentForm.GetElementsByTagName("input");
foreach (HtmlElement el in elements)
{
if (el.GetAttribute("type").ToLower() == "submit")
{
var cts = new CancellationTokenSource(Properties.Settings.Default.BrowserNavigationTimeout);
var html = await RaiseDynamicEvent(el, "click", cts.Token);
}
}
}
}
async Task<string> RaiseDynamicEvent(HtmlElement element, string evt, CancellationToken token)
{
var tcs = new TaskCompletionSource<bool>();
WebBrowserDocumentCompletedEventHandler handler = (s, arg) =>
tcs.TrySetResult(true);
_browserTasks[_browser] = tcs;
using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
{
this._browser.DocumentCompleted += handler;
try
{
element.InvokeMember(evt);
try
{
await tcs.Task;
}
catch (TaskCanceledException)
{
}
}
finally
{
this._browser.DocumentCompleted -= handler;
}
}
var documentElement = this._browser.Document.GetElementsByTagName("html")[0];
var html = documentElement.OuterHtml;
while (true)
{
await Task.Delay(500, token);
if (this._browser.IsBusy)
continue;
var htmlNow = documentElement.OuterHtml;
if (html == htmlNow)
break;
html = htmlNow;
}
token.ThrowIfCancellationRequested();
_browserTasks[this._browser] = null;
return html;
}
HtmlElement FindParentByElement(string elementName, HtmlElement element)
{
if (element.Parent != null)
{
if (element.Parent.TagName.ToLower() == elementName.ToLower())
{
return element.Parent;
}
else
{
return FindParentByElement(elementName, element.Parent);
}
}
else
{
return null;
}
}
HtmlElement HtmlElementQuery(HtmlDocument container, string query)
{
HtmlElement el = null;
if (query.StartsWith("#"))
{
el = container.GetElementById(query.TrimStart('#'));
}
else
{
el = container.All[query];
}
return el;
}