반응형

VBA로 매크로 작업을 하다보니 특정 위치들에서 오류가 발생

오류 발생 시 오류에 대한 기록을 남기고 다음 작업으로 넘어가서

반복 작업을 진행하려고 'On Error GoTo 레이블'을 사용 함

 

첫 번째 오류 발생 시에는 정상적으로 작동이 되지만,

두 번째 부터는 오류가 발생하더라도 런타임 오류 창이 계속 생성됨.

 

On Error 문법 관련해서 구글링도 해보고,

챗 gpt를 통해 알아보고 작업을 해봤지만 어떻게 해도 동일한 현상 발생

 

'On Error GoTo 0'도 뭔지 제대로 몰라서 하다가

-1이란게 있었음. 에러를 초기화 시킨다네?

 

혹시나 싶어 오류처리 작업을 다 하고 초기화를 시키고

기존 필수 작업 레이블로 이동 시키니 더 이상 런타임 오류 발생하지 않음

 

초기화 관련해서는 특별히 어디서 언급한 내용이 없어서 몰랐는데,

반복적으로 작업이 이뤄질 때 초기화가 반드시 필요해 보임

 

안되면 에러 코드를 갖고 비교해가면서 라인 작업들을 할려고 했는데,

무식하게 안해도 되어 다행.


 

Sub test()
    
    '오류 발생 시 핸들러로 점프
    On Error GoTo ErrorHandler
    
    For i = 1 To 10
        
        '각종 코드 실행
        
'오류 처리 후 복귀해서 시작 할 라인
Repoint:

    Next i
    
    '정상적으로 작업이 완료 될 경우 종료
    Exit Sub
    
'오류 발생 시 처리 할 레이블
ErrorHandler:
    
    '오류 처리 코드 실행
    
    '오류 처리 초기화
    On Error GoTo -1
    
    '오류 처리 후 기존 작업으로 복귀
    GoTo Repoint
End Sub

반응형
반응형

엑셀 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 정보

 

위 이미지에서 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로 selenium을 이용하여 웹페이지를 작업하다보면,

팝업창이 활성화 되는 경우들이 있습니다.

 

팝업 창 예시 1
팝업 창 예시 2

이런 경우 현재의 커서가 팝업창에 위치하여,

제대로 진행되지 않는 경우들이 있죠.

 

이럴 때 키 입력하는 방식인

SendKeys {"enter"}

코드로 간단하게 해결 할 수 있는 방법도 있지만,

실질적으로 해당 방법은 완벽하다고 할 수 없습니다.

 

이유인 즉슨

팝업창의 현재 커서가 어느 버튼에 있느냐에 대해서는

정확히 알 수 없기 때문입니다.

(보편적으로는 확인에 커서가 가있는 경우들을 많이 보긴 했습니다)

 

이럴 때는 SwitchToAlert 매서드를 이용하시면 됩니다.

 

확인 버튼 입력처리 매서드

selenium변수.SwitchToAlert.Accept

 

취소 버튼 입력처리 매서드

selenium변수.SwitchToAlert.Dismiss

 

해당 매서드를 이용해서 처리 하시면,

팝업창의 버튼에 맞게 확인 또는 취소 처리를 진행 할 수 있습니다.

반응형
반응형

VBA 셀레니움으로 웹 자동화 작업을 하다보면,

작업하는 상황에 따라 자동 등록 방지를 위해 만들어진

캡챠코드를 입력해야 하는 경우가 발생하기도 합니다.

 

예시) 자동 등록 방지용 캡챠 이미지

 

뭐.. 일반적이진 않죠 ^^;;

 

저도.. 좀 특수한 작업들을 하다보니 캡챠코드를 입력해야 하는

벽이 한번 생긴적이 있었습니다.

 

캡챠코드를 어떻게 풀 수 있을까..

어떻게 저 문자들을 해석 할 수 있을까..

고민고민 하면서 여러 방면으로 자료들도 좀 찾아보곤 했는데,

 

어떤 분은.. 캡챠 이미지를 찾는대로 저장하고, 해당 이미지에 맞는

코드들을 입력해 넣은 테이블을 만들어 작업 하신건 봤는데..

해당 자료를 제가 받아 볼 수 있는것도 아니고....

 

그래서 또 고민고민 고민을...

그러다 좋은 아이디어가 떠 올랐습니다.

 

그것은 바로!! 구글 렌즈를 이용하여,

해당 캡챠 값을 가져오는 것 이였습니다 ㅎㅎ

 

구글 렌즈를 이용한 캡챠 이미지 분석하기

구글 렌즈

구글은 '구글 렌즈'라는 이미지 분석 툴이 있습니다.

이 내용만 봐도 아실만한 분들은 아마 감 오셨을거라 생각 되네요.

 

구글 렌즈로 비슷한 이미지라든지,

다른 나라 언어를 분석 한다든 지

여러가지 정보들을 알아 낼 수 있는 기능을 합니다.

 

저는 여기서 텍스트를 번역하는 부분에 대해 생각하고

이것을 이용하는 방식을 택했었습니다.

 

캡챠 이미지 분석 및 코드 추출에서 입력까지 진행 방법

캡챠 이미지 분석 순서

캡챠 이미지 분석 순서도

 

대부분 캡챠코드를 사용하여 등록하는 경우에는

글 등록 시 팝업창에 처리 메시지가 출력되기도 하고

안되기도 합니다.

 

정상처리 될 경우에는 간혹 팝업창 활성화가 없으며,

오류 경우에는 100% 팝업 메시지가 생성되는데,

해당 메시지들은 대부분 비슷하더라구요.

 

오류가 날 경우에는 프로세스를 다시 첨부터

돌리는 방식으로 진행하시면 됩니다.

 

문제가 될 수 있는 부분도 있고해서

따로 소스를 풀어낼 수는 없지만..

혹시나 자세한 내용이 궁금하신분 있으시면 댓글 남겨주세요.

반응형
반응형

VBA와 Selenium

아시는 분들은 많겠지만,

이 글을 그냥 넘어가시는 분들도 많겠지만,

앞으로 알아갈 VBA와 Selenium에 대해 한번 알고 갔으면 해서

이렇게 내용을 한번 정리 해 봅니다.

 

VBA는 무엇인가

VBA (Visual Basic for Applications)

VBA란

Visual Basic for Applications의 줄임말로

현재는 MS 오피스군에 내장되어 있는 프로그래밍 언어입니다.

제가 아주 어렸을 때는 MS 오피스가 없던 그 시절에는.. 따로

프로그램이 있었던 것이 기억나네요 ㅎㅎ

 

VBA는 엑셀, 워드, 파워포인트 등에서 사용이 가능하다고는 하나,

일반적으로는 엑셀의 반복적인 일들을 쉽게 처리하기 위한

매크로에 사용되고 있는 부분이 사실입니다.

 

Selenium은 무엇인가

Selenium

Selenium은 간단하게 말 하자면,

웹 상에서 반복적으로 테스트를 하거나,

내용을 수집(크롤링) 또는 실행 하는 일들을

자동화 하여 수행 할 수 있도록 해주는 프레임워크라고 말 할 수 있습니다.

 

Selenium은 파이썬, 자바, C# 등 많은 언어들을 지원하는 것으로 알려져 있으며,

앞으로 같이 배워나갈 vba에도 적용 및 활용을 할 수 있습니다.

 

현재는 아파치 라이선스하에 오픈소스로 자유로이 이용 할 수 있으며,

크롬 웹 브라우저의 버전에 따라 지속적인 업데이트가 이루어지고 있습니다.

 

VBA와 Selenium을 결합 한다면?

VBA와 Selenium을 결합 한다면,

다양한 웹 관련 데이터 수집 및 웹 페이지 업데이트 등의

반복적인 일들을 손 쉽게 해결 할 수 있게 됩니다.

 

저는 업무상 주로 엑셀을 다뤘으며,

엑셀의 반복적인 데이터들을 쉽게 처리하기 위해 VBA를 알게 되었고,

이후 웹 관련 업무들을 반복적으로 처리 하려다 보니 셀레니움을 알게 되었습니다.

 

쇼핑몰 및 각종 웹페이지들을 운영하시면서

관련 데이터를 수집하는 크롤링이 필요하시거나,

데이터들을 웹 페이지로 업데이트를 한다거나

반복적인 노가다 작업이 지겨우시다면,

앞으로 업데이트 하는 내용들을 한번 잘 살펴 봐주세요.

반응형

+ Recent posts