2016-01-18 3 views
1

Я создаю автоматизированные тестовые сценарии в Appium (для приложения для Android), и я пытаюсь найти способ начать запись экрана в определенный момент, выполняя некоторые действия и затем прекратить запись.Остановить запись на экране Android в автоматическом сценарии

Я не смог найти решение для записи на экране, реализованное в Appium, но нашел аккуратную команду оболочки adb, screenrecord, которая выполняет именно то, что она заявляет. Теперь моя проблема заключается в том, что только очевидные способы, чтобы остановить запись являются либо установить точный лимит времени мне нужно в аргументах, или нажать Ctrl-C в интерактивной оболочке:

2|[email protected]:/ $ screenrecord --help 
Usage: screenrecord [options] <filename> 

Android screenrecord v1.2. Records the device's display to a .mp4 file. 

Options: 
--size WIDTHxHEIGHT 
    Set the video size, e.g. "1280x720". Default is the device's main 
    display resolution (if supported), 1280x720 if not. For best results, 
    use a size supported by the AVC encoder. 
--bit-rate RATE 
    Set the video bit rate, in bits per second. Value may be specified as 
    bits or megabits, e.g. '4000000' is equivalent to '4M'. Default 4Mbps. 
--bugreport 
    Add additional information, such as a timestamp overlay, that is helpful 
    in videos captured to illustrate bugs. 
--time-limit TIME 
    Set the maximum recording time, in seconds. Default/maximum is 180. 
--verbose 
    Display interesting information on stdout. 
--help 
    Show this message. 

Recording continues until Ctrl-C is hit or the time limit is reached. 

Я мог бы использовать --time-limit, но тогда мне нужно оценить, как долго любая запись будет проходить внутри тестов, использование памяти будет далеко не оптимальным и т. д.

Использование Ctrl-C предлагает свои собственные ограничения, так как для этого требуется интерактивный сеанс оболочки и мои автоматизации должны включать только простые команды оболочки:

adb -s DEVICE_UDID shell screenrecord /sdcard/Recordings/video.mp4 

Кто-нибудь знает, как активно остановить запись?

В любом случае, кто-нибудь знает, как записать экран с помощью Appium?

+0

очень хороший вопрос .. По моим сведениям, Appium не поддерживает запись на экране. И вы не можете остановить запись экрана adb, кроме параметра timeout и ключевого события CTRL-C –

+2

'Ctrl-C' - это не что иное, как' SIGINT'. Просто отправьте его в процесс 'screenrecord' - нет« интерактивного сеанса оболочки »требуется –

+0

Спасибо, не подумал об этом. Если вы опубликуете его в качестве ответа, я соглашусь с ним. –

ответ

0

Если вы сохраните процесс в зависимости от того, что вы запустили screenrecord, вы можете убить сигналом SIGINT, который будет работать так, как вы хотите.

Например:

process = adb shell 
process.stdin = screenrecord test.mp4 & 

, а затем, когда вы хотите, чтобы убить его

process.stdin = pkill -2 screenrecord 

Должно работать, дайте ему попробовать

-1

После того, как вы начнете screenrecording, он начинает ADB процесс. Поэтому, если вы можете убить начатый процесс adb, то также прекращается запись на экране. Для этого вы можете сначала сохранить весь процесс adb перед началом записи на экране, а затем после того, как на экране будет записан любой процесс adb, просто убивайте его. Я реализовал экранную запись в классе ниже. Код является самоочевидным. пожалуйста, проверьте. вы также можете проверить - http://easytestautomation.blogspot.in/2016/06/easy-to-record-screen-in-appium-for.html

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 


public class ScreenRecorder { 


private static List<String> ADBProcessIDsBeforeScreenRecording = null; 
private static List<String> ADBProcessIDsAfterScreenRecording = null; 


public static void StartScreenRecording(String CurrentTestMethodName) 
    throws IOException { 


    // Storing all ADB process ids before starting Screen Recording. 
    ADBProcessIDsBeforeScreenRecording = getProcessIDs("adb.exe"); 


    // "Starting Screen Recording for Current TestMethod. 
    Runtime.getRuntime().exec(
    "cmd /c adb shell screenrecord --bit-rate 1000000 //sdcard//" 
     + CurrentTestMethodName + ".mp4"); 


} 


public static void StopScreenRecording(String CurrentTestMethodName, 
    String DirectoryToSaveRecordedScreen, 
    boolean RemoveRecordedScreenFromDevice) throws IOException, 
    InterruptedException { 


    // Storing all ADB process ids after Screen Recording. 
    ADBProcessIDsAfterScreenRecording = getProcessIDs("adb.exe"); 


    // killing ADB task using process id. 
    // First we are trying to get ADB process id that is started due to ADB 
    // screenrecord then killing the same. 
    for (String id : ADBProcessIDsAfterScreenRecording) { 
    boolean found = false; 
    for (String tgtid : ADBProcessIDsBeforeScreenRecording) { 
    if (tgtid.equals(id)) { 
    found = true; 
    break; 
    } 
    } 
    if (!found) { 
    Runtime.getRuntime().exec("taskkill /F /PID " + id); 
    break; 
    } 
    } 


    // Sleep time to save the recorded video in Device properly 
    Thread.sleep(2000); 


    // Pulling Screen Recording to PC/Machine 
    Runtime.getRuntime().exec(
    "cmd /c adb pull //sdcard//" + CurrentTestMethodName + ".mp4 " 
     + DirectoryToSaveRecordedScreen); 
    // Sleep time to pull video from device to destination directory 
    Thread.sleep(5000); 


    if (RemoveRecordedScreenFromDevice) { 
    // Deleting ScreenRecord from Device 
    Runtime.getRuntime().exec(
    "cmd /c adb shell rm //sdcard//" + CurrentTestMethodName 
     + ".mp4"); 
    } 


} 


//Method to get List of Process Ids using Process Name 
static List<String> getProcessIDs(String processName) { 
    List<String> processIDs = new ArrayList<String>(); 
    try { 
    String line; 
    Process p = Runtime.getRuntime().exec("tasklist /v /fo csv"); 
    BufferedReader input = new BufferedReader(new InputStreamReader(
    p.getInputStream())); 
    while ((line = input.readLine()) != null) { 
    if (!line.trim().equals("")) { 
    // Pid is after the 1st ", thus it's argument 3 after 
    // splitting 
    String currentProcessName = line.split("\"")[1]; 
    // Pid is after the 3rd ", thus it's argument 3 after 
    // splitting 
    String currentPID = line.split("\"")[3]; 
    if (currentProcessName.equalsIgnoreCase(processName)) { 
     processIDs.add(currentPID); 
    } 
    } 
    } 
    input.close(); 
    } catch (Exception err) { 
    err.printStackTrace(); 
    } 
    return processIDs; 
} 


} 
Смежные вопросы