Дело в том, что у меня проблема не обнаруживается - у меня всё работает корректно.
То, что проект долго выполняется - это логично - если мы делаем лок - то момент работы с буфером выполняется в 1 поток - остальные потоки должны ждать своей очереди, а далее
instance.instance.ActiveTab.KeyEvent("v", "press", "ctrl");
может выполняться сколько угодно времени (либо количество времени, которое выставлено в настройках выполнения проекта, например вот здесь если поставить какое-то значение, то возможно будет прерывать работу и в итоге будут теряться данные.
Но, это ещё не всё... Может оказаться случайно так, что памяти между процессами недостаточно - возможно это значение нужно увеличить. Или например приоритетные потоки не дают вовремя взять инстанс чтобы выполнить в нём команду вставки.
А ещё может быть, что в настройках установлено маленькое время выполнения команды в инстансе...
Или, в момент выполнения количество памяти браузера маловато.
Или банально теряется фокус инстанса, из-за чего при вставке Ctrl+V не отрабатывает вставка в нужное поле.
Или возможно ещё необходимо состояние занятости инстанса подправить, так как вдруг в момент вставки данных оказывается что инстанс занят загрузкой в фреймах или ajax что-то принимает/отправляет и инстанс не может принимать данные...
instance.IgnoreAjaxRequests = false;
instance.IgnoreAdditionalRequests = false;
instance.IgnoreFrameRequests = false;
instance.IgnoreFlashRequests = false;
Кроме этого, вводятся данные или нет и теряются где-то или нет может быть связано с настройками эмуляции ввода (как и скорость отработки команды вставки).
То что код работает нормально с буфером - это мне понятно, но вот что именно и как происходит при выполнении команды
instance.ActiveTab.KeyEvent("v", "press", "ctrl");
- мне лично не понятно
Я запустил код с Chrome в несколько потоков, покрутил - и в результате у меня проблемы нет - всё работает корректно (если самому не трогать буфер).
Код который использовал (для скриншота выше):
instance.SetProxy("http://127.0.0.1:8888"); // устанавливаю прокси фиддлера
instance.ActiveTab.Navigate("https://ya.ru");// Перехожу в яндекс
instance.ActiveTab.FindElementById("text").RiseEvent("click", instance.EmulationLevel);// кликаю по форме (чтобы поле было в фокусе
int max = 100; // Определяю сколько раз буду нажимать ctrl+v
string line = Enumerable.Range(0,10).OrderBy(x=> Guid.NewGuid()).First().ToString(); // Генерирую случайное число
string md5 = line.GetMD5Hash(); // Вычисляю хеш с данного числа
string new_md5_1 = string.Empty;
int item = 0;
lock (SyncObjects.InputSyncer) { // Блокирую буфер
string old_text = System.Windows.Forms.Clipboard.GetText(); // Извлекаю содержимое буфера, чтобы вернуть обратно
while(md5 != new_md5_1) { // Если содержимое буфера отличается от желаемого - пытаюсь добавить туда содержимое
item++; // Счётчик попыток добавления в буфер
try {
System.Windows.Forms.Clipboard.Clear(); // Очистка буфера
System.Windows.Forms.Clipboard.SetText(line); // Установка текста
new_md5_1 = System.Windows.Forms.Clipboard.GetText().GetMD5Hash(); // Извлечение хеша, для проверки и выхода с цикла
}
catch {
System.Windows.Forms.Clipboard.SetText(old_text); // Если произошла попытка добавления в буфер - возвращаю назад старый текст, выхожу по ошибке
throw new Exception("Ошибка добавления данных в буфер");
}
}
string attribute = string.Empty; // Содержимое поля ввода
int count = 0; // Количество введённых данных в поле
for(int i=0; i<2*max ;i++) { // Цикл, который позволит нажать необходимое количество раз Ctrl + V
// i<2*max - специально поставил 2*max, если вдруг браузер не отреагировал на событие Ctrl+V - позволит сделать ещё одну попытку
attribute = string.Empty;
attribute = instance.ActiveTab.GetDocumentByAddress("0").FindElementByTag("form", 0).FindChildById("text").GetAttribute("value"); // узнаю сколько раз уже нажимал Ctrl + V
count = attribute.Count(x => x == line[0]); // Считаю количество совпадений
if(max == count) break; // Если необходимое количество данных введено - выхожу с цикла
else instance.ActiveTab.KeyEvent("v", "press", "ctrl"); // Иначе ещё раз нажимаю Ctrl + V
}
System.Windows.Forms.Clipboard.Clear(); // очистил буфер
System.Windows.Forms.Clipboard.SetText(old_text); // Вернул туда что было
string mess = string.Format(@"{0} {1} {2}",line, count, attribute);
if(max == count) project.SendInfoToLog(mess,true); // Синее сообщение если данных достаточно в поле
else project.SendWarningToLog(mess,true); // Желтое, если не достаточно
}