C# Чтение страницы без мышки

  • Автор темы Автор темы Darvel
  • Дата начала Дата начала

Darvel

Client
Регистрация
17.11.2013
Сообщения
122
Реакции
46
Баллы
28
Здравствуйте. Позльзуюсь найденным на форуме сниппетом для чтения страницы, все ок, но для мобильной версии надо чтобы оно не мышкой вело к элементам, а просто скролило до нужного элемента и зависало там, типо читает.. Может кто помочь изменить данный сниппет, чтобы это был только скролл и нажатия, без курсора...
C#:
Развернуть Свернуть Копировать
var url = project.Variables["url"].Value;
//Адрес стартовой страницы
//string url = "https://ru.wordpress.org/";
//Количество страниц для чтения
int pageCount = 3;
//XPath элементов для эмуляции чтения
string xpath = "//h1[string-length(text())>10]|//h2[string-length(text())>10]|//h3[string-length(text())>10]|//h4[string-length(text())>10]|//p[string-length(text())>10]";
//Переменная для определения вероятности
int chance = 0;
//Шанс пропуска блоков, в %
int chanceSkip = 70;
//Переменная для определения перехода в абзаце
bool isLinkClicked = false;

var rnd = Global.Classes.rnd;
var tab = instance.ActiveTab;

//Переходим на заданную страницу
//tab.Navigate(url);
//if (tab.IsBusy)    tab.WaitDownloading();
//Thread.Sleep(1700);

//Цикл чтения страниц (1 итерация - 1 страница)
for (int p=0; p<pageCount; p++)
{
    //Ищем элементы странички для эмуляции чтения
    var colTexts = tab.FindElementsByXPath(xpath);
    //Вычленяем только видимые на странице элементы
    var colResult = tab.FindElementsByXPath("//sngvuyrbuy");
    if (colTexts.Count>0)
    {
        foreach (var el in colTexts.Elements)
        {
            int topInBrowser = int.Parse(el.GetAttribute("topInBrowser"));
            int leftInBrowser = int.Parse(el.GetAttribute("leftInBrowser"));
            //Если элемент видимый
            if (el.Height>0 && el.Width>0 && topInBrowser>=0 && leftInBrowser>=0)
            {
                colResult.Add(el);
            }
        }
    }
    colTexts = colResult;

    //Если коллекция пуста, выводи соответствующее сообщение в лог
    if (colTexts.Count<1)
    {
        project.SendWarningToLog("Подходящие тексты для чтения не найдены! Страница: '"+tab.URL+"'", true);
    }

    int num = 1;
    //В цикле проходим элементы коллекции
    foreach (var elText in colTexts.Elements)
    {
        // Определяем, пропускать ли данный блок
        chance = rnd.Next(1, 101);
        //На основе выпавшего значения решаем, пропускать ли блок
        if (chance <= chanceSkip)
        {
            //С вероятностью chanceSkip пропускаем
            project.SendInfoToLog("Пропускаем чтение элемента №" + num + ", тег: "+elText.TagName);
            num++;
            Thread.Sleep(rnd.Next(3,9)*100);
            continue;
        }

        // Пропускаем слишком короткие блоки с определенной вероятностью
        if (elText.InnerText.Length < 100)
        {
            //Если длина текста блока меньше 100 символов
            chance = rnd.Next(1, 101);    //Случайно берём значение от 1 до 100
            if (chance <= chanceSkip)
            {
                //С вероятностью chanceSkip не читаем его
                project.SendInfoToLog("Пропускаем чтение элемента №" + num + " из-за малой длины его текста, тег: "+elText.TagName);
                num++;
                continue;
            }
        }

        //Записываем в лог номер текущего элемента и название его тега
        project.SendInfoToLog("Читаем элемент №" + num + ", тег: "+elText.TagName);

        //Эмулируем чтение элемента
        tab.FullEmulationMouseMoveAboveHtmlElement(elText, 30);

        //С определенной вероятностью переходим по случайной ссылке в абзаце
        var colLinks = elText.FindChildrenByXPath(".//a");
        //Если в коллекции есть элементы (ссылки)
        if (colLinks.Count > 0)
        {
            chance = rnd.Next(1, 101);
            if (chance <= 3)
            {
                //С вероятностью 3% переходим по случайной ссылке из абзаца
                var elLink = colLinks.Elements[rnd.Next(colLinks.Count)];
                tab.FullEmulationMouseMoveToHtmlElement(elLink);
                Thread.Sleep(rnd.Next(4,8)*100);
                tab.FullEmulationMouseClick("left", "click");
                if (tab.IsBusy)    tab.WaitDownloading();
                Thread.Sleep(rnd.Next(5,25)*100);
                //Сообщаем коду ниже что перешли по ссылке
                isLinkClicked = true;
                //Выходим из цикла, переходим к следующей страничке
                break;
            }
        }

        //Случайная пауза между чтением блоков
        chance = rnd.Next(0, 2);
        if (chance==0)
        {
            Thread.Sleep(rnd.Next(5,50)*100);
        }

        num++;
    }

    //Если при чтении не переходили на другую страницу
    if (isLinkClicked == false)
    {
        //Находим все элементы, содержащие ссылки
        var colLinks = tab.FindElementsByXPath("//a");
        //Вычленяем только видимые на странице ссылки
        colResult = tab.FindElementsByXPath("//sngvuyrbuy");
        if (colLinks.Count>0)
        {
            foreach (var el in colLinks.Elements)
            {
                int topInBrowser = int.Parse(el.GetAttribute("topInBrowser"));
                int leftInBrowser = int.Parse(el.GetAttribute("leftInBrowser"));
                if (el.Height>0 && el.Width>0 && topInBrowser>=0 && leftInBrowser>=0)
                {
                    colResult.Add(el);
                }
            }
        }
        colLinks = colResult;
        //Проверка наличия ссылок
        if (colLinks.Count<1)
        {
            project.SendWarningToLog("Видимых ссылок на странице не найдено! "+tab.URL, true);
            project.SendInfoToLog("Завершили гуляние по страницам. Количество прочитанных страниц: "+(p+1), true);
            return "ok";
        }
        //Ведём мышку к случайному элементу со ссылкой
        var elLink = colLinks.Elements[rnd.Next(colLinks.Elements.Length)];
        tab.FullEmulationMouseMoveToHtmlElement(elLink);
        Thread.Sleep(rnd.Next(4,8)*100);
        tab.FullEmulationMouseClick("left", "click");
        if (tab.IsBusy)    tab.WaitDownloading();
        Thread.Sleep(rnd.Next(5,25)*100);
    }
    project.SendInfoToLog("Завершили чтение "+ (p+1) +"-й страницы.", true);
}

project.SendInfoToLog("Завершили гуляние по страницам.", true);

Насколько я понял, если заменить в этом куске
Код:
Развернуть Свернуть Копировать
        //Эмулируем чтение элемента

        tab.FullEmulationMouseMoveAboveHtmlElement(elText, 30);
FullEmulationMouseMoveAboveHtmlElement на FullEmulationMouseMoveToHtmlElement(elText); мы будем скроллить к элементам. А как убрать наведение на ссылки курсора перед нажатием. Еще курсор иногда гуляет по правому краю, где полоска скролла.. Помогите подправить сниппет.
 
скролл
tab.FullEmulationMouseWheel(elText,0,0);
Первый параметр HtmlElement
 
Вот только "тапать" и "свайпать" зенка пока не умеет :(
 
  • Спасибо
Реакции: zortexx
44586


Ну и тут https://help.zennolab.com/en/v5/zennoposter/5.30.0.0/webframe.html#topic561.html
 
Последнее редактирование:
  • Спасибо
Реакции: zortexx
скролл
tab.FullEmulationMouseWheel(elText,0,0);
Первый параметр HtmlElement
Я пробовал заменять tab.FullEmulationMouseMoveAboveHtmlElement(elText, 30); на tab.FullEmulationMouseWheel(elText,0,0); - не работает. Он в логе пишет - читаем элемент, но не скролит к нему. Потом активируется курсор, который ведет к ссылке, нажимает и опять при чтении ничего не происходит. Меня больше интересовало как убрать наведение курсора на элементы из кода, а мой вариант без появления мыши скролит, хоть и эмуляцией колесика.
Ща еще раз проверил, работает, но крайне коряво.. Он долго тупит в шапке, потом часто пропускает вообще все элементы и ведет курсор к ссылке.. Мне бы поставить зарержку тупления на элементе, а не в шапке и убрать курсор при наведении на ссылки. А в идеале, чтобы исключал ссылки с tel:, mailto: Иначе открывается еще одна пустая таба и он начинает читать ее..
 
Последнее редактирование:

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