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

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Реакции
3 883
Баллы
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.
 
Код:
Развернуть Свернуть Копировать
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 нужно какое-то значение вставлять?
 
в восьмой строке вместо selected нужно какое-то значение вставлять?
Нет, не нужно. Возникла проблема какая-то?

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

PS: если что - этот сниппет не работает с select, внутри которого есть optgroup - для него у меня отдельный сниппет, который надо бы тоже выложить)
пробовал на вконтакте,но не отрабатывает,пишет minvalue не может быть maxvalue, а если меняю в ранд.числе 1 на 0,то пишет индекс за пределами масива
 
пробовал на вконтакте,но не отрабатывает,пишет minvalue не может быть maxvalue, а если меняю в ранд.числе 1 на 0,то пишет индекс за пределами масива
Можно этот select сюда?
И проверьте - без js срабатывает? Там просто может обработчик хитрый стоять.
 
вместо selectid пишу dropdown19 - верно?
[/SPOILER]
А где вы там тег select нашли? Вы же берете ID от html-тега td.

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

1. Там точно select и option?
2. Там нет optgroup?
3. На JS обработка не стоит какая-нибудь хитрая? Если да - попробуйте отключить JS.
 
Помогло после установки свойства сделать элементу reload. Без этого ну никак не работало.
 
  • Спасибо
Реакции: Lord_Alfred
Да, именно так, в самом конце кода делаю.
 
  • Спасибо
Реакции: Lord_Alfred
выбрать случайный элемент из выпадающего списка (select)
привет, а есть возможность сделать универсальный рандомный выбор любого элемента сайта, что бы на любом сайте эта функция работала?
 
привет, а есть возможность сделать универсальный рандомный выбор любого элемента сайта, что бы на любом сайте эта функция работала?
Ну по аналогии можете сделать, там код то 10 строк, не сложно разобраться :)
 
Код отрабатывает, элемент http://joxi.ru/Vm6GMBIxbBRD2Z случайным образом меняется (выбираю сколько картинок показывать на сайте (10,25,50,100)), но почему-то сайт не видит эти изменения и как было 50 картинок на сайте, так и осталось. При перезагрузке страницы, цифра сама меняется на 50
 
Код отрабатывает, элемент http://joxi.ru/Vm6GMBIxbBRD2Z случайным образом меняется (выбираю сколько картинок показывать на сайте (10,25,50,100)), но почему-то сайт не видит эти изменения и как было 50 картинок на сайте, так и осталось. При перезагрузке страницы, цифра сама меняется на 50
При перезагрузке страницы, если не происходило сохранения на сайте - она и поменяется обратно в любом случае.
 
При перезагрузке страницы, если не происходило сохранения на сайте - она и поменяется обратно в любом случае.
На сайте нет кнопки сохранения. Если менять руками http://joxi.ru/12Mb89T413GBAJ то все срабатывает :( Руками когда наводишь цифра синеет, а зенкой нет. Можно конечно попробовать эмуляцией мыши...
 
Последнее редактирование:
На сайте нет кнопки сохранения. Если менять руками http://joxi.ru/12Mb89T413GBAJ то все срабатывает :( Руками когда наводишь цифра синеет, а зенкой нет. Можно конечно попробовать эмуляцией мыши...
Там js-событие какое-то срабатывает во время того, как руками тыкаешь. Нужно разбираться и искать какое, чтоб вызвать его.
 
  • Спасибо
Реакции: spbalexpiter
Как это сделать? С чего начать?
 
Как это сделать? С чего начать?
В конструкторе действий для этого элемента выбрать тип Rise и тыкать "тестировать" каждое событие из списка, параллельно смотря в менеджер трафика - если уйдет запрос, очень похожий на сохранение - значит поймали. Если не получится так, то рыть JS
 
А вообще, стоит попробовать мой обновленный код ещё вначале:
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);
}
 
Спасибо! Реально помог! Давно хотел узнать как это делается)
 
А как допилить код чтобы выбрал определенное значение? Все переменные известны в списке...
код выглядит так...
<option value="AC">AC</option>

все value равны значениям. Как осуществить это?
 
А как допилить код чтобы выбрал определенное значение? Все переменные известны в списке...
код выглядит так...
<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
пишет что ОК, но ничего не происходит
 
значат id селекта указан неправильно или значение value в option ... возможно у вашего селекта нет id и его надо искать через class или какой-нмбудь другой аттрибут
 
  • Спасибо
Реакции: art22
Получился спасибо)
 
Последнее редактирование:
А вообще, стоит попробовать мой обновленный код ещё вначале:
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 и все равно иногда выбирало первое значение
 

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