Перейти к содержимому

RoenEr

Регистрация: 27 дек 2020
Offline Активность: 25 авг 2021 14:15
-----

Мои темы

Не работает скролл через execute_script если браузер в оконном режиме

16 августа 2021 - 14:50

Добрый день. Необходимо прокрутить страницу с динамической погрузкой. Реализовано следующим образом:

    def scroll(self):
        self.driver.execute_script("return arguments[0].scrollIntoView();",
                                           self.driver.find_element_by_xpath("//div[@data-rbd-draggable-id='13']"))
                

Данный код нормально отрабатывает если окно браузера (Google chrome) открыто на весь экран, но если браузер в оконном режиме, то скролл не происходит и соответственно элемент не находится. Возможно кто-то сталкивался с таким и сможет подсказать решение или направление куда копать? Гуглил не один день, сам найти ответ не смог

 

Использую Python 3.8 + selenium. 


Создание тестовой базы через UI с помощью фикстуры

14 апреля 2021 - 21:12

Добрый день. Начинаю писать автотесты на python + selenium. Опыта у меня в этом нет. При помощи ютуба, разных примеров и каких то общих знание после ВУЗа смог поднять проект который работает) Он построен по паттерну Page Object. Впереди меня ждут кейсы которые начинаются с одного и того же начального условия (на какой то странице создана строка в таблице и на основе этой записи создается другая страница которая берет данные из этой таблички). На данный момент в каждом тесте я дохожу до этой таблицы, создаю запись, заполню нужные столбцы и после создаю ту страницу которую и предстоит тестировать, перехожу на нее и проверяю все что нужно. Т.к. таких страниц предстоит создавать много (они все разные, но суть одна) появилась мысль написать фикстуру со "scope='session'" которая заполнит мне эту таблицу полностью и потом все тесты которым нужна эта запись будут ее использовать (и после фикстура подчистит за собой эту запись). Написал функцию при помощи все тех же элементов страниц, вызываю ее в фикстуре но получаю ошибку "AttributeError: 'CreateTestData' object has no attribute 'driver'. Автоматизацией я занимаюсь не в рабочее время, а в свободное (спросить кого то некого) и сижу с этим вопросом уже больше недели, никак сам не соображу что то. Буду признателен если кто то поможет разобраться) Я предполагаю что как то не так передаю драйвер во вторую фикстуру (первая поднимает драйвер, вторая а что должна создавать запись в таблице), но как надо хоть убей не пойму, а таких фикстур мне предстоит сделать ещё несколько и они бы сильно сэкономили время прохождения тестов и время их написания. Ну и конечно же самому очень хочется разобраться что же я делаю не так.

 

conftest.py

import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

from MyTests.testData import CreateTestData

@pytest.fixture(params=["chrome"], scope='class')
def init_driver(request):
    if request.param == "chrome":
        web_driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
    request.cls.driver = web_driver
    yield
    web_driver.close()

@pytest.fixture(scope='session', autouse=False)
def createShipment():
    create = CreateTestData()
    create.creatingConstruction()
    yield
    # sign_up_page.deleteConstruction()

testData.py (тут и выскакивает ошибка в self.elDoLoginPage = DoLoginPage(self.driver) # doLoginPage/страница логина)

from MyTests.test_base import BaseTest
from Pages.doLoginPage import DoLoginPage
from Pages.registerOfConstructionsPage import RegisterOfConstructionsPage


class CreateTestData(BaseTest):

    def creatingConstruction(self):
        # элементы страниц
        self.elDoLoginPage = DoLoginPage(self.driver)  # doLoginPage/страница логина
        self.elRegisterOfConstructionsPage = RegisterOfConstructionsPage(self.driver)  # registerOfConstructions/реестр строек
        # ____________________________________________________________________________________________#
        title = self.elDoLoginPage.get_title("Адепт: Исполнительная документация")
        assert "Адепт: Исполнительная документация" in title
        self.elDoLoginPage.do_login("autotest\\kogan", "abc123")
        self.elRegisterOfConstructionsPage.do_new_construction("Стройка 1") # создаем стройку 

test_basy.py

import pytest

@pytest.mark.usefixtures("init_driver")
class BaseTest:
    pass

BaseApp.py

from Config.config import TestData
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:

    def __init__(self, driver):
        self.driver = driver

    def do_click(self, locator, time=10):
        WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
                                                      message=f"Не нашел куда нажать. Адрес: {locator}").click()

    def do_send_keys(self, locator, text, time=10):
        WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
                                                      message=f"Не нашел куда написать. Адрес: {locator}").send_keys(text)

doLoginPage.py

from selenium.webdriver.common.by import By
from Config.config import TestData
from BaseApp import BasePage

# Локатор страницы логина
class LocDoLoginPage:
    # Локатор страницы логина
    loginField = (By.ID, 'username')
    passwordField = (By.ID, 'password')
    enterButton = (By.ID, "signin")  # кнопка войти
# объекты страницы логина
class DoLoginPage(BasePage):
    # иницилизируем вебдрайвер
    def __init__(self, driver):
        super().__init__(driver)
        self.driver.get(TestData.STABLE_URL)

    def do_login(self, username, password):     # авторизация
        self.do_send_keys(LocDoLoginPage.loginField, username)
        self.do_send_keys(LocDoLoginPage.passwordField, password)
        return self.do_click(LocDoLoginPage.enterButton)

registerOfConstructionsPage.py

from selenium.webdriver.common.by import By

from BaseApp import BasePage

# локаторы реестра строек
class LocRegisterOfConstructions:
    createNewButton = (By.XPATH, "//div[@class='dropdown ng-scope']/span[@class='dropspan btn-add button-border']") # кнопка "+"
    createConstructionButton = (By.XPATH, "//input[@type='button'][@value='Создать cтройку']") # кнопка "Создать стройку"

    #_____Окно создания новой стройки_____
    shortNameConstructionField = (By.XPATH, "//*[@ng-model='object.short_name']") # поле "Краткое наиименвоание стройки"
    saveButton = (By.XPATH, "//input[@type='button'][@value='Сохранить']") # кнопка "Сохранить"

    yesButton = (By.XPATH, "//input[@type='button'][@value='Да']")  # кнопка "Да"
# объекты реестра строек
class RegisterOfConstructionsPage(BasePage):
    def do_new_construction(self, nameOfConstruction):
        self.do_click(LocRegisterOfConstructions.createNewButton)
        self.do_click(LocRegisterOfConstructions.createConstructionButton)
        self.do_send_keys(LocRegisterOfConstructions.shortNameConstructionField, nameOfConstruction)
        self.do_click(LocRegisterOfConstructions.saveButton)

test_Act.py

..... тут еще много импортов


from MyTests.test_base import BaseTest

@pytest.mark.usefixtures("createShipment")
class Test_ActOfEntranceControlQualities(BaseTest):
    @allure.title('Акт входного контроля')
    @allure.testcase("https://1drv.ms/x/s!ApoVqwmTh8d9iSBoBQygRLKQIrGb?e=c8uSZ1", 'Тест создания и заполнения акта "Акт входного контроля качества" по поставке')
    @allure.severity(Severity.BLOCKER)
    def test_creatingAndCompletingActOfEntranceControlByShipment(self):

        self.elMainHeaderPage = MainHeaderPage(self.driver)  # MainHeaderPage/главный хедер
        self.elConstructionHeaderPage = ConstructionHeaderPage(self.driver)  # ConstructionHeaderPage/хедер стройки

        # элементы страниц
        self.elDoLoginPage = DoLoginPage(self.driver) # doLoginPage/страница логина
        self.elRegisterOfConstructionsPage = RegisterOfConstructionsPage(self.driver) # registerOfConstructions/реестр строек

.....дальше много строк теста

Загрузка файла

27 декабря 2020 - 14:42

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

Есть файл c локаторами "locators.py":

class LocStatmentsPage(BasePage):
    uploadStatmentButton = (By.XPATH, "//div[@class='flex-column flex-no-shrink']//input[@type='file']")

Так же есть файл "BaseApp.py" (тут у меня действия с локаторами и ожидания)

class BasePage:

    def do_click(self, locator, time=10):
        WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
        message=f"Не нашел куда нажать. Адрес: {locator}").click()

    def do_send_keys(self, locator, text, time=10):
        WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
        message=f"Не нашел куда написать. Адрес: {locator}").send_keys(text)

файл statmentsPage.py с действиями на этой странице:

class StatmentsPage(BasePage):

    def upload_statment(self, file):
    return self.do_send_keys(LocStatmentsPage.uploadStatmentButton, file)

И собственно сам тест кейс пишу:

1)Все срабатывает нормально если я пишут так:

def test_load
    ...
    self.driver.find_element(By.XPATH, "//div[@class='flex-column flex-no-shrink']//input[@type='file']").send_keys("D:\\file.xlsx")

2)А вот еси я пишу так все вылетает с ошибкой не найденного локатора по истечению заданных 10 секунд ожидания:

def test_load
    ...
    self.elStatmentsPage = StatmentsPage(self.driver)
    self.elStatmentsPage.upload_statment("D:\\file.xlsx")

Вопрос в том почему у меня не срабатывает когда все раскидано по файлам. Не то что бы меня это сильно напрягает, но хочется разобраться. Буду рад любым подсказкам куда копать.