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