見出し画像

【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);
        }
    }
}

いいなと思ったら応援しよう!

Ryo Tsukuda
記事を読んでくださり、ありがとうございます 今後もお役に立てる記事を更新していく所存です よければサポートして頂けると嬉しいです 今後ともよろしくお願いいたします