본문 바로가기
VBA/엑사남_심화방

[심화방] VBA_심화_100제 #20 [ 복잡한 노드 제어하기 ]

by 일등미노왕국 2023. 7. 27.

특정 사이트를 언급하기는 힘들지만 공기업 관련 사이트를 제어하다 보면 우리가 아는 방식과는 많이 어긋나 있는 것을 볼 수 있다. 일부러 보안때문에 그런거 일수도 있지만 연구를 하는 우리들에게는 맛있는 먹잇감이 될 수 있다...ㅋㅋㅋ

 

 

같은 크루인 청곡님이 몇일전부터 같은 질문을 하시길래  왜 해결이 안되지...어려운게 아닌데 하고 넘어가곤 하다가 어제 본인의 약주가 심했던지라 업무 집중도 안되서 청곡님과 갠적으로 연락하여 막힌 코드를 보게 되었다.

 

천천히 코드를 진행하면서 개발자도구로 태그를 보게 되었는데

와..이건 청곡님이 못하는게 아니라 코드가 진짜 일부러 하지 않으면 이렇게까지 할 수 있을까 정도로 난해하고 지저분했다. CSS를 모든 태그에 입혀놨는데 이건 와 다시 생각해도 엄두가 안날 정도였다.

 

허나 너무 다행인건 웹상에 보인다는건 자바스크립트로 제어가 가능하다는 것이기 때문에

셀레니움이나 기타 어떤 방법도 안된다고 하면 자바스크립트를 이용하여 제어 해보는것을 추천한다.

 

 

Set nodes = driver.FindElementsByCss("#:id값 / .:class값 / [아무것도없음]:태그값)

 

만약 태그가 부모 태그 밑의 tr  태그를 순환해야 하거나 / div 태그를 순환해야 한다면

tr 태그 순환 : Set nodes = driver.FindElementsByCss("#haja > tr")

idv 태그 순환 : set nodes = driver.FindElementsByCss("#haja > div").

이렇게 하면된다.

 

노드의 갯수를 확인하는 방법은

nodes.count

이렇게 하면된다.

 

물론 저 nodes는 변수로 본인들의 설정한 변수의 카운드매소드를 적으면 된다.

 

Set nodes = driver.FindElementsByCss("#main > div")
    
            
driver.ExecuteScript "arguments[0].textContent='" & 수행일자 & "'", nodes(3).FindElementsByTag("div")


driver.ExecuteScript "arguments[0].textContent='" & 시작시간 & "'", nodes(4).FindElementsByTag("div")


driver.ExecuteScript "arguments[0].textContent='" & 종료시간 & "'", nodes(5).FindElementsByTag("div")


driver.ExecuteScript "arguments[0].textContent='" & ceo면담 & " '", nodes(6).FindElementsByTag("div")

 

여기서 nodes.count는 12개였고, 각각의 nodes의 인덱스 값을 넣어서 제어하면 된다.

 

nodes(3).FindElementsByTag("div") 이 코드를 설명하면 nodes(3)번째 태그중 그 자식 태그인 div를 의미한다.

즉 id가 main인 요소의 자식요소인  div를 가진 노드의 3번째 노드의 그 자식요소를 div를 의미한다.

id > div > div

driver.ExecuteScript -> 셀레니움에서 자바스크립트 호출

driver.ExecuteScript "arguments[0].textContent='" & 수행일자 & "'" -> 수행일자의 변수를 textContent의 값으로 변경해라

driver.ExecuteScript "arguments[0].textContent='" & 수행일자 & "'", nodes(3).FindElementsByTag("div") -> 변경할 태그의 값은 nodes(3).FindElementsByTag("div")이다...

 

driver.ExecuteScript "arguments[0].textContent='변경할 값'", node

이게 기본값이다.

 

textContent대신 Click()을 하면 클릭된다.

 

개발자도구의 콘솔창에서 id값으로 str변수를 선언한 후 textContent를 하게 되면 해당 태그의 innerText값을 가져올 수있다.

앞서 보인 코드는 기존 textContent의 값을 변경하는 코드이다.

 

나중에는 요렇게도 장난을 칠 수도 있다.

댓글