以前pythonでブラウザの自動制御を試しましたが、その時使ったseleniumは他のプログラミング言語にもパッケージが提供されています。
s51517765.hatenadiary.jp
s51517765.hatenadiary.jp
Visual Studioでseleniumを設定する
Visual Studioで「プロジェクト¥NuGetパッケージの管理」を開きます。「参照」から"selenium"を検索します。
必須となるのは以下の二つです。(ここではChromeを使いましたが、他のブラウザの場合は対応するもの)
これに以下の二つを追加しました。
Amaz〇nでログインして検索してTwitterに投稿する
実際にコードを書いていきます。インスタンスをclass form1の直下で作成します。
public partial class Form1 : Form { ChromeDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)); }
cssのid名で目的の入力フォームを探してテキストを送信します。
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ならどのような要素でも対応可能です。
XPathはChromeやFirefoxの右クリックメニューから見つけることができます。
Chromeでは、右クリックの「検証」からHTML部分の右クリックで「Copy¥Copy XPath」を選択します。
Firefoxでは、右クリックの「要素を調査」からHTML部分の右クリックで「コピー¥Xpath」を選択します。
どうやら、このようにして取得できるXPathはFirefoxのほうがHTML階層の最上位からの絶対Pathとなっておりうまく動作しやすいようです。
キーワード検索をし、一つ目の検索結果を開きます。
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(); }
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(); //タブを閉じる } }
動作結果
伊藤 望 の Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus) を Amazon でチェック! https://t.co/gb9aMHPhhu @さんから
— プログラミング素人 (@s51517765) 2019年2月14日
川本安武 の OpenSSH[実践]入門 Software Design plus を Amazon でチェック! https://t.co/s7NNkG8WZs @さんから
— プログラミング素人 (@s51517765) 2019年2月14日