Я код что в шапке зациклил, пока только таким Макаром выхожу из положения. Тот что дальше скидывали он у меня тупо встаёт и ничего не делает, может хоть целый день в таком состоянии провисеть и при этом ни ошибки не выдать и не вставить. А в шапке код сразу выдаёт ошибку. В итоге с таймером его связал и зациклил пока не выполнит. Причём связи вообще не вижу. Порой сутками нормально работает, а порой моментами начинает гнать.У себя заметил что это не с зенкой связано. Почему-то пропадает временами возможность копипаста, даже руками.
привет.Самый простой и на 99% работающий вариант - это кликнуть вот так:
C#:HtmlElement he = instance.ActiveTab.FindElementById("text"); // идентификатор text нужно заменить на свой, на тот id, по которому нужно кликнуть he.Click();
привет.
отличный способ для клика по элементу, спасибо!
Вопрос, а как можно сразу же в этом снипете с эмулировать ввод с клавиатуры(есть переменная и в ней данные) которые нужно ввести в поле которое нашли. Вот пример: http://prntscr.com/hh98xh
Спасибо за ответ!
he.SetAttribute("value", project.Variable["text"].Value);
спасибо за быстрый ответ. я тут еще докумекал перевести обычную эмуляцию "кубик" в С# и вставил послеКод:he.SetAttribute("value", project.Variable["text"].Value);
еще один нюанс с вашим кодом, а как допустим у нему прикрутить нужную паузу ввода текста? а то ваш мгновенно вставляет)Код:he.SetAttribute("value", project.Variable["text"].Value);
Наверное лучше тогда через эмуляцию, как у вас выше. Сначала клик по нужному полю, а потом код эмуляции вводаеще один нюанс с вашим кодом, а как допустим у нему прикрутить нужную паузу ввода текста? а то ваш мгновенно вставляет)
сделал вот так :Наверное лучше тогда через эмуляцию, как у вас выше. Сначала клик по нужному полю, а потом код эмуляции ввода
HtmlElement he = instance.ActiveTab.FindElementById("id_research_keywords"); // идентификатор text нужно заменить на свой, на тот id, по которому нужно кликнуть
he.Click();
instance.WaitFieldEmulationDelay(); // не знаю, обязательна ли эта строка, но, в принципе, не мешает
string str = project.Variables["bio"].Value; // переменная с текстом
int latencyMin = 45; // минимальная задержка для ввода одного символа, мс
int latencyMax = 65; // максимальная задержка для ввода одного символа, мс
char[] symbol = str.ToArray();
Random rnd = new Random();
for (int i = 0; i < symbol.Count(); i++)
{
string text = symbol[i].ToString();
int latency = rnd.Next(latencyMin, latencyMax);
instance.SendText(text, latency);
}
lock(SyncObjects.InputSyncer) // блокировка
{
// сохраняем предыдущее состояние буфера
string previous_text = System.Windows.Forms.Clipboard.GetText();
//сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(strAnswerText);// strAnswerText - переменная со вставляемым текстом
instance.ActiveTab.KeyEvent("v","press","ctrl");
// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
if (previous_text!=String.Empty){
System.Windows.Forms.Clipboard.SetText(previous_text);
}
}
Переменная объявлена из которой в буфер обмена берется текст?Кто-то решил проблему с зависаниями?Пробовал сниппет в первом посте, в последнем, как ни крути зависает на глухо. Что делать то?Запускаю 3 потока, через время смотрю - все 3 зависли на вставке сообщения.
В самой зенке?ЕстественноПеременная объявлена из которой в буфер обмена берется текст?
lock(SyncObjects.TableSyncer) // блокировка
{
// сохраняем предыдущее состояние буфера
string previous_text = System.Windows.Forms.Clipboard.GetText();
//сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(project.Variables["text"].Value);
instance.ActiveTab.KeyEvent("v","press","ctrl");
// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
if (previous_text!=String.Empty){
System.Windows.Forms.Clipboard.SetText(previous_text);
}
}
lock(SyncObjects.InputSyncer) // блокировка
{
var descr = project.Variables["content"].Value;
// сохраняем предыдущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();
// сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
project.Variables["myvariable"].Value = System.Windows.Forms.Clipboard.GetText();
// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
lock(SyncObjects.InputSyncer) // блокировка
{
var myvariable = project.Variables["content"].Value;
// сохраняем предыдущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();
// сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(myvariable);
project.Variables["myvariable"].Value = System.Windows.Forms.Clipboard.GetText();
// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
System.Windows.Forms.Clipboard.SetText(previous_text);
}
Подскажите, пожалуйста, а что нужно сделать, чтобы текст из буфера не вставляло куда-то, а сохраняло в переменную? Пробовала изменить ваш код под себя:
lock(SyncObjects.InputSyncer) // блокировка
{
// сохраняем предыдущее состояние буфера
String previous_text = null;
previous_text = System.Windows.Forms.Clipboard.GetText();
if (!String.IsNullOrEmpty(previous_text)) {
project.Variables["myvariable"].Value = previous_text;
}
}
Спасибо большое, работает!C#:lock(SyncObjects.InputSyncer) // блокировка { // сохраняем предыдущее состояние буфера String previous_text = null; previous_text = System.Windows.Forms.Clipboard.GetText(); if (!String.IsNullOrEmpty(previous_text)) { project.Variables["myvariable"].Value = previous_text; } }
Проверял какой вид эмуляции выставлен в шаблоне? Если там на "качество" вставка, то может оказаться что он побуквенно вставляет (но не уверен, т.к. не эмуляция клавы же).Поиски решения проблемы продолжаются.
Да, стоит на "качество". Но как ты уже правильно подметил - это не эмуляция.Проверял какой вид эмуляции выставлен в шаблоне? Если там на "качество" вставка, то может оказаться что он побуквенно вставляет (но не уверен, т.к. не эмуляция клавы же).
А там ничего не происходит. Просто висит себе шаблон и всё. Курсор моргает в поле ввода (куда должен вставиться текст), я могу взаимодействовать с сайтом (т.е. это не проблема зависшего инстанса).Ну и смотреть надо через инстансы что там происходит по-хорошему.
Какую всё таки блокировку используешь по итогу? Подозреваю, что TableSyncer используется для работы с таблицами внутри зенки и из-за него так точно может что-то локать надолго, а InputSyncer возможно тоже где-то может быть, поэтому идеальный вариант - свой кастомный.Пока что я в сниппете буквально через каждую строчку расставил вывод сообщений в лог. Как только ещё раз зависнет - буду копаться в логе. Не знаю даст это что-то или нет, но ничего лучше я пока не придумал.
Сейчас использую свою блокировку - собрал dll отдельно и в него закинул объект для блокировки. И всё-равно проблемы.Какую всё таки блокировку используешь по итогу?
/* =============================================================== */
/*Нижеприведённый код безвозвратно удаляет содержимое буфера обмена*/
/* =============================================================== */
lock(SyncObjects.InputSyncer)
{
var descr = project.Variables["rez"].Value;
if (String.IsNullOrEmpty(descr)) {
throw new Exception("Пустой текст для вставки");
}
// сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
System.Windows.Forms.Clipboard.SetText(descr);
instance.ActiveTab.KeyEvent("v","press","ctrl");
// стираем буфер и возвращаем его к первоначальному состоянию
System.Windows.Forms.Clipboard.Clear();
}
На код можно посмотреть (при запуске которого возникают эти ошибки)?с чем это связанно?