gpt4 book ai didi

c# - 上传文件不起作用 - 需要帮助

转载 作者:太空狗 更新时间:2023-10-30 00:41:46 24 4
gpt4 key购买 nike

我正在尝试使用 WebBrowser 控件上传文件(图像)。似乎无法做到,需要一些帮助。

这是 Html:

<form action="https://post.testsite.com/k/IOkurrwY4xGI_EJMbjF5pg/zMNsR" method="post" enctype="multipart/form-data">
<input type="hidden" name="cryptedStepCheck" value="U2FsdGVkX18yNzEwMjcxMJdrv2IidjtpGSCPzHNblWk02eJAJ6DFXFXic-Am1lTPMYL7k7XDoH0">
<input type="hidden" name="a" value="add">
<input class="file" type="file" name="file" multiple="multiple">
<button class="add" type="submit" name="go" value="add image">add image</button>
</form>

这是 C# 代码...

        elements = webBrowser.Document.GetElementsByTagName("input");
foreach (HtmlElement file in elements)
{
if (file.GetAttribute("name") == "file")
{
file.Focus();
file.InvokeMember("Click");
SendKeys.Send("C:\\Images\\CCPhotoID.jpg" + "{ENTER}");
}
}

请注意,文件上传按钮出现了,但无法在文件名区域输入任何文件名。

最佳答案

IMO,您尝试做的确实是 UI 测试自动化的合法方案。 IIRC,在早期版本的 IE 中,可以填充 <input type="file"/>带有文件名的字段,不显示 Choose File对话。出于安全原因,这不再可能,因此您必须将 key 发送到对话框。

这里的问题是 file.InvokeMember("Click")显示模式对话框,您希望将键发送到那个对话框,但是SendKeys.Send 对话框关闭后执行(毕竟它是模态的)。您需要先让对话框打开,然后发送 key 并让它关闭。

这个问题可以使用 WinForms 解决 Timer , 但我更喜欢使用 async/awaitTask.Delay为此(工作代码):

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:\\Images\\CCPhotoID.jpg" + "{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);
}

async Task Populate()
{
var elements = webBrowser.Document.GetElementsByTagName("input");
foreach (HtmlElement file in elements)
{
if (file.GetAttribute("name") == "file")
{
file.Focus();
await PopulateInputFile(file);
}
}
}

IMO,这种方法对于 UI 自动化脚本来说非常方便。您可以调用Populate像这样,例如:

void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.webBrowser.DocumentCompleted -= webBrowser_DocumentCompleted;
Populate().ContinueWith((_) =>
{
MessageBox.Show("Form populated!");
}, TaskScheduler.FromCurrentSynchronizationContext());
}

关于c# - 上传文件不起作用 - 需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com