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

Darvel

Client
Регистрация
17.11.2013
Сообщения
103
Благодарностей
4
Баллы
18
Здравствуйте. Позльзуюсь найденным на форуме сниппетом для чтения страницы, все ок, но для мобильной версии надо чтобы оно не мышкой вело к элементам, а просто скролило до нужного элемента и зависало там, типо читает.. Может кто помочь изменить данный сниппет, чтобы это был только скролл и нажатия, без курсора...
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); мы будем скроллить к элементам. А как убрать наведение на ссылки курсора перед нажатием. Еще курсор иногда гуляет по правому краю, где полоска скролла.. Помогите подправить сниппет.
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
скролл
tab.FullEmulationMouseWheel(elText,0,0);
Первый параметр HtmlElement
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Вот только "тапать" и "свайпать" зенка пока не умеет :(
 
  • Спасибо
Реакции: zortexx

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43

Darvel

Client
Регистрация
17.11.2013
Сообщения
103
Благодарностей
4
Баллы
18
скролл
tab.FullEmulationMouseWheel(elText,0,0);
Первый параметр HtmlElement
Я пробовал заменять tab.FullEmulationMouseMoveAboveHtmlElement(elText, 30); на tab.FullEmulationMouseWheel(elText,0,0); - не работает. Он в логе пишет - читаем элемент, но не скролит к нему. Потом активируется курсор, который ведет к ссылке, нажимает и опять при чтении ничего не происходит. Меня больше интересовало как убрать наведение курсора на элементы из кода, а мой вариант без появления мыши скролит, хоть и эмуляцией колесика.
Ща еще раз проверил, работает, но крайне коряво.. Он долго тупит в шапке, потом часто пропускает вообще все элементы и ведет курсор к ссылке.. Мне бы поставить зарержку тупления на элементе, а не в шапке и убрать курсор при наведении на ссылки. А в идеале, чтобы исключал ссылки с tel:, mailto: Иначе открывается еще одна пустая таба и он начинает читать ее..
 
Последнее редактирование:

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