Selenium: позволяют ли setUpClass (), tearDownClass (), @classmethod decorator каждому тесту использовать один экземпляр браузера? - PullRequest
0 голосов
/ 11 марта 2019

Я новичок в Selenium. А вот два моих тестовых файла, первый из которых включает в себя 2 тестовых примера, и, если он запускается, он открывает только 1 сеанс Chrome для обоих тестов. Второй включает в себя 3 теста, но он открывает 1 сессию Chrome для каждого теста.

Из книги, поскольку я использую декоратор @classmethod для setUpClass (), tearDownClass, чтобы установить их как уровень класса, тогда для всех тестов в файле должен быть только 1 сеанс браузера. Пожалуйста, поправьте меня, если я не так понимаю ...

-> первый файл (searchtests_with_class_methods.py)

import unittest
from selenium import webdriver

class SearchTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # create a new Chrome session
        cls.driver = webdriver.Chrome()
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()

        # navigation to the application home page
        cls.driver.get("http://demo-store.seleniumacademy.com/")
        # ?don't know why need this title here
        cls.driver.title

    def test_search_by_category(self):
        # get the search textbox
        self.search_field = self.driver.find_element_by_name("q")
        self.search_field.clear()

        # enter search keyword and submit
        self.search_field.send_keys("phones")
        self.search_field.submit()

        # get all the anchor elements which have product name displayed
        # currently on result page using find_element_by_xpath method
        products = self.driver.find_elements_by_xpath("//h2[@class='product-name']/a")
        self.assertEqual(3, len(products))

    def test_search_by_name(self):
        # get the search textbox
        self.search_field = self.driver.find_element_by_name("q")
        self.search_field.clear()

        # enter search keyword and submit
        self.search_field.send_keys("salt shaker")
        self.search_field.submit()

        # get all the anchor elements which have product name displayed
        # currently on result page using find_element_by_xpath method
        products = self.driver.find_elements_by_xpath("//h2[@class='product-name']/a")
        self.assertEqual(1, len(products))

    @classmethod
    def tearDownClass(cls):
        # close the browser window
        cls.driver.quit()
if __name__ == '__main__':
    unittest.main(verbosity=2)

-> второй файл (homepagetests.py)

import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from builtins import classmethod

class HomePageTest(unittest.TestCase):
    @classmethod
    def setUp(cls):
        # create a new Chrome session
        cls.driver = webdriver.Chrome()
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()

        # navigate to the application home page
        cls.driver.get("http://demo-store.seleniumacademy.com/")

    def test_search_field(self):
        # check search field exists on Home page
        self.assertTrue(self.is_element_present(By.NAME, "q"))

    def test_language_option(self):
        # check language options dropdown on Home page
        self.assertTrue(self.is_element_present(By.ID, "select-language"))

    def test_shopping_cart_empty_message(self):
        # check content of My Shopping Cart block on Home page
        shopping_cart_icon = self.driver.\
            find_element_by_css_selector("div.header-minicart span.icon")
        shopping_cart_icon.click()

        shopping_cart_status = self.driver.\
            find_element_by_css_selector("p.empty").text

        self.assertEqual("You have no items in your shopping cart.",
                        shopping_cart_status)

        close_button = self.driver.\
            find_element_by_css_selector("div.minicart-wrapper a.close")
        close_button.click()

    @classmethod
    def tearDown(cls):
        # close the browser window
        cls.driver.quit()

    def is_element_present(self, how, what):
        """
        Utility method to check presence of an element on page
        :params how: By locator type
        :params what: locator value
        """

        try:
            self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e:
            return False
        return True

if __name__ == '__main__':
        unittest.main(verbosity = 2)

Я использую Python3.7.1, Selenium '3.141.0' и Chrome 72.0.3626.121 в Mac OS 10.13.6. Запутался в этом поведении ... не могли бы вы помочь?

1 Ответ

0 голосов
/ 14 марта 2019

Сегодня я только что обнаружил, в чем проблема, на самом деле во втором файле есть опечатка, где 'def tearDown (cls):' должно быть 'def tearDownClass (cls):', поскольку я использую декоратор @classmethod. Какой я глупый человек ... Наконец, все тесты пройдены только за один сеанс браузера. Я не удалял этот вопрос, если в будущем некоторые ребята столкнутся со мной той же проблемой.

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