Выбор случайного Option в теге Select [Дон шампиньон]

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Очень часто возникает необходимость при регистрации или каких-то других действиях в ZennoPoster выбрать случайный элемент из выпадающего списка (select). Уже давно сделал простенький C#-сниппет, который успешно выполняет это и упрощает мне жизнь без использования selecteditems и прочего ада :-)

В данном примере нужно заменить "select_ID" на идентификатор (id) тега select, в котором нужно выбрать случайный элемент.

Код:
HtmlElement he = instance.ActiveTab.MainDocument.FindElementById("select_ID");
HtmlElementCollection all_elements = he.GetChildren(false);

Random rnd = new Random();
int he_rnd = rnd.Next(1, all_elements.Count);

he = all_elements.Elements[he_rnd];
he.SetAttribute("selected", "selected");
Стоит отдельно отметить то, что в этом коде поиск тегов option пропускает первый элемент, т.к. обычно это что-то вроде "Выберите значение" с пустым атрибутом value.
Если в вашем конкретном случае нет первого пустого option, то в функции rnd.Next следует сменить первый атрибут с 1 на 0.
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
988
Благодарностей
388
Баллы
63
Код:
HtmlElement he = instance.ActiveTab.MainDocument.FindElementById("select_ID");
HtmlElementCollection all_elements = he.GetChildren(false);

Random rnd = new Random();
int he_rnd = rnd.Next(1, all_elements.Count);

he = all_elements.Elements[he_rnd];
he.SetAttribute("selected", "selected");
в восьмой строке вместо selected нужно какое-то значение вставлять?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
в восьмой строке вместо selected нужно какое-то значение вставлять?
Нет, не нужно. Возникла проблема какая-то?

PS: если что - этот сниппет не работает с select, внутри которого есть optgroup - для него у меня отдельный сниппет, который надо бы тоже выложить)
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
988
Благодарностей
388
Баллы
63
Нет, не нужно. Возникла проблема какая-то?

PS: если что - этот сниппет не работает с select, внутри которого есть optgroup - для него у меня отдельный сниппет, который надо бы тоже выложить)
пробовал на вконтакте,но не отрабатывает,пишет minvalue не может быть maxvalue, а если меняю в ранд.числе 1 на 0,то пишет индекс за пределами масива
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
пробовал на вконтакте,но не отрабатывает,пишет minvalue не может быть maxvalue, а если меняю в ранд.числе 1 на 0,то пишет индекс за пределами масива
Можно этот select сюда?
И проверьте - без js срабатывает? Там просто может обработчик хитрый стоять.
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
988
Благодарностей
388
Баллы
63

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
вместо selectid пишу dropdown19 - верно?
[/SPOILER]
А где вы там тег select нашли? Вы же берете ID от html-тега td.

Я даже сейчас зашел туда проверить, думал опечатка: там нет селекта. Это на js генерируется выпадающий список, не select.
 
  • Спасибо
Реакции: Sanekk

eagleowl

Client
Регистрация
03.11.2012
Сообщения
263
Благодарностей
30
Баллы
28
Из-за чего может не выбираться option в теге select?
Сам элемент находит, но как его выбрать непонятно. Не работают все варианты, в том числе ваш. Я пробовал так:
heCh.Click();
heCh.RiseEvent("click","full");
heCh.SetAttribute("selected", "selected");
Все без толку. Причем сам атрибут selected устанавливается, что интересно. Но все равно тег select почему-то не считает этот option выбранным.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Из-за чего может не выбираться option в теге select?
Сам элемент находит, но как его выбрать непонятно. Не работают все варианты, в том числе ваш. Я пробовал так:
heCh.Click();
heCh.RiseEvent("click","full");
heCh.SetAttribute("selected", "selected");
Все без толку. Причем сам атрибут selected устанавливается, что интересно. Но все равно тег select почему-то не считает этот option выбранным.
1. Там точно select и option?
2. Там нет optgroup?
3. На JS обработка не стоит какая-нибудь хитрая? Если да - попробуйте отключить JS.
 

eagleowl

Client
Регистрация
03.11.2012
Сообщения
263
Благодарностей
30
Баллы
28
Помогло после установки свойства сделать элементу reload. Без этого ну никак не работало.
 
  • Спасибо
Реакции: Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113

eagleowl

Client
Регистрация
03.11.2012
Сообщения
263
Благодарностей
30
Баллы
28
Да, именно так, в самом конце кода делаю.
 
  • Спасибо
Реакции: Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113

Protey

Client
Регистрация
09.01.2016
Сообщения
208
Благодарностей
29
Баллы
28
выбрать случайный элемент из выпадающего списка (select)
привет, а есть возможность сделать универсальный рандомный выбор любого элемента сайта, что бы на любом сайте эта функция работала?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
привет, а есть возможность сделать универсальный рандомный выбор любого элемента сайта, что бы на любом сайте эта функция работала?
Ну по аналогии можете сделать, там код то 10 строк, не сложно разобраться :-)
 

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
354
Благодарностей
56
Баллы
28
Код отрабатывает, элемент http://joxi.ru/Vm6GMBIxbBRD2Z случайным образом меняется (выбираю сколько картинок показывать на сайте (10,25,50,100)), но почему-то сайт не видит эти изменения и как было 50 картинок на сайте, так и осталось. При перезагрузке страницы, цифра сама меняется на 50
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Код отрабатывает, элемент http://joxi.ru/Vm6GMBIxbBRD2Z случайным образом меняется (выбираю сколько картинок показывать на сайте (10,25,50,100)), но почему-то сайт не видит эти изменения и как было 50 картинок на сайте, так и осталось. При перезагрузке страницы, цифра сама меняется на 50
При перезагрузке страницы, если не происходило сохранения на сайте - она и поменяется обратно в любом случае.
 

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
354
Благодарностей
56
Баллы
28
При перезагрузке страницы, если не происходило сохранения на сайте - она и поменяется обратно в любом случае.
На сайте нет кнопки сохранения. Если менять руками http://joxi.ru/12Mb89T413GBAJ то все срабатывает :( Руками когда наводишь цифра синеет, а зенкой нет. Можно конечно попробовать эмуляцией мыши...
 
Последнее редактирование:

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
На сайте нет кнопки сохранения. Если менять руками http://joxi.ru/12Mb89T413GBAJ то все срабатывает :( Руками когда наводишь цифра синеет, а зенкой нет. Можно конечно попробовать эмуляцией мыши...
Там js-событие какое-то срабатывает во время того, как руками тыкаешь. Нужно разбираться и искать какое, чтоб вызвать его.
 
  • Спасибо
Реакции: spbalexpiter

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
354
Благодарностей
56
Баллы
28
Как это сделать? С чего начать?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Как это сделать? С чего начать?
В конструкторе действий для этого элемента выбрать тип Rise и тыкать "тестировать" каждое событие из списка, параллельно смотря в менеджер трафика - если уйдет запрос, очень похожий на сохранение - значит поймали. Если не получится так, то рыть JS
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
А вообще, стоит попробовать мой обновленный код ещё вначале:
C#:
Random rnd = new Random();

HtmlElement he = instance.ActiveTab.MainDocument.FindElementById("select_ID");
HtmlElementCollection all_elements = he.FindChildrenByXPath(".//option");

if (all_elements.Count > 0) {
    // удаляем атрибут selected со старого элемента
    foreach (HtmlElement he_opt in all_elements) {
        if (he_opt.OuterHtml.IndexOf("selected") != -1) {
            he_opt.RemoveAttribute("selected");
        }
    }
   
    int he_rnd = rnd.Next(0, all_elements.Count);
    HtmlElement he_option = all_elements.Elements[he_rnd];

    // Вариант 1:
    he_option.SetAttribute("selected", "selected");
    he_option.RiseEvent("onchange", "Full");

    // Вариант 2: (раскоментировать его и закомментировать предыдущий)
    //he.SetAttribute("selecteditems", he_option.InnerHtml);
}
 

jun_dev

Пользователь
Регистрация
04.08.2017
Сообщения
121
Благодарностей
7
Баллы
18
Спасибо! Реально помог! Давно хотел узнать как это делается)
 

art22

Client
Регистрация
24.06.2016
Сообщения
484
Благодарностей
68
Баллы
28
А как допилить код чтобы выбрал определенное значение? Все переменные известны в списке...
код выглядит так...
<option value="AC">AC</option>

все value равны значениям. Как осуществить это?
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 719
Благодарностей
1 376
Баллы
113
А как допилить код чтобы выбрал определенное значение? Все переменные известны в списке...
код выглядит так...
<option value="AC">AC</option>

все value равны значениям. Как осуществить это?
примерно так

HtmlElement he = instance.ActiveTab.MainDocument.FindElementById("select_ID");
HtmlElement opt = he.FindChildByAttribute("option","value","^AC$","regexp",0);
opt.SetAttribute("selected", "selected");
 
  • Спасибо
Реакции: kolbassay и art22

art22

Client
Регистрация
24.06.2016
Сообщения
484
Благодарностей
68
Баллы
28
пишет что ОК, но ничего не происходит
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 719
Благодарностей
1 376
Баллы
113
значат id селекта указан неправильно или значение value в option ... возможно у вашего селекта нет id и его надо искать через class или какой-нмбудь другой аттрибут
 
  • Спасибо
Реакции: art22

art22

Client
Регистрация
24.06.2016
Сообщения
484
Благодарностей
68
Баллы
28
Получился спасибо)
 
Последнее редактирование:

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
354
Благодарностей
56
Баллы
28
А вообще, стоит попробовать мой обновленный код ещё вначале:
C#:
Random rnd = new Random();

HtmlElement he = instance.ActiveTab.MainDocument.FindElementById("select_ID");
HtmlElementCollection all_elements = he.FindChildrenByXPath(".//option");

if (all_elements.Count > 0) {
    // удаляем атрибут selected со старого элемента
    foreach (HtmlElement he_opt in all_elements) {
        if (he_opt.OuterHtml.IndexOf("selected") != -1) {
            he_opt.RemoveAttribute("selected");
        }
    }
  
    int he_rnd = rnd.Next(0, all_elements.Count);
    HtmlElement he_option = all_elements.Elements[he_rnd];

    // Вариант 1:
    he_option.SetAttribute("selected", "selected");
    he_option.RiseEvent("onchange", "Full");

    // Вариант 2: (раскоментировать его и закомментировать предыдущий)
    //he.SetAttribute("selecteditems", he_option.InnerHtml);
}
Что поменять, чтобы не брало первое значение? Все три имеющиеся цифры увеличивал на 1 и все равно иногда выбирало первое значение
 

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