uitspitss blog

プログラミングと音楽とエッセイ ※記載内容は個人の見解であり、所属する組織とは一切関係がありません。

python + selenium + phantomjs で楽をする

最近、書いてきたプログラムの再利用性を高めるために、備忘録を書きたくなった。
第一段として、私が一昨年、お世話になったseleniumの備忘録です。

ウェブページのテスト自動化などでよく使われるseleniumpythonから使うと、利便性が上がる。
そして、ここにphantomjsを足すと、GUIを介さずにseleniumが使えて、利便性がさらに上がる。

ということなので、現時点(2016/04/15)での備忘録を残す。

環境

seleniumのインストール

pip install selenium

phantomjsのインストール


2017/11/21追記 ここから

初掲時、この追記文の後に書いているように、npmでphantomjsをインストールする方法を書きましたが、 バイナリを落としてきて、スクリプト内で指定した方がお手軽だったので、そちらの方法も追記しておきます。

  1. Download|PhantomJSのページからそれぞれの環境に合わせたphantomJSのバイナリファイルを落としてくる。
  2. 展開したフォルダの中のbinフォルダ内のphantomjs(windows版はphantomjs.exe)を下のスクリプトと同じ階層に入れる。
  3. プログラムのところで載せているコードのdriverの部分のコードを以下のようにする。
    driver = webdriver.PhantomJS(
        executable_path='./phantomjs'
    )
  1. これでphantomjsのインストールは終わりです。

2017/11/21追記 ここまで


npm install -g phantomjs

phantomjsのインストール後は、"source ~/.bashrc"などで、パスを通しておくのを忘れずに!

※私の環境では、これでphantomjsのインストールが上手くいったのだけど、調べていたところ、
これで上手くいかない人もいたよう…(nodeのバージョン違いが原因だとは思うけど)。
その場合には、npm install -g phantomをすると上手くいったという人もいた。

プログラム

#!python
#-*-coding:utf-8-*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys as keys
import time

def main():
    url = "https://www.google.co.jp/"
    word = "日本"

    driver = webdriver.PhantomJS()
    driver.get(url)

    print(driver.current_url)

    # print(driver.page_source) # page_source

    # input searching words
    input_word = driver.find_element_by_css_selector("input.lst")
    input_word.send_keys(word)
    input_word.send_keys(keys.ENTER)

    time.sleep(2)

    driver.save_screenshot("test.jpg") # capture result page
    driver.quit()

    print("end")


if __name__ == '__main__':
    main()

動作内容は、google.co.jpにアクセスして、"日本"を検索し、ページ遷移する。
そして、そのページのスクショをtest.jpgとして保存する。
test.jpgはこんな感じ↓ f:id:uitspitss:20160415192315j:plain

chromeの Developer Tools とかで、該当箇所の情報を確認して、
find_element_by_css_selector(複数該当がある場合は、find_elements_by_css_selector)
に指定したら、ほとんどの要素のセレクトは大丈夫な気がする。
ただし、今回OSXでプログラムを書いてたら、chromegoogle.co.jpにアクセスしたときと、
phantomjsでgoogle.co.jpアクセスしたときで、idとclassが違っていたため、エラーを何度か吐かれた。
そのときには、コメントアウトしている"driver.page_source"で確認してみると原因が分かるかも…