5

Sono in esecuzione test del selenio con nsetest. Voglio catturare uno screenshot quando falliscono i nosetest. Come posso farlo nel modo più efficace, utilizzando le funzionalità di webdriver, python o nosetests?Come posso acquisire uno screenshot se i miei nosetests falliscono?

+1

simile, ma per unittest: [Come eseguire il codice solo su test fallimenti con python unittest2?] (http://stackoverflow.com/q/12290336/55075) a SO – kenorb

risposta

0

In Python è possibile utilizzare il codice qui sotto:

driver.save_screenshot('/file/screenshot.png') 
4

Prima di tutto, WebDriver ha il comando:

driver.get_screenshot_as_file(screenshot_file_path) 

Io non sono un esperto nel naso (in realtà questa è la prima volta L'ho esaminato), tuttavia utilizzo il framework py.test (che è simile, tuttavia superiore a nose IMHO).

Molto probabilmente dovrai creare il "plugin" per il naso dove dovrai implementare il gancio addFailure(test, err) che è "Chiamato quando un test fallisce".

In questo addFailure(test, err) è possibile ottenere il nome del test da Test object e generare il percorso per il file.

Dopo quella chiamata driver.get_screenshot_as_file(screenshot_file_path).

In py.test Creo il mio plug-in con l'implementazione del gancio def pytest_runtest_makereport(item, call):. All'interno analizzo call.excinfo e creo lo screenshot se necessario.

+0

Ho provato questo, ma non riesco a ottenere l'istanza del TestCase in addFailure(). Puoi condividere come è possibile (solo conoscendo il nome del test, che indica solo la classe appropriata, non un'istanza) – vvondra

8

La mia soluzione

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() 
+0

La domanda riguarda il framework 'nose', non il predefinito' unittest'. –

+0

"utilizzando le funzioni webdriver, python o nosetests" –

+0

Non penso che "python" implichi "l'uso di un altro framework (come l'unittest)", tuttavia potrei sbagliarmi. –

0

Forse avete impostato i test in modo diverso, ma nella mia esperienza è necessario costruire manualmente in questo tipo di funzionalità e ripeterla al punto di errore. Se stai eseguendo test sul selenio, è probabile che tu stia usando un sacco di find_element_by_ qualcosa. Ho scritto la seguente funzione per permettermi di affrontare questo tipo di cosa:

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) 

Nel tuo caso, il codice screenshot (self.driver.get_screenshot_as_file (screenshot_file_path)) sarebbe andato prima della self.fail.

Con questo codice, ogni volta che si desidera interagire con un elemento, si sarebbe chiamata self.findelement ('selector', 'nome dell'elemento')

Problemi correlati