C# htmlelement как программно выбрать файл (из htmlelement, доступного веб-браузеру) с компьютера без условия гонки
я совсем новичок, когда дело доходит до класса htmlelement!
То, что я пытаюсь сделать прямо сейчас, - это заполнить очень скучную внешнюю веб-страницу нагрузками данных, которые уже существуют на компьютере (программа выполняется локально на этом компьютере). одна из тех раздражающих и трудоемких вещей, которые нужно сделать вручную, - это выбрать изображение установки оборудования с Вашего компьютера, а затем отправить его в эту форму, сделать это можно с помощью класса HTMLElement и элемента управления webBrowser, но я ненавижу небезопасное кодирование, необходимое для этого, я называю его небезопасным, потому что у него есть проблемы с состоянием гонки, вот посмотрите:
Следующий код был создан не мной
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); } } }
Хорошо, теперь изображение Вашего компьютера имеет жесткий диск спящий, или его в очень напряженном антивирусном сканировании + обновлении windows в то же время, естественно, модальное окно, чтобы появиться может занять даже до 10 секунд. тогда это означает, что вы вводите путь к файлу и нажимаете enter задолго до появления показанного диалогового окна, которое приведет к тому, что программа застрянет, никогда не покидая эту неудачную строку кода и не представляя пользователю или кодеру никакой ошибки (что ожидается).
То, что я пытаюсь сделать, это именно то, но в то же время избегая этого очень очевидного состояния гонки, я рассматривал возможность проверки каждого 500 мс в цикле, чтобы увидеть, открыто ли окно, и только затем выполнить sendkeys, что-то вроде этого:
AutoUploadPicture(string path) { fileUploadDialogElement.Focus();//HTMLElement Taken from webBrowser1.Document Task.Run(()=>PerformAsyncCheckup()); fileUploadDialogElement.InvokeMember("click"); CancelTask = true; //successfully continue coding as it avoided that ugly race condition } bool CancelTask = false; PerformAsyncCheckup() { while (webBrowser1.AnyDialogFormShowing==false && CancelTask == false) { Thread.Sleep(200); } if (CancelTask ==false) SendKeys.Send("C:\\Images\\CCPhotoID.jpg" + "{ENTER}");
Возможно ли то, чего я хочу? я искал google и stackoverflow, и все решения были основаны на каком-то случайном таймере, который всегда рискует ошибками состояния гонки.
С Наилучшими Пожеланиями!
Что я уже пробовал:
PerformAsyncCheckup() { while (webBrowser1.AnyDialogFormShowing==false && CancelTask == false) { Thread.Sleep(200); } if (CancelTask ==false) SendKeys.Send("C:\\Images\\CCPhotoID.jpg" + "{ENTER}");