Что нового

Поставить флаг в checkbox на сайте

ProChelny

Новичок
Сообщения
2
Репутация
1
Добрый день. Есть сайт. Нужно получать с него отчеты о прохождении тестов пользователями.
Звучит всё достаточно просто:
Открыть страницу
Поставить флаги в несколько checkbox
В паре окон выбора указать значения
и нажать кнопку
Пока у меня код следующий.

Код:
#include <IE.au3>
#include <StringConstants.au3>
#AutoIt3Wrapper_Run_Debug_Mode=Y

Local $oIE = _IECreate("https://riptib.ispringonline.ru/reports/generate/performance_summary",0,1,0,1)
While $oIE.Busy
WEnd
$doc = $oIE.document
; wait for it...
While $doc.ReadyState <> "complete"
WEnd

; выбрать все виды тестов
$oDiv1 = $doc.getElementById("itemSelectionCheckAllCheckboxContainer")
$oDiv1.checked = True
Sleep(1000)

; чекбокс "Скрыть неназначенных"
$oDiv2 = $doc.getElementById("excludeNotAssigned")
$oDiv2.checked = True
Sleep(1000)

; выводить отчет на этой странице ниже, а не на новой странице
$oDiv6 = $doc.getElementById("showReportBelow")
$oDiv6.checked = True
Sleep(1000)

Local $oButton = _IEGetObjById($oIE, "btnRunReport")
_IEAction($oButton, 'focus')
_IEAction($oButton, 'click')
_IELoadWait($oIE)


Но верно в нем отрабатывает только нажатие кнопки. Правда поскольку чекбоксом не выбран ни один тест, то выходит сообщение "выберите тесты по которым хотите увидеть оценки"
При этом "забавная ситуация": showReportBelow - это клетка "Показать отчет ниже", флаг в ней не появляется, но если после выполнения скрипта проставить все другие флаги (кроме этого), то отчет действительно выйдет ниже, так будто флаг в этой ячейке всё же стоит.


Куски кода с сайта:

тут фрагмент с чекбоксом, при нажатии на которую должны выделиться все тесты (программы обучения)
Код:
<div class="clear"></div>
</div><input type="hidden" id="showDeletedStateSaveUrl" value="/reports/show_deleted/update" />                    </div>
                                                    <div class="select_all_checkbox header_item">
                        <div id="itemSelectionCheckAllCheckboxContainer" class="no_top_margin checkbox_field_container">
    <div class="checkbox_holder">
        <input
          id="itemSelectionCheckAllCheckbox"
          data-form-field-id="itemSelectionCheckAllCheckbox"
          data-form-field-type="checkbox"
          data-form-field-error-type="no_error"
          data-form-field-error-container-id="itemSelectionCheckAllCheckbox"
          data-form-field-initial-value=""
          data-form-field-large-click-area="0"
          data-element-value="0"
          type="checkbox"
          name=""
          value="0"
          class="form_field checkbox_form_field"
          title=""
          autocomplete="off"
                            />
    </div>

тут фрагмент с чекбоксом "Скрыть неназначенных" и "Показать отчет ниже"
Код:
<div class="report_step_content generate_report">
      <div class="run_report_settings_container">
                        <span class="exclude_not_assigned">
  <input type="checkbox" class="checkbox" id="excludeNotAssigned" />
  <label for="excludeNotAssigned" class="active">Скрыть неназначенных</label>
</span>        <div class="show_report_below_container">
          <div id="showReportBelowContainer" class="with_label checkbox_field_container">
    <div class="checkbox_holder">
        <input
          id="showReportBelow"
          data-form-field-id="showReportBelow"
          data-form-field-type="checkbox"
          data-form-field-error-type="no_error"
          data-form-field-error-container-id="showReportBelow"
          data-form-field-initial-value=""
          data-form-field-large-click-area="0"
          data-element-value="0"
          type="checkbox"
          name=""
          value="0"
          class="form_field checkbox_form_field"
          title=""
          autocomplete="off"
                            />
    </div>
            <label title="Показать отчет ниже" id="showReportBelowLabel" class="active checkbox_field_label" for="showReportBelow">Показать отчет ниже</label>
                        <div class="clear"></div>
</div>        </div>
      </div>

Это сайт с авторизацией, поэтому войти вы туда не сможете.
Но я очень надеюсь что вы покажете примеры рабочие.

И еще. Мне в примерах попадаются функции
_IEFormElementCheckBoxSelect
Но как я понял на том сайте нет блоков "Form"
 
Автор
P

ProChelny

Новичок
Сообщения
2
Репутация
1
Не стал использовать AutoIt (каюсь - грешен)
Воспользовался дополнением для Chrome, под названием Wild Fire.
Там записал макрос за 2 минуты... и он нифига не сработал.
Пришлось один фиг дорабатывать напильником.

К чему я это пишу: на сайте был элемент "список выбора" (select)
и был он настолько злоеб**ий, что не было у него друзей и кучу нервов он мне пожрал.

Суть в том, что код JavaScript
Код:
document.getElementById("organizationSetting").options[0].selected = true
Нормально устанавливал значение в это поле (его id = "organizationSetting"), но форма на это не реагировала. И при дальнейшем формировании отчет выходи как-будто я ничего не выбирал.

для решения нужно было вызвать
Код:
document.getElementById("organizationSetting").dispatchEvent(new Event("change"));
То есть вызвать событие "change" для этого элемента select.
Скорее всего и для остальных чекбоксов (checkbox) нужно вызывать подобные события, но их можно "протыкать" эмуляцией нажатия мыши по точным координатам.

Для новичков:
Как понять, а какое же событие у элемента:
Открываете Chrome
F12
Справа появится консоль
вверху есть инока "квадратик со стрелкой", называется как-то "выделите элемент чтоб проинспектировать
вот свой элемент и инспектируйте
внизу перейдите во вкладку "Event Listeners"
снимите флаг с клетки "Ancestors"
при этом останутся только "нужные" события - в моем случае - мне показало что это "change"

Эти шаги избавили меня от перебора событий OnCange, OnClick, Click...
 
Верх