Эмуляция кликов мыши

Visky

Client
Регистрация
04.03.2020
Сообщения
45
Благодарностей
2
Баллы
8
Приветствую. Подскажите пожалуйста, возможно ли сделать эмуляцию заданного количества кликов, с нужным интервалом в мс. Заранее признателен за помощь
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Почему нет? Например так:
C#:
//ищем элемент по xpath
var he = instance.ActiveTab.FindElementByXPath(@"//xpath", 0);
//эмулируем наведение мыши на элемент
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);
//кликаем
instance.ActiveTab.FullEmulationMouseClick("left","click");
//пауза 100мс
Thread.Sleep(100);
//еще раз кликаем
instance.ActiveTab.FullEmulationMouseClick("left","click");
//пауза 100мс
Thread.Sleep(100);
//и еще раз кликаем
instance.ActiveTab.FullEmulationMouseClick("left","click");
 
  • Спасибо
Реакции: Visky

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113
Почему нет? Например так:
C#:
//ищем элемент по xpath
var he = instance.ActiveTab.FindElementByXPath(@"//xpath", 0);
//эмулируем наведение мыши на элемент
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);
//кликаем
instance.ActiveTab.FullEmulationMouseClick("left","click");
//пауза 100мс
Thread.Sleep(100);
//еще раз кликаем
instance.ActiveTab.FullEmulationMouseClick("left","click");
//пауза 100мс
Thread.Sleep(100);
//и еще раз кликаем
instance.ActiveTab.FullEmulationMouseClick("left","click");
А можешь сделать поиск элемента, если не найден идет в цикл на N попыток найти, если не нашел - вышел с ошибкой, если нашел - кликнул или что-то сделал? :-)
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
А можешь сделать поиск элемента, если не найден идет в цикл на N попыток найти, если не нашел - вышел с ошибкой, если нашел - кликнул или что-то сделал? :-)
А в чем проблема?
C#:
//ищем элемент
var he = instance.ActiveTab.FindElementByXPath(@"//xpath", 0);

//проверяем загрузку страницы в цикле (я использую такую проверку со свистком — априори нестабильным соединением )
for(int i=0; i<10;i++)
{
    //если элемент не найден — ждем
    if ((he.IsVoid)||(he.IsNull))
    {
        Thread.Sleep(5000);
    }
    else
    {
        project.SendInfoToLog("Страница прогружена", true); // выходим по зеленой и в следующем кубике делаем что нужно
       break; //выходим из цикла
    }
}

//если после цикла элемент по-прежнему не найден — ошибка загрузки страницы
if ((he.IsVoid)||(he.IsNull))
{
       //выходим по красной и, например, пробуем загрузиться еще раз
       //только делать это нужно в отдельном кубике, с ограничением кол-ва попыток, чтобы не улететь в бесконечный цикл
        throw new Exception("ошибка загрузки страницы, пробуем перезагрузить");   
}
 
Последнее редактирование:
  • Спасибо
Реакции: Visky

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113
А в чем проблема?
C#:
//ищем элемент
var he = instance.ActiveTab.FindElementByXPath(@"//xpath", 0);

//проверяем загрузку страницы в цикле (я использую такую проверку со свистком — априори нестабильным соединением )
for(int i=0; i<10;i++)
{
    //если элемент не найден — ждем
    if ((he.IsVoid)||(he.IsNull))
    {
        Thread.Sleep(5000);
    }
    else
    {
        project.SendInfoToLog("Страница прогружена", true); // выходим по зеленой и в следующем кубике делаем что нужно
       break; //выходим из цикла
    }
}

//если после цикла элемент по-прежнему не найден — ошибка загрузки страницы
if ((he.IsVoid)||(he.IsNull))
{
       //выходим по красной и, например, пробуем загрузиться еще раз
       //только делать это нужно в отдельном кубике, с ограничением кол-ва попыток, чтобы не улететь в бесконечный цикл
        throw new Exception("ошибка загрузки страницы, пробуем перезагрузить");  
}
А сможешь сделать на сайте OZON.ru проверку на наличие товара?
p.s страница где нет товара - https://www.ozon.ru/context/detail/id/152072973/
p.s страница где есть товар - https://www.ozon.ru/context/detail/id/159383210/
p.s.s с меня лайк подписка репост :-) лучше на запросах конечно)
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Хм... Элемент я бы искал вот так:
C#:
//div[@class='top-sale-block'] — скорее всего не динамически сгенерированный класс, поэтому привязываемся к нему
var he = instance.ActiveTab.FindElementByXPath(@"//div[@class='top-sale-block']//div[contains(text(),'Товар закончился')]",0);

//если не найден
if(he.IsNull || he.IsVoid)
{
    //ищем кнопку "Добавить в корзину"
    he = instance.ActiveTab.FindElementByXPath(@"//div[@class='top-sale-block']//div[contains(text(),'Добавить в корзину')]",0);
    //дополнительная проверка на наличие элемента
    if(he.IsNull || he.IsVoid)
    {
        //на случай, если нет и  надписи "Товар отсутствует" и кнопки "Добавить в корзину"
        //Вместо исключения можно засетить какую-то переменную, которая сообщит в проект что не удалось найти ни тот ни другой элемент
        throw new Exception("Ошибка поиска элемента");
    }
    //Если нашли div с текстом "Добавить в корзину", выходим по зеленой
    project.SendInfoToLog("Товар в наличии", true);
}
//если элемент найден — значит товара нет в наличии, выходим по красной
else{throw new Exception("Товар отсутствует");    }
А дальше уж сами...
 
Последнее редактирование:
  • Спасибо
Реакции: Visky и Juniorcpa

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113
Хм... Элемент я бы искал вот так:
C#:
//div[@class='top-sale-block'] — скорее всего не динамически сгенерированный класс, поэтому привязываемся к нему
var he = instance.ActiveTab.FindElementByXPath(@"//div[@class='top-sale-block']//div[contains(text(),'Товар закончился')]",0);

//если не найден
if(he.IsNull || he.IsVoid)
{
    //ищем кнопку "Добавить в корзину"
    he = instance.ActiveTab.FindElementByXPath(@"//div[@class='top-sale-block']//div[contains(text(),'Добавить в корзину')]",0);
    //дополнительная проверка на наличие элемента
    if(he.IsNull || he.IsVoid)
    {
        //на случай, если нет и  надписи "Товар отсутствует" и кнопки "Добавить в корзину"
        //Вместо исключения можно засетить какую-то переменную, которая сообщит в проект что не удалось найти ни тот ни другой элемент
        throw new Exception("Ошибка поиска элемента");
    }
    //Если нашли div с текстом "Добавить в корзину", выходим по зеленой
    project.SendInfoToLog("Товар в наличии", true);
}
//если элемент найден — значит товара нет в наличии, выходим по красной
else{throw new Exception("Товар отсутствует");    }
А дальше уж сами...
Отличный мануал, спасибо огромное :-) Надо сделать на форуме раздел с примерами работы xpath :-)
 

Visky

Client
Регистрация
04.03.2020
Сообщения
45
Благодарностей
2
Баллы
8
Огромное спасибо за помощь, если Вы не против, то ещё один вопрос. Мне надо сделать 100 кликов за определённый промежуток времени, это 100 раз повторить условие в коде или есть варианты? Спасибо
 

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Мне надо сделать 100 кликов за определённый промежуток времени, это 100 раз повторить условие в коде или есть варианты? Спасибо
Думаю это работа для цикла:
C#:
//ищем элемент по xpath
var he = instance.ActiveTab.FindElementByXPath(@"//xpath", 0);
//эмулируем наведение мыши на элемент
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);

for(int i =0; i<100, i++)
{
    //кликаем
    instance.ActiveTab.FullEmulationMouseClick("left","click");
    //пауза 100мс
    Thread.Sleep(100);
}
 
  • Спасибо
Реакции: Visky

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