Как можно повторно выбрать случайный набор флажков с помощью Selenium Python? - PullRequest
0 голосов
/ 09 июля 2019

Мой сценарий состоит в том, что есть несколько флажков с тегом имени, начинающимся с "CHK_ (число здесь)". Что я хочу сделать, это установить 5 случайных флажков, щелкнуть их (чтобы они были отмечены), как только они отмечены, нажать кнопку сортировки, которая определена как «sort_selected_button», и, наконец, снять флажки случайных флажков. На последнем этапе у меня возникают проблемы.

Это делается в Internet Explorer 11. Я впервые попадаю в Selenium Python для IE 11, поэтому буду признателен за любую помощь.

# Checks several batches, sort them with the Sort button, and then deselect
def check_sort_deselect_batches_selected(self):
    select_random_batches = self.driver.find_elements_by_xpath("//*[starts-with(@name, 'CHK_')]")

    for x in range(5):
        option = random.choice(select_random_batches)
        option.click()
        return option
    else:
        self.driver.find_element(*LeftSidebarLocators.sort_selected_button).click()

    time.sleep(2)

Мне удалось избавиться от любых сообщений об ошибках; однако единственная проблема заключается в том, как снова установить 5 случайно выбранных флажков после их сортировки. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 10 июля 2019

Существует метод is_checked(), который вернет True, если флажок установлен.Вы можете использовать это, чтобы определить, какие из флажков отмечены, а затем снова щелкнуть их, чтобы снять флажок.Прежде чем мы перейдем к окончательному коду, я хотел бы сделать пару предложений:

  1. Одна проблема, с которой вы можете столкнуться с вашим текущим кодом, заключается в том, что вы случайно выбираете одно и то же число дважды в вашем for петля.Если это произойдет, вы снимите флажок, который вы уже отметили, оставив только 4 отмеченных элемента.

    Чтобы исправить это, вы можете использовать filter, чтобы захватить только отмеченные поля и повторять цикл, пока вы неполучите len() из 5. Если вы снова получите такое же случайное число, щелчок будет пропущен, и вы снова выполните цикл.

  2. Оператор else всегда будет выполняться, так как у вас естьнет break в вашем цикле for, поэтому его можно безопасно удалить.См. документы для получения дополнительной информации.

Для нового кода вы можете использовать другой filter, чтобы получить только отмеченные поля изатем прокрутите их, нажимая каждый, чтобы снять все флажки.

# Checks several batches, sort them with the Sort button, and then deselect
def check_sort_deselect_batches_selected(self):
    select_random_batches = self.driver.find_elements_by_xpath("//*[starts-with(@name, 'CHK_')]")

    # loop until the count of checked elements is 5
    while len(list(filter(lambda e: e.is_checked(), select_random_batches))) < 5
        option = random.choice(select_random_batches)
        # make sure that the random choice isn't already checked
        if not option.is_selected()
            option.click()

    self.driver.find_element(*LeftSidebarLocators.sort_selected_button).click()

    # refetch the checkboxes after the sorting
    select_random_batches = self.driver.find_elements_by_xpath("//*[starts-with(@name, 'CHK_')]")

    # loop through the list of checked elements and deselect each
    for e in list(filter(lambda e: e.is_checked(), select_random_batches))
        e.click()

    time.sleep(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...