这让我很困惑,我的技术堆栈在这一点上是如此之大,以至于我真的很难调试任何东西。
我正在使用 Python 2.7、py.test 和 pytest-selenium、pytest-flask 固定装置。我还使用了一些我自己的固定装置来定制 selenium 和轻松创建 DB 对象。
我有一个使用 Selenium 的功能测试套件。我正在使用 BrowserStack(通过本地隧道)运行我的套件,并且我想在许多不同的浏览器上运行所有内容。
我目前有 4 个测试无法通过,我正在等待第三方服务的一些沙盒凭据。这些测试将导致服务器返回 500 Internal Server Error。我在 py.test 中将它们标记为预期会失败(即@pytest.mark.xfail
)。
当我使用 Chrome 运行该套件时,一切都按预期工作。当我使用 Firefox 运行它时,测试在失败后挂起。BrowserStack 显示测试会话已正确关闭,因此 BrowserStack 挂在狡猾的浏览器上不是问题(至少我认为不是)。
如果我删除有问题的测试,那么 Firefox 会继续正常运行。如果我将测试标记为已跳过(而不是 xfail),那么一切都会正常进行。如果我将另一个测试标记为 xfail,那么一切都会继续进行。
所以这与那个测试和那个浏览器有关,但不是在 BrowserStack 级别。笨拙的测试的唯一不同之处在于它们涉及将对象提交到测试数据库。但是测试不会在 DB 命令处挂起,它们在 DB 设置之后、500 错误页面之后、但在 DB 断言之前挂起。它不能是 DB 命令,因为如果我使用不同的浏览器,它们就可以工作!
这是令人讨厌的测试用例之一:
def test_upload_logo(db, selenium):
u = db.create_user(...) # Customise user to use third party service
selenium.signin(user=u)
selenium.get('/awards/create/')
... # Run some normal web site tests, click this, type that there, etc.
selenium.find('input[type="submit"]').click() # This results in the 500 error
selenium.wait(locate='body.awards.retrieve') # This will fail because the browser is showing the 500 error page
# The test never gets this far with Firefox because it hangs
a = Award.query.all()
assert 1 == len(a)
该selenium.wait
命令是一个自定义函数,它等待 CSS 选择器定位的元素出现。我使用它是因为像 IE 和 Edge 这样的浏览器不会在 a 之后隐式等待click()
(就像 Chrome 那样)。
我什至不确定从哪里开始寻找如何解决这个问题。