rubyとseleniumでTwitterに自動ログインする。〜リベンジ編
SeleniumでTwitterの自動ブラウザ操作を行っていきたいです。
以前設定していたのですが、しばらくしてみると、そのコードでは対応できなくなっていました。
require 'selenium-webdriver' driver = Selenium::WebDriver.for :firefox driver.get "https://twitter.com/login"
ここまでで以下の画面になります。(firefoxのdriverなどの設定が別途必要だった気がしますが)
このメールアドレスとパスワードに値を自動で挿入してログインボタンをクリックしてログインしたいと思います。
まずは、フォームから。
開発者ツールで、この要素を見てみると、次のようになっています。
要素は
<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
となり、エラーになってしまいました。
qiitaでやってみたらうまく行ったので、TwitterのCSSの問題なのか、それとも単にハッシュみたいな書き方に対応していないのか。
と思ったら、以前書いてたコードでは普通に
driver.find_element(:name, "session[password]").send_key "password"
のような形で書いていたので、おそらくCSS側の問題ですね。
解決策として、xpathを指定してあげたら、どうもうまくいきました。
xpathは開発者ツールで秒速で見つけられます。
我らがfirefoxですね。
...おっと、firefoxではできませんでした。(探せば見つかるはずだけどめんどい)
ということで、我らがchromeで
与沢翼も裸足で逃げ出すくらい秒速でした。
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のコード下の記事にあります。