Есть большой и громоздкий шаблон, который хочется по максимуму оптимизировать с помощью замены экшенов на c#.
Вот пример кода, который удалось создать штатными средствами зенки путем конвертации экшенов в c#
1. Надо сделать так, чтобы после нажатия войти код не продолжал действовать, пока страница полностью не дозагрузится. Пробовал это сделать с помощью команд
instance.ActiveTab.WaitDownloading();
или
if (tab.IsBusy) tab.WaitDownloading();
Но почему то это ломает код и все перестает работать. Что я делаю не так? Как использовать этот код, или какой еще есть код, чтобы дождать загрузки страницы после клика ?
2. Можно проверить загрузку страницы путем поиска на странице нужного объекта, например
Как дальше дополнить код, чтобы если элемента нет, то циклично каждые несколько секунд проводилась проверка, пока элемент не загрузится и только потом шло выполнение дальнейшего кода ?
3. Есть еще куча экшенов с обработкой текста (регекс) и логикой(если "AA"!="BB"). Но они почему то штатными средствами зенки не конвертируются в c#. Допустим нам надо взять переменную, регексом из нее вытащить кусок и положить в другую переменную. И потом сравнить новую переменную с начальной. Как это сделать кодом ?
Спасибо откликнувшимся
Вот пример кода, который удалось создать штатными средствами зенки путем конвертации экшенов в c#
Код:
//ОТКЛЮЧАЕМ ФЛЭШ, ЧИСТИМ КЭШ, КУКИ
instance.UsePlugins = false;
instance.ClearCache();
instance.ClearCookie();
//ПЕРЕХОДИМ НА САЙТ
Tab tab = instance.ActiveTab;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
if (tab.IsBusy) tab.WaitDownloading();
tab.Navigate("https://www.site.ru/", "https://www.yandex.ru/");
if (tab.IsBusy) tab.WaitDownloading();
//КЛИК ВХОД
//КЛИК ВХОД
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "innerhtml", "Вход\\ и\\ регистрация", "regexp", 0);
if (he.IsVoid) return -1;
// Задержка эмуляции
instance.WaitFieldEmulationDelay();
// Вызвать событие "click"
he.RiseEvent("click", instance.EmulationLevel);
// Случайная пауза
Random rnd = new Random();
System.Threading.Thread.Sleep(rnd.Next(2, 4) * 1000);
//ВВОД ТЕЛЕФОНА
//ВВОД ТЕЛЕФОНА
HtmlElement he0 = instance.ActiveTab.FindElementByAttribute("input:text", "outerhtml", "placeholder=\"Телефон"", "regexp", 0);
if (he0.IsVoid) return -1;
instance.WaitFieldEmulationDelay();
he0.SetValue(project.Variables["tel"].Value, instance.EmulationLevel, false);
// Случайная пауза
System.Threading.Thread.Sleep(rnd.Next(2, 4) * 1000);
// ВВОД ПАРОЛЯ
// ВВОД ПАРОЛЯ
HtmlElement he1 = instance.ActiveTab.FindElementByAttribute("input:password", "fulltagname", "input:password", "regexp", 0);
if (he1.IsVoid) return -1;
instance.WaitFieldEmulationDelay();
he1.SetValue(project.Variables["Pass"].Value, instance.EmulationLevel, false);
// Случайная пауза
System.Threading.Thread.Sleep(rnd.Next(2, 4) * 1000);
// КЛИК ВОЙТИ
// КЛИК ВОЙТИ
HtmlElement he76 = instance.ActiveTab.FindElementByAttribute("button", "innerhtml", "Войти", "regexp", 0);
if (he76.IsVoid) return -1;
instance.WaitFieldEmulationDelay();
he76.RiseEvent("click", instance.EmulationLevel);
// Случайная пауза
System.Threading.Thread.Sleep(rnd.Next(2, 4) * 1000);
// КЛИК additem
// КЛИК additem
HtmlElement he53 = instance.ActiveTab.FindElementByAttribute("a", "href", "additem", "regexp", 0);
if (he53.IsVoid) return -1;
instance.WaitFieldEmulationDelay();
he53.RiseEvent("click", instance.EmulationLevel);
instance.ActiveTab.WaitDownloading();
или
if (tab.IsBusy) tab.WaitDownloading();
Но почему то это ломает код и все перестает работать. Что я делаю не так? Как использовать этот код, или какой еще есть код, чтобы дождать загрузки страницы после клика ?
2. Можно проверить загрузку страницы путем поиска на странице нужного объекта, например
Код:
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementByAttribute("img", "src", "http://programmersforum.ru/rusprofile.gif", "regexp", 0);
if (he.IsVoid) return -1;
// Получить значение атрибута "height"
string attribute = he.GetAttribute("height");
3. Есть еще куча экшенов с обработкой текста (регекс) и логикой(если "AA"!="BB"). Но они почему то штатными средствами зенки не конвертируются в c#. Допустим нам надо взять переменную, регексом из нее вытащить кусок и положить в другую переменную. И потом сравнить новую переменную с начальной. Как это сделать кодом ?
Спасибо откликнувшимся