喫茶XRAYトップページ

[スレッド全体
]

[9134] エスパーは登場するのか返信 削除
2015/8/26 (水) 20:21:28 Mr.XRAY
あいかわらず,エスパーの登場を期待する質問がありますね.
そして,いつものように [典型的なパターン] です.

[chroniumのボタンをクリックするには?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201508/15080007.txt

質問者が提示した具体的なものは,下のコードだけです.
これだけの HTML コードでもウェブブラウザで表示できますけどね (^^;

<Button class="submit" >送信</Button>
http://mrxray.on.coocan.jp/Delphi/Others/this_is_a_button.htm


上の HTML では,ボタンをクリックしても何も起きません.
何も起きなければ,クリックの確認が面倒です.

そこで,以下のようにして,ボタンをタグ名を検索してクリックするテストをしてみました.
質問されている方の言う,class 名からでも,もちろん処理すれば可能です.
でも,ほとんど意味ないですけど,
もちろん,この下のテストも,実際にはほとんど意味はないです.
タグ名やクラス名からボタンを検出しなければならないなんて考えられませんから.

<Button class="submit" onClick="location.href='http://mrxray.on.coocan.jp/index.htm'">SEND</Button>


//=============================================================================
//  ブラウザコンポーネントに指定のHTMLを表示
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  URL : String;
begin
  URL := ExtractFilePath(Application.ExeName) + 'this_is_a_button.htm';
  Chromium1.Load(URL);
end;

//=============================================================================
//  HTMLコード内のbuttonタグの最初のタグ(0が1番目)のボタンをクリック
//  このコードは,JavaScriptを実行しているだけなので
//  JavaScriptを実行する部分を変更すれば,他のブラウザコンポでも使用可能
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LTagName : String;
  LJsText  : String;
begin
  if not Chromium1.Browser.HasDocument then exit;

  if Assigned(Chromium1.Browser.Mainframe) then begin
    LTagName := '''button''';
    LJsText  := 'document.getElementsByTagName(' + LTagName + ')[0].click();';
    Chromium1.Browser.MainFrame.ExecuteJavaScript(LJsText, 'about:blank', 0);
  end;
end;


興味ある方用に,プロジェクトをダウンロード可能にしています.EXE 付きです.
動作確認環境は,ソースコード内に書いてあります.
http://mrxray.on.coocan.jp/Delphi/zip/TChromium_ButtonClick.zip

下図が実行結果です.
下の図が [Button1] をクリックして,コードで [SEND] ボタンをクリックした結果です.

[9144] submit返信 削除
2015/8/29 (土) 12:35:44 Mr.XRAY
ところで,

> <Button class="submit" >送信</Button>

には submit というのがあります.
下のサンプルコードは Google の画面で,検索語句を入力して検索を開始
するものです.このコードにはボタンクリックのコードはありません.

submit の操作の場合,何かを submit (サブミット) するのが目的です.
submit というのは,この場合,検索を開始するというぐらいの意味と
考えていいと思います.
例えば,山の頂上に立ったことを「サブミットした」と言います.

しかし,submit するには何かしらの操作が必要です.
下のコードは,submit を Delphi のコードで実行するものと言えます.
Google の検索画面では,[Enter] キーでも検索を開始します.
でも,ボタンがあれば,GUI 的には便利です.
そのためにボタンがあると考えてもいいと思います.

「ボタンをクリック」すると言うことに固執してしまうと本質を見失うことが
あります.
本当は submit という操作が目的です.
当サイトのサンプルプロクラム集の各ページに [Hide Index]というボタンが
あります.これは,左ペインの目次を非表示にするのが目的です.
[Hide Index] というボタンをクリックするのが目的ではありません.
同じく,ダウンロードというボタンは,ファイルのダウンロードが目的です.

プログラムは「勝てば官軍,動けば正義」です.
その意味では,このスレッドで書いたコードのように,
「何が何でもボタンをクリックする」
でもいいとは思います.


//=============================================================================
//  ブラウザコンポーネントに指定のHTMLを表示
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  URL : String;
begin
  URL := 'https://www.google.co.jp/';
  EmbeddedWB1.Navigate(URL);
end;

//=============================================================================
//  Googleの検索画面に検索語句をセットして[Google 検索]ボタンをクリック
//  usesにMSHTML_EWBが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LiElement     : IHTMLElement;
  LiElementCol  : IHTMLElementCollection;
  LiFormElement : IHTMLFormElement;
  LMsgText      : String;
begin
  try
    //検索欄に文字列をセット
    LiElement := EmbeddedWB1.Doc3.getElementById('lst-ib');
    LiElement.setAttribute('value', 'Delphi', 0);

    //[Google 検索]ボタンをクリック
    //実際にはsubmitを実行する
    //したがって[Google 検索]ボタンが存在しなくてもsubmitは実行できる
    LiElementCol  := EmbeddedWB1.Doc2.forms;
    LiFormElement := LiElementCol.Item(0, 0) as IHTMLFormElement;
    LiFormElement.submit;
  except
    //細かいエラー処理は省略
    LMsgText := '操作できませんでした.';
    MessageBox(Handle, PChar(LMsgText), '操作結果', MB_ICONINFORMATION);
  end;
end;

//=============================================================================
//  [戻る]ボタン
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  EmbeddedWB1.GoBack;
end;

上のサンプルを含めて,これまでのサンプルもダウンロードのファイルに
追加しました.[ダウンロード] のボタンはありません(笑)
http://mrxray.on.coocan.jp/Delphi/zip/TChromium_ButtonClick.zip



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82