Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Вопрос по запуску тест suite-ов, действие в конце каждого

pytest
pycharm
python
ios
testing
selenium
Теги: #<Tag:0x00007f7b6d5700b8> #<Tag:0x00007f7b6d56ff00> #<Tag:0x00007f7b6d56fc80> #<Tag:0x00007f7b6d56fb40> #<Tag:0x00007f7b6d56f988> #<Tag:0x00007f7b6d56f848>

(Olexander Davis) #1

Подскажите пожалуйста по нескольким вопросам:

После каждого теста я выставляю Log out, что бы ато тест выходил на страницу логина и снова выполнял все по порядку как в тест кейсе, если так не делаю, следующий тест валится, можно сделать по другому?
Если выставляю > driver.close()
окно браузера просто закрываеться и следующий тест не стартует тоже.
Как можно сделать гибко прохождение сюта.

Вот еще, сначала была проблема настроить pytest, как то все таки настроил, ну вот смотрю для каждого теста в блоке (1) создается новая конфигурация. А в блоке 2 просто скажите, настройки нормально выглядят, или из за того и проблема.
Спасибо большое.


(Maxim Zaitsev) #2

from selenium import webdriver

app_url = 'some_url'

class TestSmokeSuite:

    def setup_method(self, method):
        self.driver = webdriver.Firefox()
        self.driver.maximize_window()
        self.driver.get(app_url)

    def teardown_method(self, method):
        self.driver.quit()


    def test_my_test_1(self):
        # test logic

    def test_my_test_2(self):
        # test logic


(Olexander Davis) #3

он просто открьівает новьіе окна, которьіх при прохождение всего свита будет более 40))


(Maxim Zaitsev) #4

Если все нормально дописать, то будет такая схема:

  1. Сначала запуститься код в setup_method (откроет браузер, перейдет на страницу)

  2. Далее пойдет выполнение кода в test_my_test_1 (шаги теста, которые тебе надо указать)

  3. Потом выполнится teardown_method (закроет браузер)

  4. Опять setup_method

  5. Код в test_my_test_2

  6. teardown_method

И так для всех тестовых методов, указанных в классе.


(Olexander Davis) #5

как то так выходит


(Maxim Zaitsev) #6

Все тестовые методы должны быть внутри класса (см на отступы).
Обращение к драйверу внутри методов должны идти через указатель self:

self.driver
self.driver.find_element_by_name(‘some name’)

и т.д.

P.S. Если PyCharm что-то подчеркивает красным, значит будет ошибка при запуске скрипта. Нужно решить эти вопросы в коде. Насколько я вижу, нужно сделать, как минимум:

import time

(Oleksandr Khotemskyi) #7

Тесты должны быть внутри класса. Почитайте про обьекты и классы в питоне.

А вообще советую не убивать и запускать браузер, а просто чистить его - удалять куки, session storage, local storage, и переоткрывать страницу перед каждым тестом. Открывать новый браузер - довольно долго.

Селекторы ужасные - при малейшем изменении дом дерева - упадут. Срочно учить css селеторы - https://www.w3schools.com/cssref/css_selectors.asp


(Dmytro Serdiuk) #8

I would like to suggest pytest fixtures to manage WebDriver. Take a look through the documentation on https://docs.pytest.org/en/latest/fixture.html.
The implementation can be:

@pytest.fixture # you can set a scope here (default is to execute this fixture one time per test)
def driver():
    driver = webdriver.Firefox()
    driver.maximize_window()
    yield driver # provide the fixture value
    print("teardown driver")
    driver.quit()

# test function example
def test_my_test_1(driver):
    driver.get(app_url)
    # other actions

# test class example
class TestSmokeSuite:

    def test_my_test_1(self, driver):
        driver.get(app_url)
        # test logic


(Olexander Davis) #9

Спасибо большое, сделал по нормальному, все запустилось и выполняется, даже если один тест упал, следующий запускаеться. Только я прибрал слово method, оно было выделено серым все равно и без него запуск такой же. Эт нормально?

from selenium import webdriver
driver = webdriver.Chrome()
import time

app_url = ‘http://cms.schooldata-test.com/login
class TestSmokeSuite:
def setup_method(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get(“http://cms.schooldata-test.com/login”)
self.driver.find_element_by_name(“email”).send_keys(“admin@admin.admin”)
self.driver.find_element_by_name(“password”).send_keys(“admin@admin.admin”)
self.driver.find_element_by_class_name(“btn”).click()
def teardown_method(self):
self.driver.quit()

def test_login_and_signout(self):
self.driver.get(“http://cms.schooldata-test.com/login”)
#login action
self.driver.get_screenshot_as_file(“login_and_signout1.png”)
self.driver.get_screenshot_as_file(“login_and_signout2.png”)

#Notification
def test_reply_notification(self):
self.driver.get(“http://cms.schooldata-test.com/login”)
#Notification1
self.driver.find_element_by_xpath(“html/body/div[1]/aside[1]/section/ul/li[3]/a”).click()
self.driver.find_element_by_xpath(“html/body/div[1]/aside[1]/section/ul/li[3]/ul/li[1]/a”).click()
time.sleep(4)
self.driver.find_element_by_xpath(“html/body/div[1]/div[1]/section[2]/section/div/div[2]/div/div[2]/div[2]/table/tbody/tr[1]/td[4]/a/b”).click()
self.driver.find_element_by_xpath(“html/body/div[1]/div[1]/section[2]/section[2]/div/div[3]/div/a/button”).click()
self.driver.find_element_by_class_name(“note-editable”).send_keys(“Trial message to check email sending function is working correctly”)
self.driver.find_element_by_id(“save”).click()
#Message needs to be
self.driver.get_screenshot_as_file(“reply_notification.png”)

Проблема, запускаеться только весь свит.
Хотя проблема возможно не в этом,
Есть два файла
testsmokeAP.py - где мои основные тесты
и test.py - где я сначала эксперементирую эти добавлние и рекомендации на тех же тестах (где добавил class и т.д)

Так вот, для файла testsmokeAP.py (Если запускать весь сьют) запускается pytest = pytest for testsmoke, если отдельно то pytest +название теста, который запускаю

А для файла test.py (если запускаю все, все ок, запускается pytest = p.test for 11test.py) если запустить один тест то запускается конфигурация test из раздела python в мень конфигураций (заместь концигурации p.test for 11test.py из раздела python tests) Screenshot 3


Этот файл лежит в папке с пакетом
Тоесть когда клацаю правой кнопкой мыши, у меня заместь Run p.test for 11test.py почему то Run test
Хотя в файле testsmokeAP.py все ок


(Olexander Davis) #10

Да, спасибо, теперь буду добавлять в классы, так и удобнее и предусловие можна выставлять, тперь действия логина я просто вынес в начало и нету нужды копипастить в каждый тест.

app_url = ‘http://cms.schooldata-test.com/login
class TestSmokeSuite:
def setup_method(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get(“http://cms.schooldata-test.com/login”)
self.driver.find_element_by_name(“email”).send_keys(“admin@admin.admin”)
self.driver.find_element_by_name(“password”).send_keys(“admin@admin.admin”)
self.driver.find_element_by_class_name(“btn”).click()
def teardown_method(self):
self.driver.quit()

А вообще советую не убивать и запускать браузер, а просто чистить его - удалять куки, session storage, local storage, и переоткрывать страницу перед каждым тестом. Открывать новый браузер - довольно долго.

Я думаю что это этот метод лучше конечно, но пока я не могу написать такой код на пайтоне, что бы он делал такие функции, а так конечно я б уже сейчас хотел бы что бы и отсылку email проверял и действительно ли юзер удален за базы данных и т.д но пока не знаю как(пока), тут даже я с вами согласен пока еще селекторы ужасны. Например мне пока не очень понятно как надежно сделать, что бы я был уверен что я создал новую template в и она появилась в этом списке(скриншот) Я смотрю сколько у меня уже есть, и какая по xpath будет следующая(например td[11]) я беру код из предыдущего только меняю цифру.
Потом этой командой проверяю появился ли темплейт в списке

mistake_text = driver.find_element_by_xpath(“тут имя предположытольного элемента который появиться после создания нового темплейта”).text
assert mistake_text == “template name”
пробывал через tag, оно начинает смотреть с верху выделеного модуля и принимает первый что нашел (а поскольку новый создается в низу, то зразу ошибка).


(Olexander Davis) #11

thanks, it will be considered without fail.
I know i need it as necessity


(Maxim Zaitsev) #12

Серым цветом в Pycharm отмечаются не используемые элементы кода. Лучше оставь, мало ли где потом аукнется. Помню, у меня были проблемы при наследовании и переопределении этих методов от базового тестового класса. . Pytest - он такой коварный xD


(Olexander Davis) #13

ок, тогда верну раз лишним не будет)

А на счет запуска отдельного теста во втором файле не подскажите в чем проблема? Или эт чисто индивидуально нужно смотреть?


(Maxim Zaitsev) #14

Попробуй создать новый файл с именем test_my_test.py, перенести туда текущее содержимое файла test.py, последний, соответственно, удалить.


(Olexander Davis) #15

Я как раз так сделал, как ты написал 2 мин назад, теперь показывает.
Спасибо еще раз!) ох уж эти настройки пайтеста, больше времени на конфиг забрало чем на написание, ха