Переменная не обновляется между тестами - PullRequest
0 голосов
/ 18 января 2019

Я использую селен, и у меня есть два теста в моем классе unittest (я следую учебному пособию). Я использую @classmethod для setUpClass. Каждый тест сам по себе работает, но оба вместе, как в моем коде ниже, не работают. Кажется, что переменные продукты во втором тесте остаются такими же, как и в первом тесте, поэтому длина равна 3 вместо 1. Это происходит, даже если я изменяю имя переменной. Итак, у меня есть AssertionError: 1 != 3. Вероятно, потребуется время для загрузки результатов второго поиска

Почему так? Что я могу сделать?

import unittest
from selenium import webdriver

class SearchTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # create a new Firefox session
        cls.driver = webdriver.Firefox()
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()

        # navigate to the application home page
        cls.driver.get("http://demo-store.seleniumacademy.com/")
        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 names
        # displayed currently on result page using
        # find_elements_by_xpath method
        products = self.driver.find_elements_by_xpath\
            ("//h2[@class='product-name']/a")
        print('products', products)
        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 names displayed
        # currently on result page using
        # find_elements_by_xpath method
        products = self.driver.find_elements_by_xpath\
            ("//h2[@class='product-name']/a")
        print('products',products)
        self.assertEqual(1, len(products))

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

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

1 Ответ

0 голосов
/ 18 января 2019

Я изменил свой код:

import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class SearchTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # create a new Firefox session
        cls.driver = webdriver.Firefox()
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()

        # navigate to the application home page
        cls.driver.get("http://demo-store.seleniumacademy.com/")
        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
        title = "phones"
        self.search_field.send_keys(title)
        self.search_field.submit()

        # get all the anchor elements which have product names
        # displayed currently on result page using
        # find_elements_by_xpath method
        try:
            element = WebDriverWait(self.driver, 10).until(
                EC.title_contains(title)
            )
        finally:
            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
        title = "salt shaker"
        self.search_field.send_keys(title)
        self.search_field.submit()

        # get all the anchor elements which have
        # product names displayed
        # currently on result page using
        # find_elements_by_xpath method
        try:
            element = WebDriverWait(self.driver, 10).until(
                EC.title_contains(title)
            )
        finally:
            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)

Теперь я жду в обоих методах, пока название страницы не изменится. Это работает, но что вы думаете? Это хороший способ решить проблему?

Редактировать: после комментария я снова изменил код:

import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class SearchTests(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # create a new Firefox session
        cls.driver = webdriver.Firefox()
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()

        # navigate to the application home page
        cls.driver.get("http://demo-store.seleniumacademy.com/")
        #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
        title = "phones"
        self.search_field.send_keys(title)
        self.search_field.submit()

        # get all the anchor elements which have product names
        # displayed currently on result page using
        # find_elements_by_xpath method
        element = WebDriverWait(self.driver, 10).until(
            EC.title_contains(title)
        )
        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
        title = "salt shaker"
        self.search_field.send_keys(title)
        self.search_field.submit()

        # get all the anchor elements which have
        # product names displayed
        # currently on result page using
        # find_elements_by_xpath method
        element = WebDriverWait(self.driver, 10).until(
            EC.title_contains(title)
        )
        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)
...