def setup_module(self):
     driver = webdriver.Remote(command_executor=self.remote_selenide_url,
                               desired_capabilities={
                                   'browserName': 'chrome',
                                   'javascriptEnabled': True
                               })
     browser.set_driver(driver)
示例#2
0
def setup(request):
    set_driver(get_test_driver())

    def teardown():
        driver().quit()

    request.addfinalizer(teardown)
示例#3
0
def chrome() -> Iterator[Chrome]:
    driver = _create_headless_browser()
    set_driver(driver)

    try:
        yield driver
    finally:
        driver.quit()
示例#4
0
 def setup_method(self, method):
     chrome_options = webdriver.ChromeOptions()
     # chrome_options.add_argument('--headless')
     chrome_options.add_argument("--disable-extensions")
     chrome_options.add_argument('--start-maximized')
     driver = webdriver.Chrome(ChromeDriverManager().install(),
                               options=chrome_options)
     browser.set_driver(driver)
示例#5
0
def setup_function(function):
    set_driver(webdriver.Chrome())
    browser.open_url("https://buggy.unitedtraders.team/")
    s('[href="\/login"]').click()
    s('#email').send_keys('*****@*****.**')
    s('#password').send_keys('1qaz2wsx')
    s('.btn-success').click()
    print(s(".alert-success").should_be(visible).text)
示例#6
0
def setup_module(module):
    driver = webdriver.Remote(
        command_executor='http://192.168.124.44:4444/wd/hub',
        desired_capabilities={
            'browserName': 'chrome',
            'javascriptEnabled': True
        })
    browser.set_driver(driver)
示例#7
0
def get_driver():
    global driver
    if not driver:
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--window-size=1360,1020')
        driver = webdriver.Chrome(ChromeDriverManager().install(),
                                  chrome_options.to_capabilities())
    browser.set_driver(driver)
    return driver
示例#8
0
def wd(request, browser_type, remote_wd):
    """Webdriver object"""

    if browser_type == "firefox":
        wd = webdriver.Firefox(log_path="logs/geckodriver.log")
    elif browser_type == "chrome":
        wd = webdriver.Chrome()
    elif browser_type == "chrome-nogui":
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--disable-web-security')
        wd = webdriver.Chrome(chrome_options=options)
    elif browser_type == "rfirefox":
        wd = webdriver.Remote(remote_wd,
                              desired_capabilities={"browserName": "firefox"})
    elif browser_type == "rchrome":
        wd = webdriver.Remote(remote_wd,
                              desired_capabilities={"browserName": "chrome"})
    elif browser_type == "selenoid_chrome":
        capabilities = {
            "browserName": "chrome",
            "version": "63.0",
            "enableVNC": True,
            "enableVideo": True,
            "screenResolution": "1280x1024x24"
        }
        wd = webdriver.Remote(command_executor=remote_wd,
                              desired_capabilities=capabilities)
    elif browser_type == "selenoid_firefox":
        capabilities = {
            "browserName": "firefox",
            "version": "57.0",
            "enableVNC": True,
            "enableVideo": True
        }
        wd = webdriver.Remote(command_executor=remote_wd,
                              desired_capabilities=capabilities)
    else:
        raise ValueError("Unrecognized browser %s" % browser_type)

    if not wd:
        raise RuntimeError("wd is not defined")

    wd = EventFiringWebDriver(wd, WdListener())
    logger.info("Browser {} started".format(browser_type))
    wd.set_window_size(1280, 1024)
    logger.info("Set window size 1280x1024")
    wd.delete_all_cookies()
    config.reports_folder = "logs/screenshots"

    def fin():
        browser.quit()

    request.addfinalizer(fin)
    browser.set_driver(wd)
示例#9
0
    def setUpClass(cls):
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_argument("--start-maximized")

        cls.driver = webdriver.Chrome(
            executable_path=ChromeDriverManager().install(),
            chrome_options=chrome_options)

        browser.set_driver(cls.driver)
示例#10
0
def setup_function(f):
    global browser
    global shaded_browser

    set_driver(get_test_driver())
    open_url(TODOMVC_URL)
    s("#new-todo").should_be(visible)

    browser = get_test_driver()
    browser.get(TODOMVC_URL)
    WebDriverWait(browser, 4).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "#new-todo")))

    shaded_browser = get_test_driver()
def set_up_class():
    driver = webdriver.Remote(
        command_executor='http://127.0.0.1:4444/wd/hub',
        desired_capabilities={'browserName': 'chrome',
                              'version': '60.0',
                              'javascriptEnabled': True,
                              "enableVNC": True,
                              "screenResolution": "1960x1280x24",
                              "platform": os.name.encode('utf-8')})
    browser.set_driver(driver)
    # prepare something ahead of all ui_tests
    config.base_url = "https://mail.google.com/mail"
    config.timeout = 7
    yield
    browser.close()
示例#12
0
def _configure_remote_driver():
    options = Options()
    options.add_argument("--start-maximized")
    caps = {'browserName': 'chromium',
            'version': '2.38',
            'javascriptEnabled': True}

    desired_capabilities = options.to_capabilities()
    desired_capabilities.update(caps)

    driver = webdriver.Remote(
        command_executor=REMOTE_HOST + ":" + REMOTE_PORT,
        desired_capabilities=desired_capabilities
    )

    browser.set_driver(driver)
示例#13
0
def set_default_driver():
    # настройки хрома
    options = webdriver.ChromeOptions()
    options.add_argument("--dns-prefetch-disable")
    options.add_argument("--headless")
    options.add_argument('--disable-gpu')

    # по умолчанию 4, можно настроить:)
    config.timeout = 7

    # для удаленного
    if settings.SELENIUM_SERVER_STANDALONE:
        driver = webdriver.Remote(
            command_executor=settings.SELENIUM_SERVER_STANDALONE,
            desired_capabilities=options.to_capabilities()
        )
        browser.set_driver(driver)
示例#14
0
 def setUp(self):
     config.browser_name = BrowserName.CHROME
     config.base_url = BASE_URL
     chrome_options = Options()
     if HEADLESS:
         chrome_options.add_argument("--headless")
         chrome_options.add_argument("window-size=1024,768")
         chrome_options.add_argument("--no-sandbox")
     if AUTO_INSTALL_DRIVER:
         if BaseTest.auto_installed_driver_path is None:
             BaseTest.auto_installed_driver_path = ChromeDriverManager(
             ).install()
         browser.set_driver(
             webdriver.Chrome(BaseTest.auto_installed_driver_path,
                              options=chrome_options))
     else:
         browser.set_driver(webdriver.Chrome(options=chrome_options))
示例#15
0
def set_browser(request):
    browser_name = request.config.getoption("browser_name")
    user_language = request.config.getoption("language")
    if browser_name == "chrome":
        print(
            f"\nuser language: {user_language}\nstart {browser_name} browser for test.."
        )
        options = Options()
        options.add_experimental_option(
            'prefs', {'intl.accept_languages': user_language})
        set_driver(webdriver.Chrome(options=options))
    elif browser_name == "firefox":
        print(
            f"\nuser language: {user_language}\nstart {browser_name} browser for test.."
        )
        fp = webdriver.FirefoxProfile()
        fp.set_preference("intl.accept_languages", user_language)
        set_driver(webdriver.Firefox(firefox_profile=fp))
    else:
        raise pytest.UsageError("--browser_name should be chrome or firefox")

    yield
    print("\nquit browser..")
    quit_driver()
示例#16
0
def before_all(context):
    if os.environ.get('DOCKER') == "true":
        browser.set_driver(
            webdriver.Remote(
                command_executor='http://selenoid:4444/wd/hub',
                desired_capabilities={
                    "browserName": "chrome",
                    "version": "latest",
                    'chromeOptions': {
                        'args': [
                            '--no-sandbox', '--start-maximized',
                            '--disable-infobars', '--disable-extensions'
                        ],
                        'prefs': {
                            "download.default_directory":
                            "/tmp/downloads",
                            "download.prompt_for_download":
                            False,
                            'profile.default_content_setting_values.automatic_downloads':
                            1
                        }
                    },
                    'enableVNC': True,
                    'screenResolution': '1920x1080x24'
                }))
        browser.driver().set_window_size(1920, 1080)
        context.session_id = browser.driver().session_id
    elif os.environ.get('DOCKER') == "false":
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--window-size=1420,1080')
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        browser.set_driver(webdriver.Chrome(chrome_options=chrome_options))
    else:
        if os.environ.get('BROWSER', 'chrome') == "chrome":
            chromedriver = ChromeDriverManager().install()
            browser.set_driver(
                webdriver.Chrome(executable_path=chromedriver,
                                 chrome_options=capabilities(context)))
            context.session_id = browser.driver().session_id
示例#17
0
def setup():
    set_driver(webdriver.Chrome())
示例#18
0
def test_manual_start():
    driver = get_test_driver()
    set_driver(driver)
    open_url(start_page)
    s("#header").should_have(exact_text("Selene"))
示例#19
0
 def setup_class(cls):
     browser.set_driver(webdriver.Firefox(executable_path='./geckodriver'))
示例#20
0
def setup_module(m):
    set_driver(webdriver.Chrome(ChromeDriverManager().install()))
示例#21
0
import pytest
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selene import config, browser

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920x1080')
driver = webdriver.Chrome(options=options)
browser.set_driver(driver)
driver.maximize_window()
config.timeout = 15


@pytest.fixture(autouse=True)
def setup():
    browser.open_url('https://www.google.com')
    yield
    browser.quit()
示例#22
0
class BaseTestClass(object):
    """ Базовый класс для всех Helper классов """
    @staticmethod
    def get_method_name() -> str:
        """ Возвращает имя текущего метода """
        return inspect.stack()[1][3]

    ####################################################################################################################
    # Инициализация логирования
    StreamHandler(sys.stdout, level=config_file.DEBUG_LEVEL).push_application()
    log = Logger("Logbook")

    ####################################################################################################################
    # Инициализация Webdriver соответствующего браузеру, указанному в конфиг-файле. Для Selenium-Grid.
    drv = None

    # Chrome
    if config_file.BROWSER.lower() == "chrome":
        try:
            drv = webdriver.Remote("http://selenium_hub:4444/wd/hub",
                                   DesiredCapabilities.CHROME)
        except URLError:
            allure.attach("Нужно прописать в hosts: 127.0.0.1   selenium_hub",
                          "Причина падения теста")
            assert False

    # Отключить автоматическую инициализацию вебдрайвера в Selene и использовать собственный экземпляр драйвера:
    browser.set_driver(drv)

    # C изменёнными размерами окна браузера
    try:
        width = config_file.BROWSER_SIZE[0]
        height = config_file.BROWSER_SIZE[1]
    except AttributeError:
        try:
            # Если не указаны размеры окна в конфигурационном файле, то на весь экран
            drv.maximize_window()
        except WebDriverException:
            drv.set_window_size(
                1000, 700
            )  # В нескольких версиях Вебдрайвера был косяк и на весь экран не работало
    else:
        drv.set_window_size(width, height)

    # Неявное ожидание для AJAX
    drv.implicitly_wait(config_file.IMPLICITLY_WAIT_TIMEOUT)  # в секундах

    ####################################################################################################################
    @staticmethod
    def teardown_module() -> None:
        """ Выход из браузера """
        browser.quit()

    ####################################################################################################################
    def screen_shot(self, message: str) -> None:
        """
        Сделать скриншот в формате PNG и прикрепить его к Аллюре отчёту
            :param message: Сообщение в Аллюре отчёт
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        time.sleep(config_file.WAIT_TIMEOUT)
        base64_png_file = self.drv.get_screenshot_as_png()
        allure.attach(base64_png_file, message, allure.attachment_type.PNG)

    ####################################################################################################################
    def attach_json(self, message: str, json_data: str) -> None:
        """
        Прикрепить данные JSON к Аллюре отчёту
            :param message: Сообщение в Аллюре отчёт
            :param json_data: Строка с JSON
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        allure.attach(json_data, message, allure.attachment_type.JSON)

    ####################################################################################################################
    @allure.step("Открыть страницу сайта")
    def open_site(self, site_name: str) -> None:
        """
        Открыть страницу сайта
            :param site_name: URL страницы сайта, например, http://testing.turd:7777/
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        self.drv.get(site_name)  # Ловить эксцепшн не нужно!

    ####################################################################################################################
    @allure.step("Проверить отображение страницы входа в приложение")
    def check_login_page_show(self) -> None:
        """ Проверить отображение страницы входа в приложение """
        self.log.debug(f"Work '{self.get_method_name()}'")
        check_locator = "button[type='submit']"  # Кнопка ввода
        try:
            self.flash(s(by.css(check_locator))).is_displayed()
            self.screen_shot("Страница входа в приложение удачно открылась")
        except NoSuchElementException:
            self.screen_shot("Страница входа в приложение не открылась")
            assert False

    ####################################################################################################################
    def flash(self,
              element: SeleneElement,
              flash_quantity=config_file.FLASH_QUANTITY) -> SeleneElement:
        """
        Алиас для метода 'highlight'
            :param element: SeleneElement
            :param flash_quantity: Необязательный параметр - количество миганий
            :return element SeleneElement для каскадирования
        """
        # self.log.debug(f"Work '{get_method_name()}'")
        return self.highlight(element, flash_quantity=flash_quantity)

    ####################################################################################################################
    def highlight(self,
                  element: SeleneElement,
                  flash_quantity=config_file.FLASH_QUANTITY) -> SeleneElement:
        """
        Подсветка кликаемого элемента на WEB-странице для SeleneElement
            :param element: SeleneElement
            :param flash_quantity: Необязательный параметр - количество миганий
            :return element SeleneElement для каскадирования
        """
        # self.log.debug(f"Work '{get_method_name()}'")
        if config_file.FLASH_ALLOWED:

            def apply_style(style):
                @fix_decorator_for__stale_element_reference_exception
                def wrap_1():
                    self.drv.execute_script(
                        "arguments[0].setAttribute('style', arguments[1]);",
                        native_element, style)

                wrap_1()

            native_element = element.get_actual_webelement(
            )  # Натуральный элемент Selenium-а, не Selene!!!

            # Сохранение оригинального стиля
            @fix_decorator_for__stale_element_reference_exception
            def wrap_2():
                return native_element.get_attribute('style')

            original_style = wrap_2()
            # Конец Сохранения оригинального стиля

            while flash_quantity > 0:
                time.sleep(config_file.FLASH_PERIOD)
                # apply_style("background: yellow; border: 2px solid red;")     # От добавления рамки - разъезжается
                apply_style("background: red;")

                time.sleep(config_file.FLASH_PERIOD)
                apply_style(original_style)

                flash_quantity = flash_quantity - 1

        return element

    ####################################################################################################################
    def highlight_native_web_element(self, element) -> None:
        """
        Подсветка кликаемого элемента на WEB-странице для Вебэлемента Selenium
            :param element: Selenium Web Element
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        if config_file.FLASH_ALLOWED:

            def apply_style(style):
                self.drv.execute_script(
                    "arguments[0].setAttribute('style', arguments[1]);",
                    element, style)

            flash_quantity = config_file.FLASH_QUANTITY  # Количество миганий

            # Сохранение оригинального стиля
            original_style = element.get_attribute('style')

            while flash_quantity > 0:
                time.sleep(config_file.FLASH_PERIOD)
                # apply_style("background: yellow; border: 2px solid red;")     # От добавления рамки - разъезжается
                apply_style("background: red;")

                time.sleep(config_file.FLASH_PERIOD)
                apply_style(original_style)

                flash_quantity = flash_quantity - 1

    ####################################################################################################################
    def open_left_bar(self) -> None:
        """ Открыть левую панель с параметрами, если она закрыта """
        self.log.debug(f"Work '{self.get_method_name()}'")
        left_bar_xpath = "//div[@id='mySidenav']"
        left_opener_xpath = "//div[@id='leftSideButton']"
        self.open_bar(left_bar_xpath, left_opener_xpath)

    ####################################################################################################################
    def open_right_bar(self) -> None:
        """ Открыть правую панель с уведомлениями и историей, если она закрыта """
        self.log.debug(f"Work '{self.get_method_name()}'")
        right_bar_xpath = "//div[@id='mySidenav2']"
        right_opener_xpath = "//div[@id='rightSideButton']"
        self.open_bar(right_bar_xpath, right_opener_xpath)

    ####################################################################################################################
    def open_bar(self, bar_xpath: str, opener_xpath: str) -> None:
        """
        Открыть выдвигающуюся панель
            :param bar_xpath: Xpath панели
            :param opener_xpath: Xpath элемента открывания панели
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        # Если панель закрыта, то открыть
        if "width: 0px;" in s(by.xpath(bar_xpath)).get_attribute("style"):
            self.shading_disappearing()  # Затемнение
            self.highlight(s(by.xpath(opener_xpath)))
            s(by.xpath(opener_xpath)).click()
        # Проверить, что панель открылась
        assert "width: 0px;" not in s(
            by.xpath(bar_xpath)).get_attribute("style")

    ####################################################################################################################
    def shading_disappearing(self) -> None:
        """ Ожидание исчезновения затемнения """
        self.log.debug(f"Work '{self.get_method_name()}'")
        rent_button_xpath = "//a[contains(@title,'Аренда, безвозмездное пользование, доверительное управление " \
                            "имуществом, иные договоры, предусматривающие передачу прав владения и пользования в " \
                            "отношении государственного и муниципального имущества')]"

        wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \
            .until(ec.element_to_be_clickable((By.XPATH, rent_button_xpath)))

        self.log.debug("The shading was gone")

    ####################################################################################################################
    def shading_disappearing_in_frame(self) -> None:
        # TODO: Пока не реализовано!!!
        """ Ожидание пропадания затемнения во фрейме """
        self.log.debug(f"Work '{self.get_method_name()}'")
        shading_xpath = "//div[@id='BlockLoaderPanel' and contains(@style, 'display')]"
        wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \
            .until(ec.invisibility_of_element_located((By.XPATH, shading_xpath)))

    ####################################################################################################################
    def alert_accept(self, page) -> None:
        """
        Подтверждение в небраузерном алерт-е
            :param page: Page Object
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        ok_button_xpath = "//button[@id='alertify-ok']"

        # Иначе всплывающего окна не видно
        self.drv.switch_to.default_content()  # Вернуться из фреймов
        page.switch_to_page_frame()  # Снова переключиться на фрейм

        # Дождаться ПОЯВЛЕНИЯ всплывшего окна
        wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \
            .until(ec.element_to_be_clickable((By.XPATH, ok_button_xpath)))

        self.highlight(s(by.xpath(ok_button_xpath))).click()

        # Дождаться ПРОПАДАНИЯ всплывшего окна
        wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \
            .until_not(ec.element_to_be_clickable((By.XPATH, ok_button_xpath)))

    ####################################################################################################################
    def js_click(self, selene_element: SeleneElement) -> None:
        """
        Замена клика в Selenium, который не работает во фремах с 'padding' (workaround)
            :param selene_element: Selene Element
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        self.highlight(selene_element)  # Подсветка мигающая
        native_element = selene_element.get_actual_webelement(
        )  # Вычленить из SeleneElement элемент Selenium
        self.drv.execute_script("arguments[0].click();",
                                native_element)  # Клик через скрипт

    ####################################################################################################################
    def switch_to_frame_with_adaptive_waiting(self,
                                              frame_xpath: str,
                                              wait_time: int = 60) -> None:
        """
        Переключение на фрейм с адаптивным временем ожидания
            :param frame_xpath: Xpath фрейма
            :param wait_time: Время ожидания появления фрейма
        """
        self.log.debug(
            f"Work '{self.get_method_name()}': wait_time = {wait_time}")
        begin_ticks = time.time()
        end_ticks = begin_ticks + wait_time

        step = 0
        while True:
            step = step + 1

            # Поиск элемента фрейма и переключение на фрейм
            try:
                frame_element = self.drv.find_element_by_xpath(frame_xpath)
                self.drv.switch_to.frame(frame_element)
            except NoSuchFrameException:
                tenfold_wait_timeout = config_file.WAIT_TIMEOUT / 10  # Для сокращения числа шагов ожидания
                time.sleep(tenfold_wait_timeout)
            else:
                break

            # Выход по превышению wait_time
            current_ticks = time.time()
            if current_ticks > end_ticks:
                break

    ####################################################################################################################
    @allure.step("Закрыть все открытые фреймы")
    def close_frames(self, wait_time: int = 60) -> None:
        """
        Закрыть все 'iframes' путём нажатия крестика в закладке
            :param wait_time: Время ожидания в секундах
        """

        self.log.debug(
            f"Work '{self.get_method_name()}'. Wait time: {wait_time} seconds."
        )

        close_frame_xpath = "//div[@id='mainTabs']//div[@class='close-button']"

        frames_count_for_close = 10  # Бывали зацикливания какие-то в Webdriver
        while frames_count_for_close > 0:

            crosses_closing_frames = ss(by.xpath(close_frame_xpath))
            frames_count = crosses_closing_frames.size()
            self.log.debug(f"Opened frames: {frames_count} ")
            if frames_count > 0:

                # Обработка долгого автоматического обновления фрейма
                self.check_show_control_with_adaptive_waiting(
                    close_frame_xpath, wait_time)

                self.highlight(crosses_closing_frames[0])

                try:
                    crosses_closing_frames[0].click()
                except WebDriverException:
                    self.log.debug(
                        f"Cross click error - wait {config_file.WAIT_TIMEOUT} second"
                    )
                    time.sleep(config_file.WAIT_TIMEOUT)
                    crosses_closing_frames[0].click()

                frames_count_for_close -= 1
            else:
                break

    ####################################################################################################################
    def check_show_control_with_adaptive_waiting(
            self,
            control_xpath: str,
            wait_time: int,
            frame_element: str = "") -> bool:
        """
        Проверить отображение контрола на странице по Xpath, с адаптивным временем ожидания
            :param control_xpath: Xpath проверяемого элемента
            :param wait_time: Время ожидания появления тега в секундах
            :param frame_element: Вэбэлемент фрейма
            :return: True - если тег присутствует, иначе - False
        """
        self.log.debug(f"Work '{self.get_method_name()}'. "
                       f"Xpath: {control_xpath}. "
                       f"Maximum wait time: {wait_time} seconds.")
        exist_flag = False

        begin_ticks = time.time()
        end_ticks = begin_ticks + wait_time

        step = 0
        while True:

            step = step + 1

            if frame_element != "":
                # Выйти из фреймов
                self.drv.switch_to.default_content()

                # Переключиться на фрейм
                self.drv.switch_to.frame(frame_element)

            # Проверить отображение контрола на странице
            if self.check_show_control(control_xpath):
                exist_flag = True
                if exist_flag:
                    # Дождаться отсутствия затенения
                    self.shading_disappearing()
                break

            # Выход по превышению wait_time
            current_ticks = time.time()
            if current_ticks > end_ticks:
                self.log.debug(f"Timeout conversion exit: ~{wait_time} sec.")
                break

            time.sleep(config_file.WAIT_TIMEOUT)
            self.log.debug(f"step: {step}")

        return exist_flag

    ####################################################################################################################
    def check_show_control(self, check_xpath: str) -> bool:
        """
        Проверить отображение контрола на странице по Xpath
            :param check_xpath: Xpath проверяемого элемента
            :return: True - если тег присутствует , иначе - False
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        try:
            # Дождаться неявно видимости элемента
            self.log.debug(
                f"Implicitly expect in 'check_show_control'."
                f" Maximum wait time: {config_file.IMPLICITLY_WAIT_TIMEOUT} seconds."
            )
            wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \
                .until(ec.visibility_of_element_located((By.XPATH, check_xpath)))
        except (NoSuchElementException, TimeoutException):
            result = False
        else:
            result = True
        self.log.debug(
            f"Result 'check_show_control' for xpath {check_xpath}: '{result}'")
        return result

    ####################################################################################################################
    def quit_from_frame_and_close_frames(self) -> None:
        """
        Выйти из фрейма и закрыть все фреймы
        """

        self.log.debug(f"Work '{self.get_method_name()}'")

        # Вернуться из фреймов
        self.drv.switch_to.default_content()

        # Закрыть все iframes, если они открыты
        self.close_frames(wait_time=config_file.WAIT_TIMEOUT)

    ####################################################################################################################
    def current_date_time_output(self) -> None:
        """
        Выводит текущую дату и время в аллюре отчёт
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        current_date_time = datetime.datetime.now().strftime("%Y/%m/%d %H:%M")
        self.log.debug(f"Start test time: {current_date_time}")
        allure.attach(f"{current_date_time}",
                      f"Время старта теста: {current_date_time}")

    ####################################################################################################################
    def get_user_language(self, profile_page) -> str:
        """ Возвращает язык пользователя из профиля """
        self.log.debug(f"Work '{self.get_method_name()}'")

        # Переключиться на фрейм
        profile_page.switch_to_page_frame()

        language_label_xpath = "//label[@for='language']"
        self.flash(s(by.xpath(language_label_xpath)))

        language_xpath = language_label_xpath + "/following-sibling::select/option[@selected='selected']"
        user_language = s(by.xpath(language_xpath)).text

        self.log.debug(f"User language: '{user_language}'")
        allure.attach(f"{user_language}", f"User language: {user_language}")

        return user_language

    def check_words(self, user_language: str, labels_dict: dict,
                    label_type: str) -> None:
        """
        Проверяет слова на соответствие словарю, соответствующему языку пользователя
            :param user_language: Язык пользователя, например 'French'
            :param labels_dict: Словарь со словами
            :param label_type: Тип лейбла (tag, menu и т.п.)
        """
        self.log.debug(f"Work '{self.get_method_name()}'")

        status = False

        if label_type == "tag":
            label_type_insertion = "теге"
        elif label_type == "menu":
            label_type_insertion = "пункте меню"
        else:
            self.log.debug("Error: 'label_type' not defined!")

        try:
            language_dictionary = import_module(
                f"dictionaries.{user_language}")
        except ModuleNotFoundError:
            self.log.debug(f"No module named '{user_language}'")
            allure.attach(f"{user_language}",
                          f"Не обнаружен словарь с языком '{user_language}'")
            assert False

        for tag in labels_dict:
            for label in labels_dict[tag]:
                labels_words = label\
                    .replace("/", " ").replace("\\", " ").replace("\n", " ").replace(" - ", " ").replace(" & ", " ") \
                    .replace("\"", "").replace("(", "").replace(")", "").replace(",", "")\
                    .replace("0", "").replace("1", "").replace("2", "").replace("3", "").replace("4", "") \
                    .replace("5", "").replace("6", "").replace("7", "").replace("8", "").replace("9", "") \
                    .split(" ")
                for word in labels_words:
                    # Проверить наличие слова в словаре
                    if word.lower() not in language_dictionary.word_tuple:
                        status = True
                        self.log.debug(
                            f"Word '{word}' not found in language dictionary '{user_language}' "
                            f"in {label_type_insertion} '{tag}'")
                        allure.attach(
                            f"{word}",
                            f"Нет слова '{word}' в словаре '{user_language}' "
                            f"в {label_type_insertion} '{tag}'")

        if status:
            # Есть слова, не входящие в словарь
            assert False
        else:
            # Все слова удовлетворяют словарю
            if label_type != "menu":
                self.screen_shot(
                    f"Скриншот: Все слова страницы удовлетворяют словарю языка '{user_language}'"
                )

    def read_language(self) -> str:
        """ Считать язык из файла """
        self.log.debug(f"Work '{self.get_method_name()}'")

        with open("dictionaries" + os.path.sep +
                  "auto_recognized_language.txt",
                  "r",
                  encoding="utf-8") as file:
            user_language = file.read()
            return user_language

    def labels_collect(self, actual_tags: list = None) -> dict:
        """
        Собирает и возвращает лейблы
            :param actual_tags: Список актуальных тегов, присутствующих на странице
            :return labels_dict: Словарь с лейблами в разрезе тегов
        """
        self.log.debug(f"Work '{self.get_method_name()}'")

        labels_dict = {}

        # Если актуальный список тегов для страницы не задан, то использовать дефолтный список
        if not actual_tags:
            actual_tags = self.interest_tags

        # Собираем лейблы в тексте тегов ("title" и "div" - особые)
        for tag in actual_tags:
            key = f"{tag}"
            if tag == "title":
                # для "title"
                self.log.debug(f"Adding to labels dict label 'title'")
                title_value = self.drv.title
                labels_dict[key] = [title_value]
                if title_value == "":
                    self.log.debug("Title not present on the page!")
                    allure.attach("Oops!", "Отсутствует TITLE на странице!")

            else:
                if tag == "div":
                    # для "div"
                    # tag_xpath = f"//{tag}[string()]"
                    tag_xpath = f"//{tag}"
                    # labels_dict[key] = self.get_div_label_list(tag_xpath)
                    labels_dict[key] = self.get_label_list(tag_xpath)
                else:
                    # для всех остальных тегов
                    # tag_xpath = f"//{tag}[text()]"
                    tag_xpath = f"//{tag}"
                    labels_dict[key] = self.get_label_list(tag_xpath)

        # Собираем лейблы в атрибутах "input"
        if "input" in actual_tags:
            input_attributes_list = [
                "placeholder",
                "value",
            ]
            for attr in input_attributes_list:
                key = f"input_{attr}"
                labels_dict[key] = self.get_inputs_attr_list(attr)

        # Собираем лейблы в атрибутах "button"
        if "button" in actual_tags:
            button_attributes_list = [
                "title",
            ]
            for attr in button_attributes_list:
                key = f"button_{attr}"
                labels_dict[key] = self.get_button_attr_list(attr)

        self.log.debug(f"labels_dict: {labels_dict}")
        return labels_dict

    def get_div_label_list(self, tag_xpath: str) -> list:
        """
        Возвращает список лейблов (текст) в теге "div"
            :param tag_xpath: Xpath тега
            :return label_list: Список лейблов
        """
        self.log.debug(
            f"Work '{self.get_method_name()}' with tag_xpath '{tag_xpath}'")

        label_list = []
        tag_div_elements = ss(by.xpath(tag_xpath))

        self.log.debug(f"Tag_div_elements: {tag_div_elements}")

        for label in tag_div_elements:
            # label.text
            self.log.debug(f"Div label element: {label}")

        return label_list

    def get_label_list(self, tag_xpath: str) -> list:
        """
        Возвращает список лейблов в заданном теге.
            :param tag_xpath: Xpath тега
            :return label_list: Список лейблов в тегах
        """
        self.log.debug(
            f"Work '{self.get_method_name()}' with tag_xpath '{tag_xpath}'")

        label_list = []
        tag_elements = ss(by.xpath(tag_xpath))

        self.log.debug(f"Size tag_elements: {tag_elements.size()}")

        for label in tag_elements:
            try:
                if label.is_displayed():
                    label_text = label.text
                    if label_text != "":
                        label_list.append(label_text)
            except TimeoutException as ex:
                # self.log.debug(f"Exception: Label with xpath '{tag_xpath}' not found")
                self.log.debug(f"Exception: '{ex}'")

        self.log.debug(f"Size label_list: {len(label_list)}")
        return label_list

    def get_inputs_attr_list(self, attr: str) -> list:
        """
        Возвращает список значений заданных атрибутов в тегах "input"
            :return attr_value_list: Список значений атрибутов
        """
        self.log.debug(f"Work '{self.get_method_name()}'. Attribute: '{attr}'")

        attr_value_list = []
        input_xpath = f"//input[@{attr} and @name!='csrfmiddlewaretoken']"
        input_elements = ss(by.xpath(input_xpath))

        for element in input_elements:
            attr_value_list.append(element.get_attribute(f"{attr}"))

        return attr_value_list

    def get_button_attr_list(self, attr: str) -> list:
        """
        Возвращает список значений заданных атрибутов в тегах "button"
            :return attr_value_list: Список значений атрибутов
        """
        self.log.debug(f"Work '{self.get_method_name()}'. Attribute: '{attr}'")

        attr_value_list = []
        button_xpath = f"//button[@{attr}]"
        button_elements = ss(by.xpath(button_xpath))

        for element in button_elements:
            attr_value_list.append(element.get_attribute(f"{attr}"))

        return attr_value_list

    @allure.step("Проверка лейблов по словарю языка '{1}'")
    def check_labels(self, user_language: str, labels_dict: dict) -> None:
        """
        Проверяет лейблы на соответствие словарю, соответствующему языку пользователя
            :param user_language: Язык пользователя
            :param labels_dict: Словарь с лейблами в разрезе тегов
        """
        self.log.debug(f"Work '{self.get_method_name()}'")

        self.check_words(user_language, labels_dict,
                         "tag")  # Надписи в различных тегах

    def get_tags(self) -> list:
        """
        Определить наличие тегов на странице
            :return: Список присутствующих тегов
        """
        self.log.debug(f"Work '{self.get_method_name()}'")
        tags_list = []

        page_source = self.drv.page_source

        for tag in self.interest_tags:
            # self.log.debug(f"Tag in 'self.interest_tags': '{tag}'")
            if tag in page_source:
                # self.log.debug(f"Tag in 'page_source': '{tag}'")
                tags_list.append(tag)

        # "title" искать всегда - не факт (фреймы), на прогоне
        if "title" not in tags_list:
            tags_list.append("title")

        self.log.debug(f"List of actual tags on the page: {tags_list}")
        return tags_list
示例#23
0
def setup_module(m):
    set_driver(
        webdriver.Chrome(executable_path=ChromeDriverManager().install()))
示例#24
0
def test_ensure_driver_started__when__set_browser_directly():
    webdriver = get_test_driver()
    set_driver(webdriver)
    factory.ensure_driver_started(Browser.CHROME)
    assert driver().name == Browser.CHROME
    driver().quit()
def setup_module(m):
    browser.set_driver(webdriver.Chrome(ChromeDriverManager().install())
                       )  # todo: was firefox here... should it be here?
            "#repositories-container > div > div.paged-table-container > table > tbody a"
        )

        self.clone_button = s("#clone-repo-button")
        self.actual_href_element = s(
            "#clone-repo-dialog-content > div.clone-url.ssh-clone-url-default > div.aui-buttons > input"
        )


options = webdriver.ChromeOptions()
driver = webdriver.Chrome

options.add_argument("--headless")
options.add_argument("--window-size=1920,1080")

browser.set_driver(driver(options=options))
page = BitbucketPage()


def authenticate():
    logging.info("authentication has been initiated.")
    browser.open_url(base_url)

    page.login.should(be.visible).set(credentials['username'])
    page.password.should(be.visible).set(credentials['password'])
    page.submit.click()

    browser.should(have.url(urljoin(base_url, "dashboard")))
    logging.info("authentication has been successful.")

示例#27
0
def setup_module(m):
    browser.set_driver(get_test_driver())
示例#28
0
def setup_module(m):
    driver = webdriver.Chrome(ChromeDriverManager().install())
    browser.set_driver(driver)
    global GIVEN_PAGE
    GIVEN_PAGE = GivenPage(driver)
示例#29
0
def setup_function(m):
    config.timeout = 4
    set_driver(get_test_driver())
    config.app_host = 'file://' + os.path.abspath(
        os.path.dirname(__file__)) + '/../../resources/orderapp/'
 def setUpClass(cls):
     browser.set_driver(webdriver.Chrome(ChromeDriverManager().install()))
     config.browser_name = BrowserName.CHROME
     config.base_url = "https://mail.google.com/mail"
     config.timeout = 7