일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 로보티즈
- 무명의개발자
- 테스트자동화
- NocoDB
- 아두이노코딩봇
- 엠블록
- 다이나믹셀
- Ollo
- mysql4
- chromedriver
- 업로드모드
- ChatGPT
- arduino
- QA
- 코딩봇
- 테스트 자동화
- automation
- Robotis
- hutc
- testautomation
- TP4056
- c#
- 올로
- 효용감
- 아두이노
- CM-50
- 절벽아래은둔자
- Dynamixel
- MBLOCK
- 크롬드라이버
- Today
- Total
Hermit Under the Cliff
[Selenium] 브라우저 버전에 맞는 크롬 드라이버를 자동으로 가져오기 본문
[Selenium] 브라우저 버전에 맞는 크롬 드라이버를 자동으로 가져오기
AnonymousDeveloper 2022. 1. 25. 16:46Selenium을 이용해서 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가 어떤식으로 동작하는지에 대해서
이해를 하고 있다면 조금 더 프로그래머로써 레벨업을 할 수 있겠죠.
이 포스트가 그런 도움이 조금이나마 되었으면 합니다.
'Test Automation - Technical' 카테고리의 다른 글
[NocoDB] NocoDB 소개 - CRUD API 자동 생성 및 User Pool 관리 (0) | 2022.09.28 |
---|---|
[Android Memory Leak Test #1] 메모리릭의 절대값을 찾기 (0) | 2022.07.20 |