WebBrowser i klikniecie w Button - ciekawe zagadnienie

0

Witam,
mam jedną stronkę: http://www.tcz.pl/index.php?p=2,6,0,dodaj-ogloszenie-bezplatne i chciałbym ładując ją do webbrowsera, kliknąć programowo (wywolac okienko wyboru pliku ze zdjeciem) w button Przeglądaj -> http://i.imgur.com/wjGW79x.png,

stosowałem różne triki i nie udalo się - do obslugi webbrowsera uzywam standardowych funkcji opisanych np tutaj: http://www.cryer.co.uk/brian/delphi/twebbrowser/read_write_form_elements.htm

Czy mogę prosić o pomoc z tym ustrojstwem?

0

To ja spytam. A czy rozwiązanie musi być koniecznie z użyciem TWebBrowser? Jesteś pewien, że nie da się tego ogarnąc prościej, wysyłając metodą POST odpowiednie dane z użyciem: Indy / Synapse / Simple TCP? Bo jeżeli chodzi o TWebBrowser to chyba najlepiej to tutaj, tak jak Indy ogarnia @kAzek.

0

Oczywiscie najczesciej uzytkuje Indy i zazwyczaj dziala, jednak gdy w gre wchodza javasripty i inne dziadostwa pozostaje webbrowser.

Zazwyczaj starczyło:

WebBrowser.OleObject.Document.GetElementByID('lblcommande').Click;

jednak nie tym razem...

Ktoś ma pomysł?

0

Wywoływanie tego okna jest zablokowane ze względów bezpieczeństwa.
Tutaj są metody obejścia zabezpieczenia: http://stackoverflow.com/questions/210643/in-javascript-can-i-make-a-click-event-fire-programmatically-for-a-file-input
A tutaj jest taki sam temat: Webbrowser i wywolanie okna do upload'u pliku.

0

Wywolanie tego okna nie jest zablokowane, po prostu nie moge znalezc id/name przycisku na stronie nawet iterujac po calosci - dziwne...

2

Było już o tym (właśnie @ergo podał link) ale tam była prostsza sprawa bo nie było ramek wiadomo każdy iframe zawiera własne źródło a wiec własny dokument i trzeba przeszukać te dokumenty coś w stylu:

var
  doc, doc2: IHTMLDocument2;
  frames: IHTMLFramesCollection2;
  window: IHTMLWindow2;
  form: IHTMLFormElement;
  elem: IHTMLElement;
  dispatch: IDispatch;
  i, j, k: Integer;
  index: OleVariant;
begin
  doc:= WebBrowser1.Document as IHTMLDocument2;
  if Assigned(doc) then
  begin
    frames:= doc.frames as IHTMLFramesCollection2;
    if Assigned(frames) then
    begin
      for i:= 0 to frames.length - 1 do
      begin
        index:= i;
        dispatch:= frames.item(index);
        dispatch.QueryInterface(HTMLWindow2, window);
        if Assigned(window) then
        begin
          doc2:= window.document;
          for j:= 0 to doc2.forms.length -1 do
          begin
            form:= doc2.forms.item(i, EmptyParam) as IHTMLFormElement;
            for k:=0 to form.length - 1 do
            begin
              elem:= form.item(k, EmptyParam) as IHTMLElement;
              if (elem.tagName = 'INPUT') and ((elem as IHTMLInputElement).name = 'plik') then
              begin
                elem.click;
                exit;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;

Oczywiście w nowszych Delphi można by ten kod trochę skrócić ale w Delphi 7 nie ma zaimplementowanych wielu metod choćby GetElementByID. Jak masz nowsze Delphi to możesz sobie ten kod trochę zoptymalizować chodzi o to że musisz pobrać dokument z ramki i w nim dopiero szukać tego input.

0

Słowo klucz to było: frames - ramki

dzięki kazek - proszę zaznaczyc powyzszy post jako rozwiazanie problemu, pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1