edo1z blog

プログラミングなどに関するブログです

Python3 - Seleniumの使い方

Selenium http://www.seleniumhq.org/

作業環境

私の環境は、下記です。 Windows10 Python3.5 Firefox 51.0.1 Chrome 56.0 ChromeDriver 2.27

Selenium WebDriver

SeleniumRCはJavascriptでブラウザを操作してたけどセキュリティ的に難しくなってSelenium WebDriverが主流になったそうです。WebDriverはブラウザの拡張機能やOSのネイティブ機能などを利用して操作するそうです。ブラウザのドライバに対して、JSON Wire ProtocolでHTTPリクエストを行うとブラウザが操作できるます。ドライバは各ブラウザ毎に異なります。

ドライバに対するリクエストは、一般的には各種プログラミング言語で作成します。使える言語は、公式だと、Java、Ruby、Python、C#、Javascript、PHP、Perlだそうです。その他非公式であったりするそうです。私はPythonでやってみようかなと思います。

Python用Seleniumモジュールをインストールする

pipでインストールできます。

$ pip install -U selenium

Python用のseleniumのAPIのドキュメントはここです。

chromeドライバのインストールと設定

Chrome Driverはこのページでダウンロードできます。ChromeDriver 2.27のchromedriver_win32.zipをダウンロードしました。展開して、chromedriver.exeを任意のフォルダに配置し、そのフォルダにパスを通しておきます。

Fireboxドライバのインストールと設定

Firefoxはブラウザをインストールしてあればドライバが使えると色々なところに書いてはあったのですが、Firefoxの新しいバージョンではそうでもないらしく、実際自分もエラーになってしまいました。下記のようなエラーが出る場合、ドライバが有効になっていない可能性があります。

AttributeError: 'Service' object has no attribute 'process'

上記のような場合は、ここからドライバをダウンロードしてみます。私は、geckodriver-v0.14.0-win64.zipをダウンロードして展開して、上記のchromeと同様に任意のフォルダにgeckodriver.exeを配置し、そのフォルダにパスを通しました。これで、Firefoxも動作するようになりました。

PythonでSeleniumを操作してみる

ブラウザを起動してURLを開く

from selenium import webdriver

#Firefox
fire = webdriver.Firefox()
fire.get('http://google.com')

#Chrome
chro = webdriver.Chrome()
chro.get('http://google.com')

要素の選択、入力、クリック

Googleに検索ワードを入力して検索ボタンを押すことで検索結果ページに遷移させてみます。

from selenium import webdriver

#Firefox
fire = webdriver.Firefox()
fire.get('http://google.com')
input = fire.find_element_by_id('lst-ib')
input.send_keys('Selenium Python3')
btn = fire.find_element_by_name('btnK')
btn.click()

#Chrome
chro = webdriver.Chrome()
chro.get('http://google.com')
input = chro.find_element_by_id('lst-ib')
input.send_keys('Selenium Python3')

chromeの場合は、検索ワードを入力したら勝手に検索結果のページに遷移したので、btnを取得・クリックしていません。

ログイン

上記と同じですが、ログインもしてみます。Twitterにログインします。

from selenium import webdriver

tw_user = 'hoge@hoge.com'
tw_pass = 'passwordpassword'

#Firefox
fire = webdriver.Firefox()
fire.get('https://twitter.com')
login = fire.find_element_by_class_name("StreamsLogin")
login.click()
input_user = fire.find_element_by_name('session[username_or_email]')
input_pass = fire.find_element_by_name('session[password]')
input_user.send_keys(tw_user)
input_pass.send_keys(tw_pass)
btn = fire.find_element_by_class_name('submit')
btn.click()

#Chrome
chro = webdriver.Chrome()
chro.get('https://twitter.com')
login = chro.find_element_by_class_name("StreamsLogin")
login.click()
input_user = chro.find_element_by_name('session[username_or_email]')
input_pass = chro.find_element_by_name('session[password]')
input_user.send_keys(tw_user)
input_pass.send_keys(tw_pass)
btn = chro.find_element_by_class_name('submit')
btn.click()

問題なくログインできるのですが、getでURLを開くと全て読み込むまで次に進まないようで、ログインボタンをクリックするまでにやたらと待たせれる点がいやです。解決方法があるか今度確認します。

参考: 第1回 Seleniumの仕組み Seleniumとは―読み方、意味、WebDriverの使い方 Selenium Web DriverのPythonバインディングを使ってブラウザを操作する 5分でわかるSelenium IDEの使い方 Python で Selenium WebDriver を使ったブラウザテストをする方法 Webブラウザの自動操作 (Selenium with Rubyの実例集)