Темная сторона C#илы

famous1144

Client
Регистрация
27.03.2014
Сообщения
137
Благодарностей
53
Баллы
28
В нашем любимом зеннопостере возможность использовать макросы на C# появилась давно, а последнее время его возможности немного расширили, запилив контекст. В этой статье я хочу показать парочку интересных возможностей его использования. Поехали :-)

Некий элемент прячется очень глубоко, и выцепить его по id или любому одному атрибуту не представляется возможным. Парсить же html регулярками - ересь(подробнее расскажет гугл). Тут нам на помощь приходит XPath:
Код:
var Link = instance.ActiveTab.FindElementByXPath("//div[@class='menu']/ul/li[2]/a", 0);
Данный пример получает div c классом "menu", внутри него ищет список, берет 2 элемент, и ищет в нем ссылку.
По этой ссылке можно кликнуть: Link.Click();
Получить ее текст: Link.InnerHtml;
Изменить ее: Link.SetAttribute("href", "http://google.com");
Небольшое вступление в XPath можно прочитать тут: http://habrahabr.ru/post/114772/

Иногда очень нужно написать функцию, доступную в разных местах проекта. Вот как это делается:
Код:
project.Context["CAPS"] = (Func<string, string>)((Text) => {
   return Text.ToUpper();
});
Вызов(из любого места):
Код:
project.Context["CAPS"]("hello world"); // HELLO WORLD
На некоторых сайтах(особенно этим "грешат" разные админки и т.д.) действия происходят без перезагрузки страницы(AJAX). Изменение настроек состояния занятости не всегда помогает, есть 2 проблемы:
1 - запрос к сети выполняется не сразу после нажатия кнопки, и зенка сразу же переходит к следующему действию.
2 - может быть много других аякс-запросов(например, проверка лички) и скрипт будет все время висеть в ожидании, когда же они закончатся
Мой вариант решения проблемы:
Код:
project.Context["GetEl"] = (Func<string, HtmlElement>)((XPath) => {
   HtmlElement El;
   for(int i = 0; i < 30; i++) {
     El = instance.ActiveTab.FindElementByXPath(XPath, 0);
     if(!El.IsNull) return El;
     else Thread.Sleep(1000);
   }
   throw new Exception("Элемент " + XPath + " не найден!");
});
Использование:
Код:
var GetEl = project.Context["GetEl"];
GetEl("//a[@id='process']").Click();
GetEl("//button[@id='comfirm']").Click();
Этот код терпеливо ждет появления нужных элементов по 30 сек, и кликает по ним. Решение весьма костыльное, но за неимением лучшего приходится использовать это.

Поиск данных в таблице:
Использование:
Код:
project.Context["findInTable"] = (Func<string, string, string, IEnumerable<string>>)((Table, Column, Text) => {
   var Tbl = project.Tables[Table];
   for(int i = 0; i < Tbl.RowCount; i++) {
     if(Tbl.GetCell(Column, i).Trim() == Text.Trim()) {
       return Tbl.GetRow(i);
     }
   }
   return null;
});
Использование:
Код:
//Ищем строку в таблице Users, в которой значение в первой ячейке - Vasya
var Row = project.Context["findInTable"]("Users", "A", "Vasya");
if(Row != null) {
   var Surname = Row[1];
   var Password = Row[2];
}
Вывод: макросом на C# можно решить любую неразрешимую задачу в ZennoPoster :-)
 

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Advert31337

Client
Регистрация
18.12.2016
Сообщения
53
Благодарностей
38
Баллы
18
После познания общего кода конечно уже не так интересно, но все равно пушка)
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)