@ryndenkov

Как оптимизировать данный код на python — selenium?

20 тестов проходят за 120 секунд, что очень долго, как можно запустить в несколько потоков, допустим, 10. Ну или же сделать одну функцию, с заменой параметра в send_key?

import unittest
#import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

URL = 'https://psy.edu.ru/'

class check_psyedu(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome(r'C:\Users\Алексей\YandexDisk\Job\Python\Test\chromedriver\chromedriver.exe')
        
    #def read_excel():
        #list_name = pd.read_excel('./list_name.xlsx')
        #list_name.head()

    def test_1(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("aleksei")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()
    
    def test_2(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("Алексей")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()
    
    def test_3(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys(" Рынденков Алексей")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
    
    def test_4(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("123123")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
        
    def test_5(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("@алексей")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
    
    def test_6(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("sofa")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()
    
    def test_7(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("admin")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
    
    def test_8(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys(" ")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()   
    
    def test_9(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()   
    
    def test_10(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("Софья")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()   
    
    def test_11(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("Иван")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()   
        
    def test_12(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys(".Алексей")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
        
    def test_13(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("-Кирилл")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
        
    def test_14(self):
        self.driver.get(URL)
        self.driver.set_window_size(1920, 1080)
        self.driver.find_element(By.NAME, "name").send_keys("уцкаушатуоатурашгукратиукалукшгарукта")
        self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
        assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
        self.driver.close()    
        
    def tearDown(self):
          self.driver.quit()

if __name__ == "__main__":
    unittest.main()
  • Вопрос задан
  • 234 просмотра
Решения вопроса 1
sswwssww
@sswwssww
setUp вызывается перед каждым тестовым методом, т.е. у тебя он вызывается 14 раз, как и tearDown. Замени его на setUpClass, который будет вызван всего 1 раз. И соответственно, tearDown меняешь на tearDownClass.
И конечно меняешь свои тесты (например убери лишние self.driver.set_window_size(1920, 1080) и т.п. в каждом методе, просто переместив это в setUpClass). Это все ОЧЕНЬ сильно сэкономит время.

Либо, чтобы убрать дублирование кода можно воспользоваться контекстным менеджером subTest:
import unittest

from selenium import webdriver
from selenium.webdriver.common.by import By

URL = 'https://psy.edu.ru/'


class check_psyedu(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome(r'C:\Users\Алексей\YandexDisk\Job\Python\Test\chromedriver\chromedriver.exe')
        self.driver.set_window_size(1920, 1080)

    def test_1(self):
        names = ("aleksei", "Алексей", " Рынденков Алексей",)
        for name in names:
            # тут name просто как название теста, чтобы когда тест не прошёл было наглядно видно где споткнулся
            with self.subTest(name):  
                self.driver.get(URL)
                self.driver.find_element(By.NAME, "name").send_keys(name)
                self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
                assert self.driver.find_element(By.CSS_SELECTOR,
                                                ".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
                assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
                assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"

    def tearDown(self):
        self.driver.close()
        self.driver.quit()


if __name__ == "__main__":
    unittest.main()

Есть еще третий вариант, использовать декоратор добавляющий возможность запускать одну и ту же тестовую функцию с разными аргументами. В pytest такая "фича" встроена, в unittest нужно использовать библиотеку parameterized.
Пример:
@parameterized([
    (2, 2, 4),
    (2, 3, 8),
    (1, 9, 1),
    (0, 9, 0),
])
def test_pow(base, exponent, expected):
   assert_equal(math.pow(base, exponent), expected)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы