【C#】seleniumを使って自動売買ソフトを作ろう-3
【挨拶】
前回はブラウザを開く部分まで行ったので、今回はUIを駆使して操作する方法をお伝えします。またウェブ上の文字列を取得する方法をお教えします
【プロジェクトにボタン追加】
フォームをクリックして、左側のツールボックスからボタンを追加して
こんな風に三つぐらい追加しておいてください
その後はボタンをダブルクリックして、クリックイベントを追加させましょう。やり方がよくわからない方はググってください
【ブラウザを開くイベント設定】
前回記述したドライバークラスですが、このままだとローカル参照しかできないので、クラスのメンバーにして参照できるようにしましょう
public partial class Form1 : Form
{
/// <summary>
/// ドライバークラス
/// </summary>
private OpenQA.Selenium.Chrome.ChromeDriver chromeDriver;
その後は一個目のボタンにイベントの内容を前回書いたTestActionの中身を丸々持ってきましょう
/// <summary>
/// ブラウザを開く処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//クロームの設定の用意
var chromeOptions = new OpenQA.Selenium.Chrome.ChromeOptions();
chromeOptions.AddArgument("--disable-application-cache"); //終了時にキャッシュ削除
chromeOptions.AddArgument("--disable-extensions"); //デベロッパー機能を無効にするポップアップを非表示(これをしないと鬱陶しい)
chromeOptions.AddArgument("--start-maximized"); //最大画面サイズで開く(これはお好み)
//chromeOptions.AddArgument(String.Format("--window-size={0},{1}",100, 100)); //大きさを指定する場合
//chromeOptions.AddArgument(String.Format("--window-position={0},{1}", 10, 10)); //位置を指定する場合
//パス指定直書きが面倒なので、実行ファイル以下にchromedriver.exeが無いか探してパス指定させる
string[] files = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "chromedriver.exe", System.IO.SearchOption.AllDirectories);
if (files.Length == 0) throw new Exception("chromedriver.exeがありません");
//ドライバーの割り当て用意
var chromeDriverService = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService(System.IO.Path.GetDirectoryName(files[0]), "chromedriver.exe");
chromeDriverService.HideCommandPromptWindow = true; //こうすることで、起動時のプロンプトウインドウを非表示にできる
//ブラウザ起動
this.chromeDriver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, chromeOptions);
}
【URLを開くイベント設定】
ここでは例としてGMOクリック証券のサンプルレートが表示されているURLに移動しましょう
/// <summary>
/// URL移動する処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
this.chromeDriver.Url = "https://www.click-sec.com/corp/guide/fxneo/";
}
メンバー変数にドライバークラスがあるので、アクセスも簡単ですね
【値を取得するイベント設定】
値を取得する場合は、まずその要素がどのようなDOMか把握しておく必要があります。まずはサンプルページに移動してください
例としてクロームで説明します
まずはF12キーを押してデベロッパーモードを開いてください
お次に図のように要素を選択するモードにして、調べたい要素をクリックしてください。(ボタンの名前分からない…)
すると簡単にHTMLが解析できます。今回取得したい、USD/JPYのBID値にはIDが付いていましたね。IDは基本的に一意なので、要素の検索が楽に行えます
余談: seleniumを使う際は少しでもhtmlとjavascriptの知識があれば、楽になります。
このIDを使って、値を取得しましょう
/// <summary>
/// 値を取得する処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
//ID指定で要素を取得
var bid_elm = this.chromeDriver.FindElementById("fxneoBid_0");
//値をアラートに表示
MessageBox.Show(bid_elm.Text);
}
値を取得する場合は、まずはDOM要素を取得しなければなりません
ドライバークラスにはID指定だったり、クラス指定だったりで取得できますので今回はID指定で取得しましょう。
要素を取得した後は、テキストメソッドで値を取得できます。上手くいけば、下記の画像のようになるのではないでしょうか?
【終わりの挨拶】
今回はUIを使っての値取得までを説明しました。値取得のボタンを押す度、値を取得し直してるのが確認できればと思います
ただ注意点なのが、値を取得する際は必ず画面のロードが終わってからにしてください。DOM要素が読み込めてないと、値は取得できません
次回はjavascriptを投げて、WEB上のボタンを操作する部分を行います。お楽しみに
【リンク】
【サンプルソース】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
/// <summary>
/// ドライバークラス
/// </summary>
private OpenQA.Selenium.Chrome.ChromeDriver chromeDriver;
public Form1()
{
InitializeComponent();
this.FormClosing += Form1_FormClosing;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName("chromedriver");
foreach (System.Diagnostics.Process p in ps)
{
//プロセスを強制的に終了させる
p.Kill();
}
}
catch { }
}
/// <summary>
/// ブラウザを開く処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//クロームの設定の用意
var chromeOptions = new OpenQA.Selenium.Chrome.ChromeOptions();
chromeOptions.AddArgument("--disable-application-cache"); //終了時にキャッシュ削除
chromeOptions.AddArgument("--disable-extensions"); //デベロッパー機能を無効にするポップアップを非表示(これをしないと鬱陶しい)
chromeOptions.AddArgument("--start-maximized"); //最大画面サイズで開く(これはお好み)
//chromeOptions.AddArgument(String.Format("--window-size={0},{1}",100, 100)); //大きさを指定する場合
//chromeOptions.AddArgument(String.Format("--window-position={0},{1}", 10, 10)); //位置を指定する場合
//パス指定直書きが面倒なので、実行ファイル以下にchromedriver.exeが無いか探してパス指定させる
string[] files = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "chromedriver.exe", System.IO.SearchOption.AllDirectories);
if (files.Length == 0) throw new Exception("chromedriver.exeがありません");
//ドライバーの割り当て用意
var chromeDriverService = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService(System.IO.Path.GetDirectoryName(files[0]), "chromedriver.exe");
chromeDriverService.HideCommandPromptWindow = true; //こうすることで、起動時のプロンプトウインドウを非表示にできる
//ブラウザ起動
this.chromeDriver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, chromeOptions);
}
/// <summary>
/// URL移動する処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
this.chromeDriver.Url = "https://www.click-sec.com/corp/guide/fxneo/";
}
/// <summary>
/// 値を取得する処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
//ID指定で要素を取得
var bid_elm = this.chromeDriver.FindElementById("fxneoBid_0");
//値をアラートに表示
MessageBox.Show(bid_elm.Text);
}
}
}