見出し画像

【C#】seleniumを使って自動売買ソフトを作ろう-4

【挨拶】

前回は値の取得まで行いましたね。そこまでならスクレイピングなども出来ますが、今回はさらにWEBの操作に関わる部分を作成していきたいと思います

【プロジェクトにボタンを追加】

前回と同じ要領でボタンを一つ追加してください

今度はログインを自動で行う処理を作成しましょう

【inputの値変更】

次はログインフォームのinputタグにログイン情報を入力する所から始めましょう

要素を前回の要領で調べてもらうと、IDが付与されているのが分かります

ですので、seleniumを扱いinputに値を入れるとなると

this.chromeDriver.FindElementById("j_username").SendKeys("hoge");

こうなります。これは指定した要素に対して、キーボードから"hoge"という文字列を打ち込む挙動となります。ですので、打ち込む文字数によっては時間がかかります

ですので、もう一つの方法として存在するjavascriptを使って操作する方法で、inputに情報を打ち込みましょう

this.chromeDriver.ExecuteScript("document.getElementById('j_username').value = 'hoge';");

javascriptを扱うメソッド関数に渡す引数は、javascriptの書き方そのままで大丈夫です。プロジェクトで両方の動作を見比べてもらえば、速さの違いがよく分かると思います

【buttonのクリック動作】

フォームは値を変更した後、送信しなければいけません

このサイトのログインボタンはID要素がないので、name要素をキー取得を行いclickメソッドを呼び出しましょう

this.chromeDriver.FindElementByName("LoginForm").Click();

これでフォームが送信され、ログイン(IDとPWがただしければ)が行われます。

総合すると、こういう書き方でログイン処理ができます。ただ要素に値を反映するにはタイムラグがあったりますので、sleepをかましたりして正しく動作するように調整したりします

/// <summary>
/// ログイン処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
    this.chromeDriver.ExecuteScript(@"
        document.getElementById('j_username').value = 'hoge';
        document.getElementById('j_password').value = 'hogehoge';
    ");
    System.Threading.Thread.Sleep(100);
    this.chromeDriver.FindElementByName("LoginForm").Click();
}

イベントの中身は以上となります

【終わりの挨拶】

javascriptの事を熟知されてる方は、scriptを直接投げた方が楽かと思います。ただ、どこまで正しく動作したかなどを判別するにはseleniumのIwebElementを使った方が便利かと思います。その使い分けで扱いやすいプロジェクトを作っていただければと思います

だいたいの説明は出来ましたので、今までの処理を扱いやすくした便利クラスを配布したいと思います。

次回は実際にデモでエントリーする部分などを説明する予定です

【リンク】

前回の記事

⇒次回の記事(未定)

便利クラス

【サンプルソース】

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

        /// <summary>
        /// ログイン処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            this.chromeDriver.ExecuteScript(@"
                document.getElementById('j_username').value = 'hoge';
                document.getElementById('j_password').value = 'hogehoge';
            ");
            System.Threading.Thread.Sleep(100);
            this.chromeDriver.FindElementByName("LoginForm").Click();
        }
    }
}

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