Как снять видео о том, что происходит в селене - PullRequest
0 голосов
/ 01 февраля 2019

Я использую веб-драйвер Selenium 3 и Python 3 в Windows 7.

Я хочу записать видео о том, что происходит в моих тестах на селен.

Для этого я использую FFmpeg и устройство захвата экрана , но я могу менять программы.

Вот мой код:

import unittest
from selenium import webdriver
from subprocess import Popen
#from subprocess import call


cmd = 'ffmpeg -y -rtbufsize 2000M -f dshow -i video="screen-capture-recorder" -r 10 -t 20 screen-capture.mp4'

class SearchProductTest(unittest.TestCase):
    def setUp(self):

        # start the recording of movie
        self.videoRecording = Popen(cmd)

        # create a new Firefox session
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()

        # navigate to the application home page
        self.driver.get("http://demo-store.seleniumacademy.com/")

    def test_search_by_category(self):
        # get the search textbox
        search_field = self.driver.find_element_by_name("q")
        search_field.clear()

        # enter search keyword and submit
        search_field.send_keys("phones")
        search_field.submit()

        # get all the anchor elements which have product names displayed
        # currently on result page using find_elements_by_xpath method
        products = self.driver.find_elements_by_xpath(
            "//h2[@class='product-name']/a")

        # check count of products shown in results
        self.assertEqual(3, len(products))
        #self.videoRecording.terminate()

    def test_something_else(self):
        pass

    def tearDown(self):
        # close the browser window
        self.driver.quit()

        # Stop the recording
        self.videoRecording.terminate()

    #def terminate(process):
        #if process.poll() is None:
        #    call('taskkill /F /T /PID ' + str(process.pid))

if __name__ == '__main__':
    unittest.main(verbosity=2)

Проблемы:

1) cmd дает максимальное время для фильма (20 "в примере). Если тест длится больше, фильм создается, и он работает (но не завершен, только 20").

2) если тест длится меньше, файл создается, но он не работает (читатель не может прочитать его, и это всего лишь несколько байтов).Это главная ошибка!Я не уверен, где начать фильм и где (и как) его остановить.

3) Если у меня есть более одного теста, я бы хотел, чтобы для всех них был только один фильм (поэтомуЯ хочу записать все тесты в одном и том же фильме).

4) если возможно, я бы предпочел записать окно веб-драйвера (того, где выполняются мои тесты), а не мой экран, так что тесты пока идутможет делать что-то еще (они медленные).

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Я этого не пробовал, но все равно должно работать.Ваш код завершает процесс ffmpeg.Программное обеспечение не может закончить видео файл.Следующий код должен корректно завершить процесс:

self.videoRecording.send_signal(subprocess.CTRL_C_EVENT)
self.videoRecording.wait()

Вам понадобятся дополнительные параметры для вашего оператора popen.Пожалуйста, обратитесь к https://docs.python.org/3.7/library/subprocess.html.

import subprocess
...
Popen(cmd, creationflags = subprocess.CREATE_NEW_PROCESS_GROUP)

Вы также можете восстановить поврежденные видеофайлы с помощью ffmpeg:

ffmpeg -err_detect ignore_err -i screen-capture.mp4 -c copy video_fixed-screen-capture.mp4
0 голосов
/ 01 февраля 2019

В WebDriver есть 3 метода, которые могут быть вам полезны: get_screenshot_as_png, get_screenshot_as_base64 и get_screenshot_as_file.При этом вы можете делать снимки экрана в фоновом потоке и использовать OpenCV и PIL для создания видеофайла из результатов.

Если вы не хотите вводить новые зависимости, вы также снимаете снимки экрана вфайлы и в конце используйте ffmpeg для создания видео.

...