Odpowiedz

0

W Pythonie można skorzystać z poniższego kodu:

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

Przede wszystkim webdriver ma polecenie:

driver.get_screenshot_as_file(screenshot_file_path) 

nie jestem ekspertem w nosie (w rzeczywistości jest to po raz pierwszy Zajrzałem do tego), jednak używam ramy py.test (która jest podobna, ale lepsza niż IMUO nose).

Najprawdopodobniej będziesz musiał stworzyć "plugin" dla nosa, w którym będziesz musiał zaimplementować haczyk addFailure(test, err), który jest "wywoływany, gdy test się nie powiedzie".

W tym addFailure(test, err) można uzyskać nazwę testu od Test object i wygenerować ścieżkę do pliku.

Po tym połączeniu driver.get_screenshot_as_file(screenshot_file_path).

W py.test Tworzę wtyczkę z implementacją haka def pytest_runtest_makereport(item, call):. Wewnątrz analizuję call.excinfo i jeśli to konieczne, tworzę zrzut ekranu.

+0

Próbowałem tego, ale nie mogę dostać instancji TestCase w addFailure(). Czy możesz podzielić się tym, jak to jest możliwe (po prostu znając nazwę testu, która wskazuje mi tylko odpowiednią klasę, a nie instancję)? – vvondra

8

Moje rozwiązanie

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

Pytanie dotyczy struktury 'nose', a nie domyślnej' unittest'. –

+0

"przy użyciu funkcji webdriver, python lub nosetests" –

+0

Nie sądzę, że "python" oznacza "używanie innego frameworka (takiego jak unittest)", jednak mogę się mylić. –

0

Być może skonfigurować testy inaczej, ale z mojego doświadczenia trzeba ręcznie zbudować tego typu funkcjonalności i powtórzyć go w miejscu awarii. Jeśli wykonujesz testy selenowe, prawdopodobnie tak jak ja, używasz dużo find_element_by_ coś, co. Pisałem następującą funkcję, aby umożliwić mi do rozwiązania tego typu rzeczy:

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) 

W twoim przypadku, kod ekranu (self.driver.get_screenshot_as_file (screenshot_file_path)) pójdzie przed self.fail.

Z tym kodem, za każdym razem, gdy chcesz interakcji z elementem, nazwałbyś self.findelement („”, „selektor element name”)