プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、python3、ラズパイなど。

C#でもSeleniumは使える

以前pythonでブラウザの自動制御を試しましたが、その時使ったseleniumは他のプログラミング言語にもパッケージが提供されています。
s51517765.hatenadiary.jp
s51517765.hatenadiary.jp

そこで、C#seleniumを使ってみました。

Visual Studioseleniumを設定する

Visual Studioで「プロジェクト¥NuGetパッケージの管理」を開きます。
f:id:s51517765:20190211181318j:plain
「参照」から"selenium"を検索します。
f:id:s51517765:20190211181445j:plain

必須となるのは以下の二つです。(ここではChromeを使いましたが、他のブラウザの場合は対応するもの)

これに以下の二つを追加しました。

Amaz〇nでログインして検索してTwitterに投稿する

実際にコードを書いていきます。
インスタンスをclass form1の直下で作成します。

    public partial class Form1 : Form
    {
        ChromeDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
   }

cssのid名で目的の入力フォームを探してテキストを送信します。

f:id:s51517765:20190211184540j:plain

        private void login()
        {
            var auth = new auth();  //別のクラスファイルにメールアドレスとパスワードを記録
            string email = auth.email;
            string password = auth.password;

            //ログイン
            string url = "https://www.amaz〇n…"; //長いので省略
            driver.Url = url;  // 上記urlに移動
            Thread.Sleep(1000);

            driver.FindElementById("ap_email").SendKeys(email); //css idで入力フォームを探す
            driver.FindElementById("ap_password").SendKeys(password);
            driver.FindElementById("signInSubmit").Click();
        }


このあたりは、以前pythonで作ったものをC#に変換しました。
何となく、似たような書き方でちょっと違う、という感じになっています。

これは、pythonスネーク記法C#アッパーキャメル記法となっているからです。

idで要素が見つけられないときは、XPathで対応します。Xpathならどのような要素でも対応可能です。
XPathChromeFirefoxの右クリックメニューから見つけることができます。
Chromeでは、右クリックの「検証」からHTML部分の右クリックで「Copy¥Copy XPath」を選択します。
Firefoxでは、右クリックの「要素を調査」からHTML部分の右クリックで「コピー¥Xpath」を選択します。

どうやら、このようにして取得できるXPathFirefoxのほうがHTML階層の最上位からの絶対Pathとなっておりうまく動作しやすいようです。

f:id:s51517765:20190211184955j:plain
キーワード検索をし、一つ目の検索結果を開きます。

 string resultNo = "result_0"; //検索結果の1番目
                if (keyword[i] != "")
                {
                    driver.SwitchTo().Window(driver.WindowHandles.First()); //一つ目のタブ
                    string curentUrl = driver.Url;
                    driver.FindElementById("twotabsearchtextbox").Clear();
                    driver.FindElementById("twotabsearchtextbox").SendKeys(keyword[i]);
                    Thread.Sleep(1000);
                    driver.FindElementById("twotabsearchtextbox").SendKeys(OpenQA.Selenium.Keys.Return);                   
                    Thread.Sleep(1000);

                    while (driver.FindElement(By.Id(resultNo)) == null) ; // using OpenQA.Selenium;
                    Thread.Sleep(1000);
                    driver.FindElementById(resultNo).Click();
                    driver.SwitchTo().Window(driver.WindowHandles.Last()); //最後に開いたタブ
                    twitter();
                }

f:id:s51517765:20190211184711j:plain
Twitterに投稿します。
Twitterにログインしているかどうかを取得したかったのですが、うまくいかなかったのでログインしていないものとしてTryし失敗したらログインしているものとしてツイートボタンを押します。

        private void twitter()
        {
            var auth = new auth();
            string twitter = auth.twitter;
            string tw_password = auth.tw_password;
            Thread.Sleep(3000);
            driver.FindElementByXPath("//*[@id='amzn-ss-twitter-share']/div/a/i").Click();
            Thread.Sleep(1000);
            driver.SwitchTo().Window(driver.WindowHandles.Last());
            string text = driver.FindElementById("status").Text;
            text = text.Replace("@さんから", "");
            text = text.Replace("を Amazon でチェック!", "");
            textBoxLog.AppendText(text + "\n");

            try
            {
                try
                {   //Loginしてないとき
                    driver.FindElementById("username_or_email").SendKeys(twitter);
                    driver.FindElementById("password").SendKeys(tw_password);
                    driver.FindElementByXPath("/html/body/div[2]/form/div[3]/fieldset[2]/input").Click();
                }
                catch
                {
                    //Loginずみ
                    driver.FindElementByXPath("/html/body/div[2]/form/div[3]/fieldset/input").Click(); //XPathはfirefoxで調べる
                }
            }
            catch
            {
                textBoxLog.AppendText("Tweet Error!" + "\n");
                driver.Close(); //タブを閉じる
            }
        }

動作結果

f:id:s51517765:20190214203627j:plain


ソース

github.com