Hermit Under the Cliff

[Selenium] 브라우저 버전에 맞는 크롬 드라이버를 자동으로 가져오기 본문

Test Automation - Technical

[Selenium] 브라우저 버전에 맞는 크롬 드라이버를 자동으로 가져오기

AnonymousDeveloper 2022. 1. 25. 16:46

Selenium을 이용해서 Web application 자동화 테스트를 진행하다보면,

가끔 잘 돌아가던 코드들이 제대로 돌지 않을 때가 있습니다.

에러가 나서 살펴보면 크롬 브라우저는 업데이트가 되었는데

chromedriver가 예전 버전에서 업데이트가 되지 않아

버전의 불일치로 인해서 에러가 나는 경우도 가끔 있습니다.

크롬 드라이버는 대체로 backward compatiblity가 지원이 되지 않아 브라우저 버전과 항상 맞춰 주어야 합니다.

 

 

제가 개발해서 배포하는 테스트 툴은

프로그래밍 경험이 없는 테스터들에게도 쉽게 자동화 테스트가 가능하도록 하는게 목적이라

어려운 셋업 과정 없이 다운로드-압축해제-실행 으로만 가능하도록 

최대한 노력중에 있습니다.

 

이런 환경내에서 각각의 테스터들에게

사용하는 브라우저 버전을 확인해서 알맞은 크롬 드라이버를 다운 받아 사용하세요

라고 하면 실제 사용자들이 싫어하고 어려워 하겠죠.

가능한 편하게 만들어야 사용자들이 행복해하고, 잘 사용하고

그를 통해 제 일자리가 조금 더 안정적이 되고 그렇습니다.

 

서론이 길었습니다.

그럼 어떻게 해야 자동으로 알맞은 드라이버를 가지고 올 수 있는지 알아보겠습니다.

 

1. 현재 Install 되어있는 브라우저의 버전 정보 가져오기

Windows의 경우, 기본 설치 위치에 인스톨이 된 경우가 대부분이긴 하지만,

만일을 위해 브라우저가 설치된 경로를 알아오는 것이 중요합니다.

현재 install 되어있는 브라우저의 정보는 registry에서 확인 가능합니다.

64bit : HKLM\SOFTWARE\WOW6432Node\Clients\StartMenuInternet\Microsoft Edge\shell\open\command

32bit : HKLM\SOFTWARE\Clients\StartMenuInternet

그리고 아래와 같이 각 브라우져 별로

하위 key인 shell\open\command를 확인하면 실제 binary 위치를 얻을 수 있습니다.

이 binary의 file version을 확인하면, 브라우저의 현재 버전을 알 수 있습니다.

C#의 경우 아래와 같이 System.Diagnostics의 FileVersionInfo를 이용하거나

BrowserVersion = FileVersionInfo.GetVersionInfo(browserPath).FileVersion;

Command line을 통해 얻어올 수 있습니다.

wmic datafile where name="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe" get Version /value

 

Linux의 경우는 아래와 같이 command line으로 바로 버전 확인이 가능합니다.

google-chrome --version

 

2. 현재 설치된 driver의 버전 가지고 오기

지금 하고 있는 목적이 자동으로 driver를 가지고 오는 것이기 때문에

driver가 저장되는 위치는 이미 정해진 곳이라고 가정을 합니다.

driver의 버전은 chromedriver나 firefox를 위한 geckodriver의 경우

위에서와 같이 file의 버전을 확인하면 제대로 나오지 않았습니다.

이 경우는 --version을 사용하여 직접 버전을 확인해 줍니다.

chromedriver.exe --version

 

3. 현재 설치된 브라우저에 맞는 드라이버 버전 확인하기

chrome driver의 경우는 아래의 주소에서 현재 크롬 버전에 맞는 드라이버 버전을 확인할 수 있습니다.

 

https://chromedriver.storage.googleapis.com/LATEST_RELEASE_[chrome browser version]   

 

이때 주의하실 것은 chrome browser version은 앞 세자리 xxx.xxx.xxx 만 넣어주셔야 됩니다.

 

4. Chrome driver 다운로드

위 2번에서 얻은 현재 설치된 드라이버와 3번에서 얻은 현재 설치된 브라우저에 맞는 드라이버간의 버전이 맞지 않으면

새로 드라이버를 다운로드 해주어야 합니다.

 

https://chromedriver.storage.googleapis.com/

위 주소에 접속을 해보시면 xml 형태로 현재 다운로드 가능한 chrome driver들의 리스트가 나와 있습니다.

여기서 위에서 얻은 크롬 드라이버 버전으로 찾으면 원하는 드라이버를 다운로드 가능합니다.

아래와 같이 원하는 버전의 드라이버의 key 값을 저 주소 뒤에 붙여 주시면 바로 다운로드가 가능합니다.

https://chromedriver.storage.googleapis.com/97.0.4692.71/chromedriver_win32.zip

 

XML의 내용을 보시면 알겠지만 key값이[version]/chromedriver_[platform].zip 으로 된 것을 확인 하실 수 있습니다.

platform이 고정되어 있으면 가변되는 값은 크롬 드라이버의 버전 값 밖에 없으니, 

XML의 내용을 일일히 parsing 할 필요 없이 바로 다운로드 주소를 알 수 있습니다. 

저의 경우는 항상 win32 driver를 사용하므로 바로 아래와 같은 download 주소를 얻을 수 있습니다.

DriverDownloadAddresses = $"https://chromedriver.storage.googleapis.com/{driverversion}/chromedriver_win32.zip";

 

5. [추가] Firefox geckodriver

Gecko driver의 경우는 backward compatilibty 가 유지가 되어서

일반적으로는 가장 최신의 버전을 사용해주면 무리 없이 돌아갑니다.

Github의 release페이지에 최신 binary들이 첨부가 되어있으니 여기서 다운로드 해주면 됩니다.

https://github.com/mozilla/geckodriver/releases

여기도 보시면 각각의 platform 별로 binary가 나누어져 있습니다.

다운로드 링크(주소)를 얻기 위해Github API를 사용해도 되지만,

저는 그냥 단순하게 페이지 전체 html 속에서 원하는 file명이 있는 링크를 찾는 것으로 구현을 해버렸습니다.

if (is64BitOperatingSystem)
{
    needle = "win64";
}
else
{
    needle = "win32";
}

using (WebClient client = new WebClient())
{
    string downloadPage = client.DownloadString(@"https://github.com/mozilla/geckodriver/releases");
    Regex hrefTag = new Regex($@"<a[^>]+{needle}\.zip[^>]+[>]");
    foreach (Match m in hrefTag.Matches(downloadPage))
    {
        Regex linkAddr = new Regex("href=\"[^\"]+[\"]");
        if(linkAddr.IsMatch(m.Value))
        {
            string downloadAddr = linkAddr.Match(m.Value).Value;
            downloadAddr = downloadAddr.Replace("href=", string.Empty);
            downloadAddr = downloadAddr.StripQuotes();
            downloadAddr = "http://github.com" + downloadAddr;
            return downloadAddr;
        }
    }
}

 


저의 경우는 이 logic을 test code에서 driver 객체를 생성하기 전,

version check 를 통해서 driver version을 항상 up-to-date로 맞추어 주고 있습니다.

이렇게 함으로써 훨씬 더 안정적인 웹 자동화 테스트 환경을 구축 할 수 있습니다.

 

참고로 python을 사용하시는 경우는 위에 적힌 내용이 전혀 필요가 없긴 합니다.

chromedriver_autoinstaller package를 이용하시면 됩니다.

하지만 이러한 package가 어떤식으로 동작하는지에 대해서

이해를 하고 있다면 조금 더 프로그래머로써 레벨업을 할 수 있겠죠.

이 포스트가 그런 도움이 조금이나마 되었으면 합니다.

Comments