엑셀 VBA에서 Selenium을 사용해서 웹 페이지를 크롤링 하거나
다른 용도로 작업을 할 때 Element를 찾지 못했다는 등의 메시지를 경험해보신적 있나요?
이는 페이지의 로딩이 완료되지 않았거나,
실제로는 페이지에 존재하지만 시각적으로 보이지 않아서
찾지 못했다고 하는 경우들이 종종 있습니다.
이런 경우 매크로가 실행 되다가도 오류가 발생하며 그냥 멈춰버리죠.
할 때마다 이렇게 되버리면 짜증이 ^^
그래서 이런 현상을 방지하고자
'IsElementPresent' 메서드를 활용하는 방법에 대해 글을 남겨 봅니다.
IsElementPresent 매서드란?
'IsElementPresent' 메서드는
웹 페이지에서 특정 요소가 존재하는 여부를 확인하는 것으로
by라는 매개변수로 해당 특정 요소를 찾게 됩니다.
매서드 구조 및 양식은 직접 작성 해보시면 아시겠지만 아래와 같습니다.
IsElementPresent(by as by, [timeout as long])As boolean
by as by 매개 변수
이 매개 변수는 요소를 찾는 방법을 지정하는 것입니다.
ID로 찾을 것인지, Name으로 찾을 것인지, Xpath로 찾을 것인지, CSS로 찾을 것인지 등등..
FindElement 매서드 종류와 동일한 형태? 해당 매개 변수랑 유사하다 볼 수 있을 듯 하네요.
매개 변수 | 내용 |
by.ID | 요소의 ID 속성을 사용하여 요소를 찾습니다. |
by.Name | 요소의 이름 속성을 사용하여 요소를 찾습니다. |
by.Css | CSS 선택기를 사용하여 요소를 찾습니다. |
by.XPath | XPath 표현식을 사용하여 요소를 찾습니다. |
by.Class | 요소의 클래스 이름을 사용하여 요소를 찾습니다. |
by.Tag | 요소의 태그 이름을 사용하여 요소를 찾습니다. |
by.PatialLinkText | 요소의 부분 링크 텍스트를 사용하여 요소를 찾습니다. |
by.LinkText | 요소의 부분 링크 텍스트를 사용하여 요소를 찾습니다. |
timeout as long 매개 변수
이 매개 변수는 지정한 요소가 나타날 때까지 기다리는 최대 시간을 정할 수 있습니다.
선택사항이라 작성하지 않을 경우 기 대기시간이 적용됩니다.
단위는 ms이니 참고 바랍니다. (1000 = 1초)
IsElementPresent 매서드 사용법
IsElementPresent 매서드 사용 예시
위 이미지에서 Elements 정보를 볼 경우 확인 가능한 것이 id와 name입니다.
물론 Css와 XPath의 값들도 알 수 있겠죠?
그럼 여기서 id가 'author'인 Element(엘레멘트)의 존재 여부를 확인 하려면
어떻게 코드를 작성해야 할까요?
if driver.IsElementPresent(by.Id("author "), 10000) = true then
위와 같이 작성을 한다면 Id가 'author'인 Element가 있는지 확인을 해라,
최대 확인 할 시간은 10초다. 라고 할 수 있겠네요.
작성 하실 때 본인이 찾고 싶은 Elemet의 정보를 넣고,
대기 시간을 저런 형태로 넣으시면 됩니다.
IsElementPresent 매서드 사용 시 주의 사항
Selenium(셀레니움)에서 크롬 브라우저를 사용 할때도 변수 선언을 하듯,
IsElementPresent 매서드를 사용하기 전에 반드시 변수선언을 해줘야 합니다.
Dim by As New Selenium.by
요렇게 꼭 선언을 해주셔야 합니다.
그리고 IsElementPresent 매서드는 반드시 웹 페이지를 먼저
활성화 시킨 뒤 작동 되도록 해야 합니다.
그래야 Element(엘레멘트)의 존재 여부를 확인 할 수 있겠죠 ^^
IsElementPresent 매서드 응용법
저는 작업할 때 IsElementPresent 매서드를 종종 사용하는데,
매크로를 실행하다 Element를 찾을 수 없다는 오류 메시지가 뜨거나
그런 조짐이 보이거나.. 다른 용도로도 쓰고 있습니다.
예를 들어 #comment라는 Element에 코멘트를 달게 하려는데,
웹 페이지의 상태? 에 따라 실재로 존재하지만 화면에 보이지 않아
찾지 못하는 경우들도 가끔 생깁니다.
이럴 때, IsElementPresent 매서드를 활용하여
#comment가 있는지 일정시간 찾게 하고, 없을 경우
화면을 스크롤 해라고 합니다.
이런 방식으로 해서 해당 Element를 찾게 하는 등의 방법을 사용하기도 합니다.
다들 잘 활용 및 응용하셔서 좋은 결과 내시길 바랍니다.
'VBA & 셀레니움 이야기' 카테고리의 다른 글
[그냥 기록] On Error GoTo 레이블 작동이 한번만 될 때 처리 (0) | 2024.05.21 |
---|---|
vba selenium 팝업 창 제어하기 (0) | 2023.08.25 |
VBA 셀레니움으로 캡챠코드 (자동 등록 방지 코드) 자동입력 하기 꿀팁 (4) | 2023.08.16 |
VBA와 Selenium (0) | 2023.07.03 |