Используйте Python и Selenium для вывода текста только выбранного индекса - PullRequest
0 голосов
/ 15 апреля 2020

У меня возникли проблемы с созданием программы, которая автоматизирует процесс оформления заказа. Я использую python 3 вместе с Selenium. Программа анализирует диапазон дат, которые выводятся на страницу как доступные четыре доступных слота. Если ни одна из них не доступна на текущей странице, она нажмет кнопку «Далее» и выполнит поиск следующих четырех дат. Если он достигнет конца доступных диапазонов дат и ничего не найдет, он подождет тридцать секунд, перезагрузится и все сделает заново.

Я выполнил большую часть этого, за исключением двух проблем:

1) Я пытаюсь добавить аргумент, который, если он будет включен, выйдет за пределы go базовой функциональности (который должен просто уведомить пользователя с помощью текста, используя Twilio), и завершить полный процесс проверки.

Это код python, который я использую:

def find_available(args):

    dates_available = True
    spaces_free = False
    free_spaces = ""
    while not spaces_free:
        while dates_available:
            time.sleep(1.5)
            spots = driver.find_elements_by_css_selector('.ss-carousel-item')
            for spot_index, spot in zip(range(date_range), spots):
                if spot.value_of_css_property('display') != 'none':
                    spot.click()
                    available_dates = driver.find_elements_by_css_selector('.Date-slot-container')
                    for available_date in available_dates:
                        if available_date.value_of_css_property('display') != 'none':
                            selected_spot = available_date.find_element_by_css_selector('#slot-container-UNATTENDED')
                            if 'No doorstep delivery' not in selected_spot.text:
                                free_spaces = selected_spot.text.replace('Select a time', '').strip()
                                spaces_free = True
                            else:
                                print(selected_spot.text.replace('Select a time', '').strip())

        if spaces_free:
            print('Slots Available!')
            if args.checkout:
                client.messages.create(to=to_mobilenumber, 
                    from_=from_mobilenumber, 
                    body=free_spaces)
                driver.find_element_by_xpath("//*[contains(text(), 'Soonest available')]").click()
                time.sleep(1.5)
                driver.find_element_by_xpath("//input[@type='submit' and @value='Continue']").click()
                print('Your order has been placed!')
            else:
                client.messages.create(to=to_mobilenumber, 
                    from_=from_mobilenumber, 
                    body=free_spaces)
                print('Your order time will be held for the next hour.  Check your date and confirm!')

if __name__ == "__main__":
parser = argparse.ArgumentParser(description="auto-checkout")
parser.add_argument('--checkout', '-c', action='store_true',
                    help="Select first available slot and checkout")
args = parser.parse_args()
find_available(args)

Ожидаемое поведение

Если программа запускается с использованием аргумента '--checkout' или '- c', то, если для параметра space-free установлено значение true, она должна отправить текст с текстом внутри элемента 'free_spaces'. Затем он должен перейти к следующему этапу, который будет выбором радиокнопки, содержащей текст «Soonest available» (как при выборе первой доступной радиокнопки, содержащей доступный временной интервал), и затем нажать кнопку «Продолжить». .

Фактическое поведение

Программа запустится, найдет доступный временной интервал, затем просто перейдет к следующим дням, никогда не пытаясь выбрать переключатель и переместить вперед в процессе оформления заказа.

Что я делаю не так?

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 16 апреля 2020

мне кажется, что вы никогда не устанавливаете dates_available на False внутри вашего while l oop:

        while dates_available:
            time.sleep(1.5)
            spots = driver.find_elements_by_css_selector('.ss-carousel-item')
            for spot_index, spot in zip(range(date_range), spots):
                if spot.value_of_css_property('display') != 'none':
                    spot.click()
                    available_dates = driver.find_elements_by_css_selector('.Date-slot-container')
                    for available_date in available_dates:
                        if available_date.value_of_css_property('display') != 'none':
                            selected_spot = available_date.find_element_by_css_selector('#slot-container-UNATTENDED')
                            if 'No doorstep delivery' not in selected_spot.text:
                                free_spaces = selected_spot.text.replace('Select a time', '').strip()
                                spaces_free = True
                            else:
                                print(selected_spot.text.replace('Select a time', '').strip())

Так что вы никогда не выйдете из while l oop. Если вы не хотите переписывать весь лог c, вы можете установить dates_available = False сразу после установки spaces_free = True. Это позволило бы выйти из while l oop, но вам может понадобиться break или два для выхода из циклов for.

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

Нечто подобное может быть?

def find_available(args):

    def get_a_date():
        while True:
            time.sleep(1.5)
            spots = driver.find_elements_by_css_selector('.ss-carousel-item')
            for spot_index, spot in zip(range(date_range), spots):
                if spot.value_of_css_property('display') != 'none':
                    spot.click()
                    available_dates = driver.find_elements_by_css_selector('.Date-slot-container')
                    for available_date in available_dates:
                        if available_date.value_of_css_property('display') != 'none':
                            selected_spot = available_date.find_element_by_css_selector('#slot-container-UNATTENDED')
                            if 'No doorstep delivery' not in selected_spot.text:
                                return selected_spot.text.replace('Select a time', '').strip()

                            else:
                                print(selected_spot.text.replace('Select a time', '').strip())

    free_spaces = get_a_date()

    print('Slots Available!')
    if args.checkout:
        client.messages.create(to=to_mobilenumber,
            from_=from_mobilenumber,
            body=free_spaces)
        driver.find_element_by_xpath("//*[contains(text(), 'Soonest available')]").click()
        time.sleep(1.5)
        driver.find_element_by_xpath("//input[@type='submit' and @value='Continue']").click()
        print('Your order has been placed!')
    else:
        client.messages.create(to=to_mobilenumber,
            from_=from_mobilenumber,
            body=free_spaces)
        print('Your order time will be held for the next hour.  Check your date and confirm!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...