这令我感到困惑,我的技术堆栈在这一点上是如此之大,以至于我真的很难调试任何东西。
我使用Python 2.7,py.test和pytest-selenium,pytest-flask灯具。我还使用了几个我自己的灯具,比如定制硒和轻松创建数据库对象。
我有一个使用Selenium的功能测试套件。我使用BrowserStack(通过本地隧道)运行我的套件,我想在许多不同的浏览器上运行所有内容。
我目前无法通过4项测试,我正在等待第三方服务的一些沙箱凭据。这些测试将导致服务器返回500内部服务器错误。我在py.test中将它们标记为预期失败(即@pytest.mark.xfail
)。
当我使用Chrome运行套件时,一切都按预期工作。当我使用Firefox运行它时,测试在失败后挂起。 BrowserStack显示测试会话已正确关闭,因此BrowserStack挂在狡猾的浏览器上并不是问题(至少我认为不是这样)。
如果我删除了有问题的测试,那么Firefox会继续正常运行。如果我将测试标记为跳过(而不是xfail),那么一切都按预期工作。如果我将不同的测试标记为xfail,那么一切都会继续进行。
所以它与该测试和浏览器有关,但不是在BrowserStack级别。尴尬测试唯一不同的主要问题是它们涉及将对象提交给测试数据库。但是测试不会挂在数据库命令上,它们会在数据库设置之后,在500错误页面之后,但在数据库断言之前挂起。它不能成为数据库命令,因为如果我使用不同的浏览器它们就可以工作!
这是一个恼人的测试用例:
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之类的浏览器不会在click()
后隐式等待(就像Chrome一样)。
我甚至不知道从哪里开始寻找解决方法。