Как создать автоматизированный тест для проверки сортировки товаров по цене?

Я понимаю принцип действия, но сталкиваюсь с трудностями в поиске нужного идентификатора или делаю что-то неправильно. На сайте <a href="https://arnypraht.com/category/bags/" rel="nofollow">https://arnypraht.com/category/bags/</a> имеется элемент span, щелчок по которому открывает выпадающее меню с несколькими способами сортировки. Меня интересуют именно пункты сортировки по возрастанию и убыванию цены.
  • 10 декабря 2024 г. 21:33
Ответы на вопрос 2
Для создания автоматизированного теста для проверки сортировки товаров по цене на сайте, вы можете воспользоваться инструментами для автоматизации браузера, такими как Selenium WebDriver. Ниже приведен пример, который демонстрирует, как это можно сделать на Python с использованием библиотеки Selenium.

### Шаги для создания теста:

1. **Установите необходимые библиотеки**:
   Убедитесь, что у вас установлен Python и библиотека Selenium, а также драйвер для вашего браузера (например, ChromeDriver для Google Chrome).

   ```bash
   pip install selenium
   ```

2. **Напишите тест**:
   Ниже приведен пример кода, который открывает страницу, щелкает на элемент для сортировки, выбирает пункт сортировки по возрастанию и убыванию цены и проверяет, правильно ли сортируются товары.

```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# Функция для проверки сортировки
def check_sorting(order):
    # Открытие браузера
    driver = webdriver.Chrome()
    driver.get("https://arnypraht.com/category/bags/")

    # Поиск элемента для сортировки
    sort_element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//span[contains(text(), 'Сортировать по')]"))
    )
    sort_element.click()

    # Выбор нужного метода сортировки
    if order == 'asc':
        sort_option = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//li[contains(text(), 'Цена по возрастанию')]"))
        )
    else:
        sort_option = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//li[contains(text(), 'Цена по убыванию')]"))
        )

    sort_option.click()
    time.sleep(2)  # Ждать, чтобы страница подгрузилась

    # Получение цен всех товаров после сортировки
    prices = driver.find_elements(By.XPATH, "//span[@class='price']")  # Предположим, что цена находится в span с классом 'price'
    price_values = [float(price.text.replace('₽','').replace(' ', '')) for price in prices]

    # Проверка сортировки
    if order == 'asc':
        assert price_values == sorted(price_values), "Товары не отсортированы по возрастанию цены"
        print("Товары отсортированы по возрастанию цены успешно.")
    else:
        assert price_values == sorted(price_values, reverse=True), "Товары не отсортированы по убыванию цены"
        print("Товары отсортированы по убыванию цены успешно.")

    driver.quit()

# Запуск проверки
check_sorting('asc')  # Проверка по возрастанию
check_sorting('desc')  # Проверка по убыванию
```

### Примечания:
1. **XPath**: Убедитесь, что XPath корректен и соответствует структуре HTML на сайте. Вы можете использовать инструменты разработчика в вашем браузере, чтобы найти правильные идентификаторы или классы для элементов.
  
2. **Производительность**: Временные ожидания (например, `time.sleep(2)`) можно заменить более элегантными подходами (как в примере с `WebDriverWait`), которые будут ждать появления элементов, прежде чем продолжить выполнение скрипта.

3. **Сортировка в зависимости от валюты**: Обратите внимание на форматирование цен; вам может потребоваться адаптировать код в зависимости от формата отображаемой цены на сайте.

4. **Тестирование**: Запустите тест, чтобы убедиться, что он работает правильно и валидирует сортировку цен корректно.

Эти шаги и пример кода помогут вам создать автоматизированный тест для проверки функционала сортировки товаров по цене.
its_southpaw , 
1. Что-то не так с селекторами, с теми которые у вас мне не удалось отыскать элементы.
Для того, чтобы хотя бы был клик по выпадающему меню, использовал такой:
SORT_BUTTON = (By.XPATH, "(//span[@class='select2-selection select2-selection--single select2-selection--buttoned select2-selection--buttoned-dark select select--sorting'])[1]")

2. Для SORT_ASC использовал такой:
SORT_ASC_OPTION = (By.ID, 'select2-catalog_sorting_mobile-7h-result-jsvp-price:asc')

3. Для SORT_DESC вы вообще решили не писать.
SORT_DESC_OPTION = (By.ID, 'select2-catalog_sorting_mobile-7h-result-jsvp-price:desc')

4. В def select_sort_option() добавил небольшую задержку (2-3 секунды) после
WebDriverWait(self.driver, 10).until(EC.staleness_of(option))
.

После этих манипуляций стало так:

Но второй тест не пройдёт, потому что вот это:
Что приводит к: [...11900, 11900, 7735, 11900...], что никак не будет равно отсортированному списку цен в assert .

З.Ы. если вы хотите читаемую кириллицу в выводе, а не вот это вот:
test_sort_by_price[\u0426\u0435\u043d\u0430 \u043f\u043e \u0432\u043e\u0437\
,
то добавьте файлик pytest.ini с содержимым:
[pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
Похожие вопросы