귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
 광고문의 :
강좌, 팁, 정보 강좌, 팁, 정보 입니다.
글내용 - 강좌, 팁, 정보
 class name으로 웹 element 액세스
coding
(권순호)
2018-07-30 오후 1:41:55
카테고리: 팁
1360회 조회



등록된 파일이 없습니다.
질문란에 올라온 글에 대한 보충.

<p class="btn">
  <input type="image" id="searchpng" src="/images/btn/search.png" onclick="search(1);" title="검색" alt="검색" />
</p>

위와 같이 id 가 주어지면

WebBrowser1.Document.getElementById('searchpng').Click;
으로 해당 웹 버튼을 클릭한 것 처럼 할 수 있는데


<a href="#" title="검색" onclick="fnSearchCorpName(); return false;" class="btn-sprite type-00 vmiddle search-btn"><span>검색</span></a>

위와 같이 id 가 주어지지 않았을 경우에는
어떻게 해당 웹 버튼이 클릭된 것 처럼 할 수 있는가가 질문의 요지다.


id 대신 class 네임을 이용하는 코드를
일반화 해서 함수를 만들면 다음과 같이 만들 수 있다.

uses MsHtml;

procedure invokeClickByClass(Doc: IDispatch; className: string);
var
  I: Integer;
begin
  with ((Doc as IHTMLDocument2).body as IHTMLElement2).getElementsByTagName('*') do
  for I := 0 to Pred(length) do
    with item(I, EmptyParam) as IHTMLElement do
    if AnsiSameText(_className, className) then
    begin
      click();
      Break;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  invokeClickByClass(WebBrowser1.Document, 'btn-sprite type-00 vmiddle search-btn');
end;



그러나 사용되는 IE 웹브라우져가 구버전이 아니고
VCL에서 IHTMLDocument7 DOM 인터페이스를 정의해 놓고 있다면

다음과 같이 코드를 더 간략하게 작성할 수 있다.

procedure invokeClickByClassName(Doc: IDispatch; csName: string);
begin
  ((Doc as IHTMLDocument7).getElementsByClassName(csName).item(0, EmptyParam) as IHTMLElement).click();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  invokeClickByClassName(WebBrowser1.Document, 'btn-sprite type-00 vmiddle search-btn');
end;