You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

162 lines
5.1 KiB

namespace SeleniumBrowser
{
using Newtonsoft.Json;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using SeleniumBrowser.Command;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
public class Commander
{
[DllImport("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);
public const string FFMPEG_FILE = "ffmpeg.exe";
public const string RECORD_FILE = "Record.mp4";
private IWebDriver InitBrowser(BrowserInfo i_bi)
{
IWebDriver iwd = null;
if (i_bi.Name.ToLower() == "chrome")
{
ChromeOptions options = new ChromeOptions();
i_bi.Parameters.ForEach(sPara => options.AddArgument(sPara));
iwd = new ChromeDriver(Environment.CurrentDirectory, options);
}
return iwd;
}
public string RunAction(BrowserInfo i_bi, List<CommandInfo> i_laiCmds,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = null,
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = null)
{
string sMsg = null;
CommanderGlobalData cgd = new CommanderGlobalData();
if (!Directory.Exists(cgd.StotrFolder))
{
Directory.CreateDirectory(cgd.StotrFolder);
}
// Start Recording
ProcessStartInfo startInfo = new ProcessStartInfo(FFMPEG_FILE)
{
WindowStyle = ProcessWindowStyle.Minimized
};
string sRecordPath = Path.Combine(cgd.StotrFolder, RECORD_FILE);
// https://stackoverflow.com/questions/6766333/capture-windows-screen-with-ffmpeg
// ffmpeg -y -rtbufsize 100M -f gdigrab -t 00:00:30 -framerate 30 -probesize 10M -draw_mouse 1 -i desktop -c:v libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p c:/video_comapre2.mp4
startInfo.Arguments = makeRecordCommand(i_laiCmds.Sum(f => 2 + f.SleepAfterEvent), sRecordPath);
Process.Start(startInfo);
IWebDriver iwdBrowser = null;
try
{
do
{
iwdBrowser = InitBrowser(i_bi);
if (iwdBrowser == null)
{
sMsg = "NO_BROWSER";
break;
}
ConcurrentDictionary<string, object> cdGlobalData = new ConcurrentDictionary<string, object>();
foreach (CommandInfo ai in i_laiCmds)
{
ai.BatchProcessData = cgd;
#if DEBUG
System.Diagnostics.Debug.WriteLine($"Command={ai.Command} Target={ai.Target} title={iwdBrowser.CurrentWindowHandle}");
#endif
sMsg = ai.Process(iwdBrowser, ref cdGlobalData);
if (sMsg != null)
{
break;
}
cgd.CommandCount++;
}
}
while (false);
}
catch (Exception ex)
{
sMsg = $"{nameof(RunAction)} unhandle exception !. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
sMsg += ex.Message;
#endif
}
#if DEBUG
if (sMsg != null)
{
System.Diagnostics.Debug.WriteLine(sMsg);
}
#endif
if (iwdBrowser != null)
{
try
{
iwdBrowser.Close();
iwdBrowser.Quit();
}
catch
{
// Ignore
}
}
return sMsg;
}
public string RunAction(BrowserInfo i_bi, string i_sJsonCommands,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = null,
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = null)
{
return RunAction(i_bi, JsonConvert.DeserializeObject<List<CommandInfo>>(i_sJsonCommands), i_nCodeLine, i_sMemberName, i_sSourcePath);
}
protected string makeRecordCommand(int nRecordTime, string sRecordPath)
{
int nRecordSecondMod = nRecordTime % 60;
int nRecordMinute = nRecordTime / 60;
int nRecordMinuteMod = nRecordMinute % 60;
int nHour = nRecordMinute / 60;
return $"-y -rtbufsize 100M -f gdigrab -t {nHour:00}:{nRecordMinuteMod:00}:{nRecordSecondMod:00} -framerate 30 -probesize 10M -draw_mouse 1 -i desktop -c:v libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p {sRecordPath}";
}
}
}