Рандомный клик выдачи Яндекс с эмуляцией мыши

Mazaj

Client
Регистрация
26.08.2018
Сообщения
3
Благодарностей
0
Баллы
1
Здравствуйте, подскажите пожалуйста как реализовать RANDOM в этом коде
Код:
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", 0);
if (he.IsVoid) return -1;
instance.ActiveTab.FullEmulationMouseMoveAboveHtmlElement(he, -30);
var ellement = instance.ActiveTab.FindElementByAttribute("div","class","organic__url-text","regexp", 0);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63

Mazaj

Client
Регистрация
26.08.2018
Сообщения
3
Благодарностей
0
Баллы
1

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Ну, +- так.
Код:
Random rand = new Random();//переменная для рандома
int i = 0;//переменная для определения последнего урл
string error;//переменная для проверки видимости
HtmlElement he;

for (i = 0;;i++)//бесконечный цикл с счетчиком
    {
        he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", i);//проверяем элемент
        if (he.IsVoid) {break;}//если не существует, то выходим из цикла
    }

do
{
    int url = rand.Next(0, i);//выбираем совпадение элемента рандомно
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0)//если элемент не находится в поле видимости
        {
            error = "Bad";//то "плохо"
        }
    else
        {
            error = "Good";//если нет, то "хорошо"
        }
}
while (error != "Good");//пока не будет "хорошо", не выходим из цикла

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);
System.Threading.Thread.Sleep(rand.Next(500, 1000));
instance.ActiveTab.FullEmulationMouseClick("left", "click");
Код не проверял, но, в теории, должен работать.
 
Последнее редактирование:
  • Спасибо
Реакции: kirillkorobkin и Mazaj

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Чуть дополнил. Забыл про проверку на видимость.
P.S. Проверил, все работает.
 
  • Спасибо
Реакции: Mazaj

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 991
Благодарностей
4 457
Баллы
113
Как-то мудрено выше все реализовано.
Я обычно собираю HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");
Потом рандомно выбираю элемент от 0 до hes.Count-1.
И HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", [здесь_полученное_значение]);
 
  • Спасибо
Реакции: Mazaj

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Как-то мудрено выше все реализовано.
Я обычно собираю HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");
Потом рандомно выбираю элемент от 0 до hes.Count-1.
И HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", [здесь_полученное_значение]);
Соре, пока не сильно разбираюсь в "веб-программировании". Забыл, что можно сразу все элементы взять. Привычка из обычной прожки, когда нужно "вручную" перебирать)) Но проверку на видимость я сделал для верности, мало ли что.
Тогда просто пропадает еще один цикл)
Код:
Random rand = new Random();//переменная для рандома
string error;//переменная для проверки видимости
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;

do
{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0)//если элемент не находится в поле видимости
        {
            error = "Bad";//то "плохо"
        }
    else
        {
            error = "Good";//если нет, то "хорошо"
        }
}
while (error != "Good");//пока не будет "хорошо", не выходим из цикла

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
P.S. Проверил, работает.
 
  • Спасибо
Реакции: Mazaj

Mazaj

Client
Регистрация
26.08.2018
Сообщения
3
Благодарностей
0
Баллы
1
Соре, пока не сильно разбираюсь в "веб-программировании". Забыл, что можно сразу все элементы взять. Привычка из обычной прожки, когда нужно "вручную" перебирать)) Но проверку на видимость я сделал для верности, мало ли что.
Тогда просто пропадает еще один цикл)
Код:
Random rand = new Random();//переменная для рандома
string error;//переменная для проверки видимости
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;

do
{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0)//если элемент не находится в поле видимости
        {
            error = "Bad";//то "плохо"
        }
    else
        {
            error = "Good";//если нет, то "хорошо"
        }
}
while (error != "Good");//пока не будет "хорошо", не выходим из цикла

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
P.S. Проверил, работает.
Огромное спасибо! Это то, что нужно!
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Потом рандомно выбираю элемент от 0 до hes.Count-1.
Count-1 не нужно, если используете метод Next то генерируемое случайное число больше или равно нижнего предела, но меньше верхнего.
rnd.Next(0, hes.Count) будет работать корректно.
 
  • Спасибо
Реакции: gevolushn

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 991
Благодарностей
4 457
Баллы
113
Count-1 не нужно, если используете метод Next то генерируемое случайное число больше или равно нижнего предела, но меньше верхнего.
rnd.Next(0, hes.Count) будет работать корректно.
Ясен перец, я же описал алгоритм словами, а не кодом))
 

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 605
Благодарностей
1 015
Баллы
113
Соре, пока не сильно разбираюсь в "веб-программировании". Забыл, что можно сразу все элементы взять. Привычка из обычной прожки, когда нужно "вручную" перебирать)) Но проверку на видимость я сделал для верности, мало ли что.
Тогда просто пропадает еще один цикл)
Код:
Random rand = new Random();//переменная для рандома
string error;//переменная для проверки видимости
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;

do
{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0)//если элемент не находится в поле видимости
        {
            error = "Bad";//то "плохо"
        }
    else
        {
            error = "Good";//если нет, то "хорошо"
        }
}
while (error != "Good");//пока не будет "хорошо", не выходим из цикла

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
P.S. Проверил, работает.
А если нету элементов (яндекс сменил ченить) оно зациклиться жеж, как лимитку красиво добавить?
if (hes.Count>0)
do

else

покатит?
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
А если нету элементов (яндекс сменил ченить) оно зациклиться жеж, как лимитку красиво добавить?
if (hes.Count>0)
do

else

покатит?
Надо использовать всего лишь другой цикл.
Код:
старый ненужный код
Вместо 100 ставим количество желаемых повторений. А также следует поменять поиск по атрибуту, если старый не работает.
 
Последнее редактирование:

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Надо использовать всего лишь другой цикл.
Код:
старый ненужный код
Вместо 100 ставим количество желаемых повторений. А также следует поменять поиск по атрибуту, если старый не работает.
Соре, вспомнил, что с циклом for сложности.
Вот нормальный код. Увеличиваем с каждой итерацией значение i на 1, пока не равно 100.
Код:
Random rand = new Random();//переменная для рандома
string error;//переменная для проверки видимости
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;
int i = 0;//счетчик
do
{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    i++;
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0)//если элемент не находится в поле видимости
        {
            continue;//если да, то продолжаем искать
        }
    else
        {
            break;//если нет, то выходим из цикла
        }
}
while (i!=100);//пока не будет "100", не выходим из цикла
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
 
Последнее редактирование:
  • Спасибо
Реакции: Mazaj

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
318
Благодарностей
73
Баллы
28
Подскажите пожалуйста, почему все коды выше выходят с такой ошибкой

Выполнение действия CSharp OwnCode: Рандомный клик. Входная строка имела неверный формат.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Подскажите пожалуйста, почему все коды выше выходят с такой ошибкой

Выполнение действия CSharp OwnCode: Рандомный клик. Входная строка имела неверный формат.
вот эти строки Convert.ToInt32(he.GetAttribute("leftInTab")) и Convert.ToInt32(he.GetAttribute("topInTab")) при не найденном элементе вызовут исключение "Входная строка имела неверный формат"
их надо всегда в try оборачивать . пример.
C#:
    int leftInTab =-1;
    int topInTab =-1;
    try { leftInTab = Convert.ToInt32(he.GetAttribute("leftInTab")); } catch{}
    try { topInTab = Convert.ToInt32(he.GetAttribute("topInTab")); } catch{}
    
    if (leftInTab <= 0 && topInTab <= 0)//если элемент не находится в поле видимости
 
  • Спасибо
Реакции: Fedor5588

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
318
Благодарностей
73
Баллы
28
вот эти строки Convert.ToInt32(he.GetAttribute("leftInTab")) и Convert.ToInt32(he.GetAttribute("topInTab")) при не найденном элементе вызовут исключение "Входная строка имела неверный формат"
их надо всегда в try оборачивать . пример.
C#:
    int leftInTab =-1;
    int topInTab =-1;
    try { leftInTab = Convert.ToInt32(he.GetAttribute("leftInTab")); } catch{}
    try { topInTab = Convert.ToInt32(he.GetAttribute("topInTab")); } catch{}
   
    if (leftInTab <= 0 && topInTab <= 0)//если элемент не находится в поле видимости
подскажите на примере верхнего кода пожалуйста, несколько часов уже мучаюсь не получается срастить..
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
подскажите на примере верхнего кода пожалуйста, несколько часов уже мучаюсь не получается срастить..
C#:
Random rand = new Random();//переменная для рандома
string error;//переменная для проверки видимости
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;
int i = 0;//счетчик
do
{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    i++;
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент

    int leftInTab =-1;
    int topInTab =-1;
    try { leftInTab = Convert.ToInt32(he.GetAttribute("leftInTab")); } catch{}
    try { topInTab = Convert.ToInt32(he.GetAttribute("topInTab")); } catch{}
    
    if (leftInTab <= 0 && topInTab <= 0)//если элемент не находится в поле видимости
        {
            continue;//если да, то продолжаем искать
        }
    else
        {
            break;//если нет, то выходим из цикла
        }
}
while (i!=100);//пока не будет "100", не выходим из цикла
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
 
  • Спасибо
Реакции: Fedor5588
Регистрация
21.11.2019
Сообщения
29
Благодарностей
1
Баллы
3
АПД. Все работает! По нескольку рас со скрипта норм гуляет.

Ну, +- так.
Код:
Random rand = new Random();//переменная для рандома
int i = 0;//переменная для определения последнего урл
string error;//переменная для проверки видимости
HtmlElement he;

for (i = 0;;i++)//бесконечный цикл с счетчиком
    {
        he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", i);//проверяем элемент
        if (he.IsVoid) {break;}//если не существует, то выходим из цикла
    }

do
{
    int url = rand.Next(0, i);//выбираем совпадение элемента рандомно
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0)//если элемент не находится в поле видимости
        {
            error = "Bad";//то "плохо"
        }
    else
        {
            error = "Good";//если нет, то "хорошо"
        }
}
while (error != "Good");//пока не будет "хорошо", не выходим из цикла

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);
System.Threading.Thread.Sleep(rand.Next(500, 1000));
instance.ActiveTab.FullEmulationMouseClick("left", "click");
Код не проверял, но, в теории, должен работать.
Здравствуйте. Спасибо за код! Применил)) Но есть одна проблема, он срабатывает в потоке ровно один раз.
Вернее так: первый раз он корректно срабатывает и из выдачи переходит на рандомный сайт.

Но когда дальше в сценарии выходит ошибка я хочу зациклить:
1 - закрываю рандомно открытую вкладку,
2 - снова открывается окно выдачи,
3 - и запускается ваш скрипт на второй круг в потоке... И тут проблема.. он формально по логам отрабатывает, но фактически перехода уже нет. :(

Скажите, пожалуйста, что-то может надо поправить в скрипте?
 
Последнее редактирование:

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