これは私を混乱させており、私の技術スタックはこの時点で非常に大きいため、何かをデバッグするのに本当に苦労しています.
Python 2.7、py.test、および pytest-selenium、pytest-flask フィクスチャを使用しています。また、セレンのカスタマイズや DB オブジェクトの簡単な作成などのために、独自のフィクスチャをいくつか使用しています。
Selenium を使用する機能テスト スイートがあります。BrowserStack を使用して (ローカル トンネリング経由で) スイートを実行していますが、さまざまなブラウザーですべてを実行したいと考えています。
現時点で合格できないテストが 4 つあります。サード パーティ サービスのサンドボックス資格情報を待っています。これらのテストの結果、サーバーは 500 Internal Server Error を返します。私は py.test でそれらを失敗すると予想されるものとしてマークしました(つまり@pytest.mark.xfail
)。
Chrome を使用してスイートを実行すると、すべてが期待どおりに機能します。Firefox を使用して実行すると、テストが失敗した後にハングします。BrowserStack は、テスト セッションが適切に閉じられたことを示しているため、危険なブラウザーで BrowserStack がハングしても問題はありません (少なくとも、そうではないと思います)。
問題のあるテストを削除すると、Firefox は正常に動作し続けます。テストを (xfail ではなく) スキップ済みとしてマークすると、すべてが正常に機能します。別のテストを xfail としてマークすると、すべてが正常に続行されます。
したがって、それはそのテストとそのブラウザーに関係していますが、BrowserStack レベルでは関係ありません。厄介なテストの唯一の主な違いは、オブジェクトをテスト DB にコミットすることです。しかし、テストは DB コマンドでハングしません。DB セットアップの後、500 エラー ページの後、DB アサーションの前にハングします。また、別のブラウザーを使用している場合に機能するため、DB コマンドにすることはできません。
面倒なテストケースの 1 つを次に示します。
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 のように) 後に暗黙的に待機しないためです。
これを修正する方法をどこから探し始めればよいかさえわかりません。