Селен только правильно запустить первый тест в классе теста при запуске с FireFox - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь использовать один экземпляр Chrome / Firefox между методами, используя методы setUpClass() и tearDownClass() и декоратор @classmethod. Он прекрасно работает с Chrome, но ошибка в Firefox . Вот среда:

  • Win10 x64,
  • Python 3.7.2,
  • Пихарм 18,3,
  • Селен 3.141.59,
  • FireFox 64.0,
  • geckodriver v0.23.0,
  • Chrome V71.0.3578.98, 64-разрядная,
  • ChromeDriver 2.45

Ожидаемые результаты для двух методов тестирования: 3 и 1. Тестовые прогоны с Chrome соответствуют ожиданиям, но не работают для Firefox.

import unittest
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.FIREFOX
caps["marionette"] = True

class SearchTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # create a new Firefox session
        cls.driver = webdriver.Firefox(capabilities=caps, executable_path="my\geckodriver\path")
        cls.driver.implicitly_wait(30)
        cls.driver.maximize_window()
        # create a new Chrome session
        # cls.driver = webdriver.Chrome("my\chromedriver\path")
        # 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_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("phone")
        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']")
        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']")
        self.assertEqual(1, len(products))

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

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

Ожидание выглядит следующим образом (закончено с Chrome):

test_search_by_category (main.SearchTests) ... ok 
test_search_by_name (main.SearchTests) ... ok
----------------------------------------------------------------------
Ran 2 tests in 14.172s
OK

Но с Firefox всегда показывает:

test_search_by_category (main.SearchTests) ... ok
test_search_by_name (main.SearchTests) ... FAIL
FAIL: test_search_by_name (main.SearchTests)
Traceback (most recent call last): 
   File "G:\Thunder\PycharmProject\setests\searchtests.py", line 54, in test_search_by_name 
      self.assertEqual(1, len(products)) 
AssertionError: 1 != 3
----------------------------------------------------------------------
Ran 2 tests in 13.568s
FAILED (failures=1)

Я полагаю, потому что селен, запущенный под firefox, не смог запустить 2-й метод тестирования и, таким образом, он использует предыдущее значение len(products) для сравнения с ожиданием "1".

1 Ответ

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

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

https://github.com/SeleniumHQ/selenium/issues/4570

Одним из возможных решений является переход на главную страницу перед каждым запуском теста. Для этого вы можете добавить в свой метод метод setup и переместить код страницы получения, а также сбросить поле ввода в этот метод setup. Вот как это будет выглядеть:

def setUp(self):
    # navigate to the application home page
    self.driver.get("http://demo-store.seleniumacademy.com/")
    # get the search textbox
    self.search_field = self.driver.find_element_by_name("q")
    self.search_field.clear()

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

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