아는 지인 분께서 간단한 UI를 가진 크롤링 프로그램 개발을 요청하셔서 공부도 할 겸 진행하기로 하였습니다.
개발을 통해 얻게된 .NET 환경에서의 Selenium 개발 지식을 정리해놓는게 좋겠다고 생각되어 이번 글을 적게 되었습니다.
먼저 프로젝트를 생성하겠습니다. Selenium 테스트 용도의 프로젝트로 활용할 예정이니 Console 프로젝트로 생성하겠습니다.
다음은 Selenium 패키지를 설치해보겠습니다.
Selenium 기본 클래스, 인터페이스가 내장되어있는 Selenium.WebDriver
패키지를 설치합니다.
Selenium을 사용하려면 해당 브라우저의 WebDriver를 실행파일과 같은 위치에 배치하거나, 경로를 따로 지정해주어야 합니다.
하지만, .NET에서는 패키지만 설치하면 자동으로 출력경로에 WebDriver가 배치되도록 구성해둔 사람들이 있더군요.
따라서 저는 Edge 브라우저를 사용할거기 때문에 Selenium.WebDriver.MicrosoftDriver
패키지도 설치하겠습니다.
그리고 나서 빌드를 해보면 출력경로에 WebDriver가 자동으로 배치되는 것을 확인할 수 있습니다.
///
/// <summary>
/// 새로운 WebDriver 인스턴스를 반환하는 함수
/// </summary>
private static IWebDriver GetWebDriver()
{
var service = EdgeDriverService.CreateDefaultService();
// webdriver명령창 숨기기
service.HideCommandPromptWindow = true;
// 옵션 매개변수 추가
var options = new EdgeOptions();
options.AddArguments("--ignore-certificate-errors");
return new EdgeDriver(service, options);
}
/// <summary>
/// 네이버 증권에서 query 문자열을 검색한 후 나오는 1페이지 종목명을 반환하는 함수
/// </summary>
private static string[] SearchStockItems(IWebDriver driver, string query)
{
// naver 증권으로 이동
driver.Navigate().GoToUrl("https://finance.naver.com/");
// 렌더 대기
Thread.Sleep(500);
// 검색 form 가져오기
var formSearch = driver.FindElement(By.Name("search"));
// 쿼리 input 가져오기
var inpQuery = formSearch.FindElement(By.Name("query"));
// 검색어 입력
inpQuery.SendKeys(query);
// 검색
formSearch.Submit();
// 검색 렌더 대기
Thread.Sleep(500);
// 검색 결과에서 종목명 태그만 가져오기
var tdNames = driver.FindElements(By.CssSelector(".tbl_search tr td:first-child > a"));
// result에 적재
var result = new List<string>();
foreach (var tdName in tdNames)
result.Add(tdName.Text);
// 반환
return result.ToArray();
}
/// <summary>
/// a WebDriver의 Cookie를 b WebDriver에 복사하는 함수
/// </summary>
private static void CopyCookiesTo(IWebDriver a, IWebDriver b)
{
foreach (var cookie in a.Manage().Cookies.AllCookies)
b.Manage().Cookies.AddCookie(cookie));
}