Задать вопрос
  • Как в шаблоне выделить несколько экземпляров модели чекбоксами и по нажатию на кнопку получить список выделенных экземпляров?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Предлагаю использовать стандартный вариант с html (предварительно, нужно найти этот шаблон). Галочка + выпадающий список (select) + кнопка отправки + уведомление в шаблоне будут выглядеть примерно так:
    <!-- Уведомления -->
    {% if messages %}
        <ul class="messages">
            {% for message in messages %}
                <li class="{{message.tags}}">{{message}}</li>
            {% endfor %}
        </ul>
    {% endif %}
    
    <form method="post" action="{% url 'view_name' %}">
        {% csrf_token %}
        <table>
            {% for item in items %}
                <tr>
                    <!-- Здесь другие столбцы -->
                    <td><input type="checkbox" name="selected_items" value="{{item.id}}"></td>
                </tr>
            {% endfor %}
        </table>
    
        <select name="action">
            <option value="action_1">Действие 1</option>
            <option value="action_2">Действие 2</option>
        </select>
        <button type="submit">Применить</button>
    </form>

    Затем, в представление обрабатываем данные из шаблона выше, пусть это будет view_name. Например, некоторые основные моменты:
    # Получаем из POST запроса выбранные items
    selected_ids = request.POST.getlist('selected_items')
    
    # Проверить, есть ли что в selected_ids, если нет, сообщить юзверю, пусть жмет сильнее
    if not selected_ids:
        messages.warning(request, "Товарищ Юзверь, жми сильнее")
        return redirect('view_name')
    
    # Получаем action
    action = request.POST.get('action')
    
    # Смотрим, что пришло в action, затем выполнить нужное действие, пусть это будет следующее:
    
    # Получаем из бд все объекты по списку selected_ids одним запросом
    items_to_update = ItemModel.objects.filter(id__in=selected_ids)
    
    # Обновляем поле, пусть это будет is_selected
    updated_count = items_to_update.update(is_selected=True)
    
    # Обрабатываем успешный успех
    messages.success(request, f"Молодец Юзверь, успешно отработано: {updated_count} элементов, возьми с полки пирожок")
    return redirect('view_name')

    Ну и условная модель:
    from django.db import models
    
    class ItemModel(models.Model):
        title = models.CharField(max_length=200)
        is_selected = models.BooleanField(default=False)
    
        def __str__(self):
            return self.title
    Ответ написан
    1 комментарий
  • Как с помощью Selenium на Python найти элемент html страницы, который расположен в #shadow-root (open)?

    @Delta-Strike
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from time import sleep

    # 1. Настройки и запуск браузера
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--window-size=1000,900")
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=chrome_options)
    wait = WebDriverWait(driver, 15)

    # 2. Открываем сайт
    driver.get("https://eaist.mos.ru/login.html?redirect=https://e...")

    # 3. Кнопка "Войти в систему"
    login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/button")))
    login_button.click()

    # 4. Функция для доступа к элементу внутри вложенных Shadow DOM
    def get_shadow_element(driver, selectors):
    script = '''
    let el = document;
    for (let sel of arguments[0]) {
    el = el.querySelector(sel);
    if (el && el.shadowRoot) {
    el = el.shadowRoot;
    }
    }
    return el;
    '''
    return driver.execute_script(script, selectors)

    # 5. Ждём загрузки Shadow DOM
    sleep(2)

    # 6. Путь до нужного элемента внутри Shadow DOM
    selectors = [
    'eaist-app', # Первый Shadow Host
    'eaist-panel-view', # Вложенный Shadow Host
    'cookie-notification' # Ещё один Shadow Host
    ]

    # 7. Получаем нужный элемент и кликаем по кнопке
    shadow = get_shadow_element(driver, selectors)
    button = shadow.find_element(By.CSS_SELECTOR, 'button') # Возможно, нужно уточнить селектор!
    button.click()

    # 8. Закрываем браузер
    sleep(3)
    driver.quit()
    Ответ написан
    2 комментария
  • Как с помощью Selenium на Python найти элемент html страницы, который расположен в #shadow-root (open)?

    @rPman
    Это фича shadow dom

    Единственное ее применение, как я понимаю, - это защита от блокировщиков рекламы, ее стали внедрять популярные веб сервисы (например пикабу)

    Правда пометка open говорит что элементы внутри должны быть доступны из javascript
    Ответ написан
    Комментировать
  • Как с помощью Selenium на Python найти элемент html страницы, который расположен в #shadow-root (open)?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    How to automate shadow DOM elements using selenium?

    Если коротко, то порядок следующий:
    1. Сначала нужно найти в основном dom тот элемент, к которому прикреплен shadow root.
    2. У п1. нужно получить свойство .shadow_root.
    3. И вот уже у п2. нужно вызывать его собственный метод find_element, чтобы найти нужный элемент внутри него.

    Или так:
    Локатор не находит элемент на сайте, хотя набран верно, пробовал разные варианты, не помогает, в чём проблема?
    Ответ написан
    3 комментария