在Windows窗体上,我在C#中使用Webbrowser控件。它的工作是上传文件,然后按提交按钮。我唯一的问题是我的代码尝试在文件上传完成之前按下提交按钮。我尝试使用:
System.Threading.Thread.Sleep(1000);
在两个任务之间(下面列出了注释)。这似乎暂停了整个过程,因此无效。谁能告诉我最好的方法是什么?
private void imageBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.imageBrowser.DocumentCompleted -= imageBrowser_DocumentCompleted;
Populate().ContinueWith((_) =>
{
//MessageBox.Show("Form populated!");
}, TaskScheduler.FromCurrentSynchronizationContext());
//System.Threading.Thread.Sleep(10000);
try
{
var buttons = imageBrowser.Document.GetElementsByTagName("button");
foreach (HtmlElement button in buttons)
{
if (button.InnerText == "done")
{
button.InvokeMember("click");
}
}
}
catch
{
//debug
}
}
async Task Populate()
{
var elements = imageBrowser.Document.GetElementsByTagName("input");
foreach (HtmlElement file in elements)
{
if (file.GetAttribute("name") == "file")
{
file.Focus();
await PopulateInputFile(file);
}
}
}
async Task PopulateInputFile(HtmlElement file)
{
file.Focus();
// delay the execution of SendKey to let the Choose File dialog show up
var sendKeyTask = Task.Delay(500).ContinueWith((_) =>
{
// this gets executed when the dialog is visible
SendKeys.Send("C:\\Users\\00I0I_c0OlVXtE6FO_600x450.jpg" + "{ENTER}");
System.Threading.Thread.Sleep(1000);
SendKeys.Send("{ENTER}");
}, TaskScheduler.FromCurrentSynchronizationContext());
file.InvokeMember("Click"); // this shows up the dialog
await sendKeyTask;
// delay continuation to let the Choose File dialog hide
await Task.Delay(500);
//SendKeys.Send("{ENTER}");
}
答案 0 :(得分:0)
WebBrowser
是否加载了本地文件?你也可以发布html代码吗?
当我与google-maps-api-3合作时,我遇到了这种情况。我在WebBrowser_DocumentCompleted
的表单上设置了一些标记,但是获得了一个空对象异常。所以我将set marker的代码移动到.NET Button
控件。我注意到在地图图块完成加载后设置标记时没有抛出异常。在加载tile之前,DocumentCompleted
正在触发,我得到了一个null对象异常。
所以我做的是在javascript中使用tilesLoaded
事件。在这种情况下,我在C#代码中设置了一个属性,该代码在OnPropertyChanged
事件中设置标记。
我知道我在这里发布的内容不是解决方案。但是,如果您发布html代码,我可以给您一些代码答案。
答案 1 :(得分:0)
我解决了这个问题。我用来点击按钮的代码是错误的。代码现在看起来像这样:
private void imageBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.imageBrowser.DocumentCompleted -= imageBrowser_DocumentCompleted;
try
{
Populate().ContinueWith((_) =>
{
var buttons = imageBrowser.Document.GetElementsByTagName("button");
foreach (HtmlElement button in buttons)
{
if (button.InnerText == "done")
{
button.InvokeMember("click");
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
catch
{
//debug
}
}
我的错误在于在执行下一行代码之前已经过了一定的秒数,当我应该考虑在上一个任务完成时执行下一行代码时。