私は、nosetests を使用して Selenium Webdriver テストを実行しています。ノーズテストが失敗するたびにスクリーンショットをキャプチャしたい。webdriver、python、またはnosetests機能を使用して、最も効果的な方法でそれを行うにはどうすればよいですか?
4 に答える
私の解決策
import sys, unittest
from datetime import datetime
class TestCase(unittest.TestCase):
def setUp(self):
some_code
def test_case(self):
blah-blah-blah
def tearDown(self):
if sys.exc_info()[0]: # Returns the info of exception being handled
fail_url = self.driver.current_url
print fail_url
now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S-%f')
self.driver.get_screenshot_as_file('/path/to/file/%s.png' % now) # my tests work in parallel, so I need uniqe file names
fail_screenshot_url = 'http://debugtool/screenshots/%s.png' % now
print fail_screenshot_url
self.driver.quit()
まず、webdriverには次のコマンドがあります。
driver.get_screenshot_as_file(screenshot_file_path)
私は鼻の専門家ではありませんが(実際、これは私がそれを調べたのは初めてです)、py.test
フレームワークを使用します(これは似ていますが、nose
IMHOより優れています)。
ほとんどの場合、「テストが失敗したときに呼び出される」フックを実装する必要があるnose用の「プラグイン」を作成する必要があります。addFailure(test, err)
これで、テストオブジェクトaddFailure(test, err)
からテスト名を取得し、ファイルのパスを生成できます。
その後、呼び出しますdriver.get_screenshot_as_file(screenshot_file_path)
。
で、フックpy.test
を実装してプラグインを作成します。def pytest_runtest_makereport(item, call):
内部ではcall.excinfo
、必要に応じてスクリーンショットを分析して作成します。
Pythonでは、以下のコードを使用できます。
driver.save_screenshot('/file/screenshot.png')
テストを別の方法で設定している可能性がありますが、私の経験では、このタイプの機能を手動で組み込み、障害が発生した時点でそれを繰り返す必要があります。Selenium テストを実行している場合、私のように多くの find_element_by_ somethingを使用している可能性があります。この種のことに取り組むことができるように、次の関数を作成しました。
def findelement(self, selector, name, keys='', click=False):
if keys:
try:
self.driver.find_element_by_css_selector(selector).send_keys(keys)
except NoSuchElementException:
self.fail("Tried to send %s into element %s but did not find the element." % (keys, name))
elif click:
try:
self.driver.find_element_by_css_selector(selector).click()
except NoSuchElementException:
self.fail("Tried to click element %s but did not find it." % name)
else:
try:
self.driver.find_element_by_css_selector(selector)
except NoSuchElementException:
self.fail("Expected to find element %s but did not find it." % name)
あなたの場合、スクリーンショット コード (self.driver.get_screenshot_as_file(screenshot_file_path)) は、self.fail の前に移動します。
このコードでは、要素を操作するたびに、self.findelement('selector', 'element name') を呼び出します。