gpt4 book ai didi

python - selenium 在使用 FireFox 启动时仅在测试类下正确运行第一个测试

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:25 25 4
gpt4 key购买 nike

我尝试使用 setUpClass()tearDownClass() 方法在方法之间共享单个 Chrome/Firefox 实例,使用@classmethod装饰器。它在 Chrome 中运行良好,但在 Firefox 中失败。环境如下:

  • Win10 x64,
  • Python 3.7.2,
  • Pycharm 18.3,
  • Selenium 3.141.59,
  • FireFox 64.0,
  • geckodriver v0.23.0,
  • Chrome V71.0.3578.98 64 位,
  • ChromeDriver 2.45

2 种测试方法的预期结果是 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下运行的selenium无法启动第二个测试方法,因此它使用之前的len(products)值与期望“1”进行比较。

最佳答案

问题是 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()

否则您需要编写代码以确保重新加载页面。

关于python - selenium 在使用 FireFox 启动时仅在测试类下正确运行第一个测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com