From 4f74d04e6a532f8e916c22361216b4aca174441c Mon Sep 17 00:00:00 2001 From: svatal <swata@centrum.cz> Date: Fri, 11 Aug 2017 15:38:15 +0200 Subject: [PATCH] run chrome in headless mode & wait for user dir deletion --- source/ChromeDevTools/ChromeProcessFactory.cs | 16 +++++++++---- source/ChromeDevTools/IDirectoryCleaner.cs | 9 +++++++ source/ChromeDevTools/LocalChromeProcess.cs | 19 ++++----------- .../MasterDevs.ChromeDevTools.csproj | 2 ++ .../StubbornDirectoryCleaner.cs | 24 +++++++++++++++++++ source/Sample/Program.cs | 2 +- 6 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 source/ChromeDevTools/IDirectoryCleaner.cs create mode 100644 source/ChromeDevTools/StubbornDirectoryCleaner.cs diff --git a/source/ChromeDevTools/ChromeProcessFactory.cs b/source/ChromeDevTools/ChromeProcessFactory.cs index a007628..494568e 100644 --- a/source/ChromeDevTools/ChromeProcessFactory.cs +++ b/source/ChromeDevTools/ChromeProcessFactory.cs @@ -6,18 +6,26 @@ namespace MasterDevs.ChromeDevTools { public class ChromeProcessFactory : IChromeProcessFactory { + public IDirectoryCleaner DirectoryCleaner { get; set; } + + public ChromeProcessFactory(IDirectoryCleaner directoryCleaner) + { + DirectoryCleaner = directoryCleaner; + } + public IChromeProcess Create(int port) { string path = Path.GetRandomFileName(); var directoryInfo = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), path)); - var remoteDebuggingArg = "--remote-debugging-port=" + port; - var userDirectoryArg = "--user-data-dir=\"" + directoryInfo.FullName + "\""; - var chromeProcessArgs = remoteDebuggingArg + " " + userDirectoryArg + " --bwsi --no-first-run"; + var remoteDebuggingArg = $"--remote-debugging-port={port}"; + var userDirectoryArg = $"--user-data-dir=\"{directoryInfo.FullName}\""; + const string headlessArg = "--headless --disable-gpu"; + var chromeProcessArgs = $"{headlessArg} {remoteDebuggingArg} {userDirectoryArg} --bwsi --no-first-run"; var processStartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", chromeProcessArgs); var chromeProcess = Process.Start(processStartInfo); string remoteDebuggingUrl = "http://localhost:" + port; - return new LocalChromeProcess(new Uri(remoteDebuggingUrl), directoryInfo, chromeProcess); + return new LocalChromeProcess(new Uri(remoteDebuggingUrl), () => DirectoryCleaner.Delete(directoryInfo), chromeProcess); } } } \ No newline at end of file diff --git a/source/ChromeDevTools/IDirectoryCleaner.cs b/source/ChromeDevTools/IDirectoryCleaner.cs new file mode 100644 index 0000000..d27977c --- /dev/null +++ b/source/ChromeDevTools/IDirectoryCleaner.cs @@ -0,0 +1,9 @@ +using System.IO; + +namespace MasterDevs.ChromeDevTools +{ + public interface IDirectoryCleaner + { + void Delete(DirectoryInfo dir); + } +} \ No newline at end of file diff --git a/source/ChromeDevTools/LocalChromeProcess.cs b/source/ChromeDevTools/LocalChromeProcess.cs index 62f0e68..c075636 100644 --- a/source/ChromeDevTools/LocalChromeProcess.cs +++ b/source/ChromeDevTools/LocalChromeProcess.cs @@ -1,21 +1,18 @@ using System; using System.Diagnostics; -using System.IO; -using System.Threading; namespace MasterDevs.ChromeDevTools { public class LocalChromeProcess : RemoteChromeProcess { - public LocalChromeProcess(Uri remoteDebuggingUri, DirectoryInfo userDirectory, Process process) + public LocalChromeProcess(Uri remoteDebuggingUri, Action disposeUserDirectory, Process process) : base(remoteDebuggingUri) { - UserDirectory = userDirectory; + DisposeUserDirectory = disposeUserDirectory; Process = process; } - public DirectoryInfo UserDirectory { get; set; } - + public Action DisposeUserDirectory { get; set; } public Process Process { get; set; } public override void Dispose() @@ -23,15 +20,7 @@ namespace MasterDevs.ChromeDevTools base.Dispose(); Process.Kill(); - try - { - UserDirectory.Delete(true); - } - catch - { - Thread.Sleep(500); // i'm being lazy because i'm tired - UserDirectory.Delete(true); - } + DisposeUserDirectory(); } } } \ No newline at end of file diff --git a/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj b/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj index e3c29d8..edd8226 100644 --- a/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj +++ b/source/ChromeDevTools/MasterDevs.ChromeDevTools.csproj @@ -60,6 +60,7 @@ </ItemGroup> <ItemGroup> <Compile Include="ChromeProcessFactory.cs" /> + <Compile Include="IDirectoryCleaner.cs" /> <Compile Include="LocalChromeProcess.cs" /> <Compile Include="ChromeSession.cs" /> <Compile Include="ChromeSessionExtensions.cs" /> @@ -93,6 +94,7 @@ <Compile Include="Protocol\**\*.cs" /> <Compile Include="RemoteChromeProcess.cs" /> <Compile Include="Serialization\MessageContractResolver.cs" /> + <Compile Include="StubbornDirectoryCleaner.cs" /> <Compile Include="SupportedByAttribute.cs" /> </ItemGroup> <ItemGroup> diff --git a/source/ChromeDevTools/StubbornDirectoryCleaner.cs b/source/ChromeDevTools/StubbornDirectoryCleaner.cs new file mode 100644 index 0000000..4d44869 --- /dev/null +++ b/source/ChromeDevTools/StubbornDirectoryCleaner.cs @@ -0,0 +1,24 @@ +using System.IO; +using System.Threading; + +namespace MasterDevs.ChromeDevTools +{ + public class StubbornDirectoryCleaner : IDirectoryCleaner + { + public void Delete(DirectoryInfo dir) + { + while (true) + { + try + { + dir.Delete(true); + return; + } + catch + { + Thread.Sleep(500); + } + } + } + } +} \ No newline at end of file diff --git a/source/Sample/Program.cs b/source/Sample/Program.cs index b861c9c..ae7011a 100644 --- a/source/Sample/Program.cs +++ b/source/Sample/Program.cs @@ -12,7 +12,7 @@ namespace MasterDevs.ChromeDevTools.Sample Task.Run(async () => { // STEP 1 - Run Chrome - var chromeProcessFactory = new ChromeProcessFactory(); + var chromeProcessFactory = new ChromeProcessFactory(new StubbornDirectoryCleaner()); using (var chromeProcess = chromeProcessFactory.Create(9222)) { // STEP 2 - Create a debugging session -- GitLab