やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

rubyとseleniumでTwitterに自動ログインする。〜リベンジ編

SeleniumTwitterの自動ブラウザ操作を行っていきたいです。
以前設定していたのですが、しばらくしてみると、そのコードでは対応できなくなっていました。

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get "https://twitter.com/login"

ここまでで以下の画面になります。(firefoxのdriverなどの設定が別途必要だった気がしますが)

f:id:benzenetarou:20171003222021p:plain

このメールアドレスとパスワードに値を自動で挿入してログインボタンをクリックしてログインしたいと思います。
まずは、フォームから。
開発者ツールで、この要素を見てみると、次のようになっています。

f:id:benzenetarou:20171003222056p:plain
要素は

<input class="js-username-field email-input js-initial-focus" name="session[username_or_email]" autocomplete="on" value="" placeholder="電話番号/メールアドレス/ユーザー名" type="text">

です。
ここで、seleniumの書き方に従って、 (classを指定する方法は確か失敗した気がします。。。もしくは一意なclassがなかったか。)

driver.find_element(:name, 'session[username_or_email')..send_key "user_name"

としても、

Selenium::WebDriver::Error::ElementNotInteractableError: Element is not visible

となり、エラーになってしまいました。
f:id:benzenetarou:20171003222301p:plain
qiitaでやってみたらうまく行ったので、TwitterCSSの問題なのか、それとも単にハッシュみたいな書き方に対応していないのか。
と思ったら、以前書いてたコードでは普通に

driver.find_element(:name, "session[password]").send_key "password" 

のような形で書いていたので、おそらくCSS側の問題ですね。

解決策として、xpathを指定してあげたら、どうもうまくいきました。

xpathは開発者ツールで秒速で見つけられます。 f:id:benzenetarou:20171003222817p:plain
我らがfirefoxですね。
...おっと、firefoxではできませんでした。(探せば見つかるはずだけどめんどい)
ということで、我らがchrome
f:id:benzenetarou:20171003222940p:plain
与沢翼も裸足で逃げ出すくらい秒速でした。

    driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/fieldset/div[1]/input').send_key "user_name"
    driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/fieldset/div[2]/input').send_key "password"
    driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/div[2]/button').click

こんな感じでログイン成功しました。

あとは煮るなり焼くなり好きにして状態ですね。

自動ファボ&RTのコード下の記事にあります。

benzenetarou.hatenablog.com