t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как использовать аргумент из консоли в локаторах pytest

Теги: #<Tag:0x00007f748a7674a0> #<Tag:0x00007f748a767338> #<Tag:0x00007f748a767248>

Здравствуйте.
Необходимо использовать аргумент из консоли в локаторах pytest.
Проект состоит из 4х файлов. Запуск в консоли выглядит так

pytest test_yandex.py --basekeys="яндекс" --domain="yandex.ru"

Первый conftest.py:
принимает из консоли два аргумента, один --basekeys который используется в файле test_yandex.py(тут все работает и ок), второй --domain должен использоваться в локаторах(файл YandexPages.py) - как раз с ним и заминка

import pytest
from selenium import webdriver


@pytest.fixture(scope="class")
def setup():
    print("Инициализация драйвера FireFox")
    driver = webdriver.Firefox()
    driver.maximize_window()

    yield driver
    driver.quit()

def pytest_addoption(parser):
    parser.addoption("--basekeys", action="store", default="optional")
    parser.addoption("--domain", action="store", default="optional")

Второй BaseApp.py:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pytest


class BasePage:

    def __init__(self, driver):
        self.driver = driver
        self.base_url = "https://ya.ru/"

    def find_element(self, locator,time=10):
        return WebDriverWait(self.driver,time).until(EC.presence_of_element_located(locator),
                                                      message=f"Can't find element by locator {locator}")

    def find_elements(self, locator,time=10):
        return WebDriverWait(self.driver,time).until(EC.presence_of_all_elements_located(locator),
                                                      message=f"Can't find elements by locator {locator}")

    def go_to_site(self):
        return self.driver.get(self.base_url)

Третий YandexPages:

from BaseApp import BasePage
from selenium.webdriver.common.by import By
import time


class YandexSeacrhLocators:
    # Поле ввода запроса
    LOCATOR_YANDEX_SEARCH_FIELD = (By.ID, "text")
    # Кнопка найти
    LOCATOR_YANDEX_SEARCH_BUTTON = (By.CLASS_NAME, "search2__button")
    # Домен под заголовком элемента выдачи
    LOCATOR_YANDEX_SEARCH_DOMAIN = (By.XPATH,
                                    "//b[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), '" + domains + "')]")
    # Кнопка дальше
    LOCATOR_YANDEX_NEXT_PAGE_BUTTON = (By.CSS_SELECTOR, ".pager__item_kind_next")




class SearchHelper(BasePage):

    # Выполняется поиск строки ввода, клик на строку и ввод ключа
    def enter_word(self, word):
        search_field = self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_SEARCH_FIELD)
        search_field.click()
        search_field.send_keys(word)
        return search_field

    # Выполняется нажатие кнопки найти
    def click_on_the_search_button(self):
        print("Нажатие кнопки поиск")
        return self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_SEARCH_BUTTON, time=2).click()

    # Выполняется переход на следующую страницу результатов поиска с задержкой 2 сек после прогрузки кнопки дальше
    def click_on_the_next_page_button(self):
        print("Переход на следующую страницу")
        return self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_NEXT_PAGE_BUTTON, time=2).click()

    # Выполняется поиск домена на странице поиска с задержкой ожидания прогрузки элементов 2 сек
    def find_domain(self):
        print("Поиск домена")
        return self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_SEARCH_DOMAIN, time=2).is_displayed()

    # Выполняется клик по домену с задержкой после прогрузки элементов страницы 2 сек и после клика 3 сек
    def click_domain(self):
        self.find_element(YandexSeacrhLocators.LOCATOR_YANDEX_SEARCH_DOMAIN, time=2).click()
        print("Клик по домену " + domains + "")
        time.sleep(3)

Четвертый test_yandex.py:

from YandexPages import SearchHelper



def test_yandex_search(setup, pytestconfig):
    # Ключ берется из параметра командной строки basekeys
    key = pytestconfig.getoption('basekeys')
    yandex_main_page = SearchHelper(setup)
    # Выполняется открытие сайта Яндекс
    yandex_main_page.go_to_site()
    # Выполняется ввод ключа в строку поиска
    yandex_main_page.enter_word(key)
    # Выполняется клик по кнопку Найти
    yandex_main_page.click_on_the_search_button()

    # Условие Если для поиска нужного домена на странице результат поиска и клик по нему
    while True:
        try:
            # Ищем домен на странице
            yandex_main_page.find_domain()
        except Exception:
            # Домен не найден, выполняется переход на следующую страницу результатов поиска
            yandex_main_page.click_on_the_next_page_button()
        else:
            # Если домен найден то выполнить клик по ссылке
            yandex_main_page.click_domain()
            # Прерывание цикла
            break

Пытался реализовать использование в локаторах как и в файле test_yandex, но просто не воспринимается аргумент.

С python пыхчу третий день, прошу понять и простить)

если я не ошибаюсь, ( а я могу ошибаться) в первом файле conftest.py
вам мнужно добавить

@fixture(autouse=True)
def basekeys(request):
    """Return the base keys
    :param request:
    :return:
    """
    # get environment
    cli_value = request.config.getoption('--basekeys')
    yield cli_value


@fixture(autouse=True)
def domain(request):
    """Return the target host
    :param request:
    :return:
    """
    # get environment
    cli_value = request.config.getoption('--domain')
    yield cli_value