메뉴 건너뛰기


 

원래 https://github.com/Hyo-Seong/ChromeDriverUpdater

저기에 올라와 있던 것을 주워다 쓰면서 날먹을 하고 싶었는데 뭔가 좀 바뀌어서 404 에러나면서 잘 안되더라.

그래서 소스 보고 뜯어서 되게 고쳐두었다.

 

 

ChromeDriverUpdator cdu = new ChromeDriverUpdator();
//cdu.LogEventAssign(LogAppend);
cdu.UpdateStart(Directory.GetCurrentDirectory() + @"\chromedriver.exe");

 

대충 이렇게 하면 돌아간다.

코드 간소화하기 귀찮아서 그냥 대충 막 고쳐놓고는 줄창 써먹을 예정

 

 

 

 

 

 

namespace JprCeleniumChromeDriverUpdater {

    public class PlatformUrl {
        public string platform;
        public string url;
    }

    public class GoodVersions {
        public string version;
        public string revision;
        public Dictionary<string, PlatformUrl[]> downloads;
    }

    public class GoodVersionJson {
        public string timestamp;
        public GoodVersions[] versions;
    }

    public class ChromeDriverUpdator {

        private GoodVersionJson m_versionInfo;

        private Action<string> m_logAction;
        private const string URL_JSON_GOODVERTION = "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json";


        public void LogEventAssign(Action<string> action) {
            m_logAction += action;
        }

        private void LogWrite(string _str) {
            m_logAction?.Invoke(_str);
        }

        public void UpdateStart(string chromeDriverFullPath) {
            if (string.IsNullOrEmpty(chromeDriverFullPath)) {
                throw new ArgumentNullException(nameof(chromeDriverFullPath));
            }

            chromeDriverFullPath = Path.GetFullPath(chromeDriverFullPath);
            LogWrite(chromeDriverFullPath);

            if (!File.Exists(chromeDriverFullPath)) {
                throw new FileNotFoundException();
            }

            Version chromeDriverVersion = GetChromeDriverVersion(chromeDriverFullPath);
            Version chromeVersion = GetChromeVersion();

            LogWrite($"크롬 버전: {chromeVersion}\n크롬 드라이버 버전: {chromeDriverVersion}");
            if (UpdateNecessary(chromeDriverVersion, chromeVersion)) {
                LogWrite($"크롬 드라이버 버전을 업데이트합니다...");
                ShutdownChromeDriver(chromeDriverFullPath);

                using (WebClient client = new WebClient()) {
                    string jsonContent = client.DownloadString(URL_JSON_GOODVERTION);
                    m_versionInfo = JsonConvert.DeserializeObject<GoodVersionJson>(jsonContent);
                }

                UpdateChromeDriver(chromeDriverFullPath, chromeVersion);
                Version newChromeDriverVersion = GetChromeDriverVersion(chromeDriverFullPath);
            } else {
                LogWrite($"크롬 드라이버 버전을 업데이트하지 않습니다.");
            }

        }

        public class ProcessExecuter {
            public string Run(string fileName, string arguments) {
                Process process = new Process();

                process.StartInfo = GetProcessStartInfoForHiddenWindow(fileName, arguments);
                process.Start();

                string output = process.StandardOutput.ReadToEnd();

                process.WaitForExit();

                return output;
            }

            private ProcessStartInfo GetProcessStartInfoForHiddenWindow(string fileName, string arguments) {
                ProcessStartInfo processStartInfo = new ProcessStartInfo();

                processStartInfo.UseShellExecute = false;
                processStartInfo.RedirectStandardOutput = true;
                processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                processStartInfo.CreateNoWindow = true;

                processStartInfo.FileName = fileName;
                processStartInfo.Arguments = arguments;

                return processStartInfo;
            }
        }

        internal Version GetChromeDriverVersion(string chromeDriverPath) {
            string output = new ProcessExecuter().Run($"{chromeDriverPath}", "-v");
            string versionStr = output.Split(' ')[1];
            Version version = new Version(versionStr);

            return version;
        }

        public string ChromeDriverName => "chromedriver.exe";
        public string ChromeDriverZipFileName => "chromedriver_win64.zip";
        public Version GetChromeVersion() {
            using (RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\Google\\Chrome\\BLBeacon")) {
                if (key != null) {
                    object versionObject = key.GetValue("version");

                    if (versionObject != null) {
                        Version version = new Version(versionObject as String);

                        return version;
                    }
                }
            }

            return null;
        }

        internal bool UpdateNecessary(Version chromeVersion, Version driverVersion) {
            //revision은 하지마
            if (chromeVersion.Major == driverVersion.Major &&
                   chromeVersion.Minor == driverVersion.Minor &&
                   chromeVersion.Build == driverVersion.Build) {
                return false;
            } else return true;
        }

        internal void ShutdownChromeDriver(string chromeDriverFullPath) {
            var processes = Process.GetProcesses();

            foreach (Process process in processes) {
                // find exact path
                if (process.MainWindowTitle == chromeDriverFullPath) {
                    process.Kill();
                }
            }
        }

        private void UpdateChromeDriver(string existChromeDriverFullPath, Version chromeVersion) {
            string zipFileDownloadPath = DownloadChromeDriverZipFile(chromeVersion);

            string newChromeDriverFullPath = GetNewChromeDriverFromZipFile(zipFileDownloadPath);

            if (newChromeDriverFullPath != null) {
                File.Copy(newChromeDriverFullPath, existChromeDriverFullPath, true);

                File.Delete(newChromeDriverFullPath);
                LogWrite("새로운 크롬 드라이버 버전 설치 완료");
            }

        }

        internal string DownloadChromeDriverZipFile(Version chromeVersion) {
            int bestVersionIndex = -1;
            Version bestNewVersion = null;
            for (int i = 0; i < m_versionInfo.versions.Length; i++) {
                GoodVersions sample = m_versionInfo.versions[i];
                if (Version.TryParse(sample.version, out Version parsedVersion)) {
                    if (((bestNewVersion == null) || (bestNewVersion < parsedVersion))
                        && (chromeVersion.Major == parsedVersion.Major)
                        && (chromeVersion.Minor == parsedVersion.Minor)
                        && (chromeVersion.Build == parsedVersion.Build)) {
                        bestVersionIndex = i;
                        bestNewVersion = parsedVersion;
                    }
                } else {
                    continue;
                }

            }

            string downloadUrl = string.Empty;
            if (bestNewVersion != null) {
                GoodVersions gv = m_versionInfo.versions[bestVersionIndex];
                LogWrite($"다운 받을 크롬 드라이버 버전: {gv.version}");
                PlatformUrl[] PU = gv.downloads["chromedriver"];
                for (int i = 0; i < PU.Length; i++) {
                    if (PU[i].platform == "win64") {
                        downloadUrl = PU[i].url;
                        break;
                    }
                }
            } else {
                return null;
            }

            if (string.IsNullOrEmpty(downloadUrl) == false) {
                string downloadZipFileFullPath = Path.Combine(Path.GetTempPath(), ChromeDriverZipFileName);
                DownloadFile(downloadUrl, downloadZipFileFullPath);
                return downloadZipFileFullPath;
            } else {
                return null;
            }

        }

        internal string GetNewChromeDriverFromZipFile(string zipFileDownloadPath) {
            string unzipPath = Path.Combine(Path.GetDirectoryName(zipFileDownloadPath), Path.GetFileNameWithoutExtension(zipFileDownloadPath));

            UnzipFile(zipFileDownloadPath, unzipPath, true);

            return FindNewChromeDriverFullPathFromUnzipPath(unzipPath);
        }

        internal string FindNewChromeDriverFullPathFromUnzipPath(string chromeDriverUnzipPath) {
            chromeDriverUnzipPath += "\\chromedriver-win64";
            DirectoryInfo directoryInfo = new DirectoryInfo(chromeDriverUnzipPath);

            FileInfo[] files = directoryInfo.GetFiles();

            LogWrite(chromeDriverUnzipPath);
            foreach (FileInfo file in files) {
                // ignore case
                if (file.Name.ToLower() == ChromeDriverName.ToLower()) {
                    string newPath = Path.Combine(Path.GetDirectoryName(chromeDriverUnzipPath), file.Name);

                    File.Copy(file.FullName, newPath, true);

                    Directory.Delete(chromeDriverUnzipPath, true);

                    return newPath;
                }
                LogWrite($"찾은 파일 : {file.FullName}");
            }

            return null;
            //throw new Exception("Can't find chromedriver name. name: " + ChromeDriverName.ToLower());
        }

        internal void DownloadFile(string downloadUrl, string downloadPath) {
            new WebClient().DownloadFile(downloadUrl, downloadPath);
        }

        internal void UnzipFile(string zipPath, string unzipPath, bool deleteZipFile = true) {
            if (Directory.Exists(unzipPath)) {
                Directory.Delete(unzipPath, true);
            }

            ZipFile.ExtractToDirectory(zipPath, unzipPath);

            if (deleteZipFile) {
                File.Delete(zipPath);
            }
        }
    }
}


사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )

  1. 유니티 WebGL 빌드에서 렌더링 해상도가 너무 크게 나올때

    Date2024.12.11 Category게임 By조루나 Views8
    Read More
  2. 유니티질 8년차에 깨달은 텍스쳐 압축과 메모리 할당

    Date2024.11.09 Category게임 By조루나 Views27
    Read More
  3. 게임 번역 AI로 날먹하는 중...

    Date2024.08.13 Category그외 By조루나 Views61
    Read More
  4. [C#] float.parse와 포르투갈어 사건 (CultureInfo 관련)

    Date2024.07.26 Category그외 By조루나 Views48
    Read More
  5. 유니티 Shader Variant Loading Settings을 쓰니 메모리가 절약되네

    Date2024.07.23 Category게임 By조루나 Views47
    Read More
  6. 지프로 슈퍼라이트 마우스 휠 인코더 청소할 때 꼭 풀어야 하는 나사 정리

    Date2024.05.21 Category그외 By조루나 Views98
    Read More
  7. 게임 메이커 스튜디오 C# dll 라이브러리 만들 때 .NET 프레임워크 버전 문제

    Date2024.05.03 Category그외 By조루나 Views103
    Read More
  8. 애드몹 Code 3 no fill 에러 원인 중 한 가지

    Date2024.01.16 Category게임 By조루나 Views116
    Read More
  9. 유니티 특) 9 Slice랑 Filled 동시에 안 됨.

    Date2023.11.29 Category게임 By조루나 Views116
    Read More
  10. 메쉬로 Progress circle 그리기

    Date2023.11.23 Category게임 By조루나 Views112
    Read More
  11. 남이 만든 게 안 돌아가서 뜯어고친 C# 셀레니움 크롬 드라이버 자동 업데이트

    Date2023.11.23 Category그외 By조루나 Views98
    Read More
  12. 우효, 이런 좋은 버그리포트 도구가 있었다니 Sentry

    Date2023.05.08 Category게임 By조루나 Views151
    Read More
  13. Unity 빌드 전 대화상자 출력

    Date2023.04.20 Category게임 By조루나 Views98
    Read More
  14. 유니티 모바일에서 VideoPlayer로 영상 재생하면 자꾸 멈춘다.

    Date2023.02.23 Category게임 By조루나 Views139
    Read More
  15. 세 가지 셀 셰이딩 에셋의 단순 프레임 비교

    Date2023.02.03 Category게임 By조루나 Views144
    Read More
  16. 유니티 transform 참조의 문제

    Date2022.11.10 Category게임 By조루나 Views163
    Read More
  17. 에셋 Super Tilemap Editor가 바닥면 Collider를 만들어주지 않아

    Date2022.10.27 Category게임 By조루나 Views113
    Read More
  18. 미소녀 뱀파이어 서바이버즈를 만들자! - 캐릭터 몸에 마법 문신 넣기

    Date2022.10.06 Category게임 By조루나 Views209
    Read More
  19. Unity 2020에서 Spine 3.6 Runtime이 AtlasAsset을 제대로 Import하지 못 할 때

    Date2022.09.20 Category게임 By조루나 Views129
    Read More
  20. 스파인 텍스쳐 런타임 색칠하기

    Date2022.09.02 Category게임 By조루나 Views113
    Read More
Board Pagination Prev 1 2 3 Next
/ 3