按钮是在Webbrowser C#中完成文件上载完成之前单击

时间:2015-09-20 23:12:21

标签: c# winforms webbrowser-control

在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}");

}

2 个答案:

答案 0 :(得分:0)

WebBrowser是否加载了本地文件?你也可以发布代码吗?

当我与合作时,我遇到了这种情况。我在WebBrowser_DocumentCompleted的表单上设置了一些标记,但是获得了一个空对象异常。所以我将set marker的代码移动到.NET Button控件。我注意到在地图图块完成加载后设置标记时没有抛出异常。在加载tile之前,DocumentCompleted正在触发,我得到了一个null对象异常。

所以我做的是在中使用tilesLoaded事件。在这种情况下,我在C#代码中设置了一个属性,该代码在OnPropertyChanged事件中设置标记。

我知道我在这里发布的内容不是解决方案。但是,如果您发布代码,我可以给您一些代码答案。

答案 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
    }

}

我的错误在于在执行下一行代码之前已经过了一定的秒数,当我应该考虑在上一个任务完成时执行下一行代码时。