Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What are the problem?

Selenium2 + Python3 + Linux のメモ

はじめに

Selenium を使ってみるメモ。

環境

  • Linux x86-64 (Ubuntu)
  • Python3
  • virtualenv

仮想環境の作成

ホストの環境を汚さないように virtualenv で Python3 の仮想環境を作成します。

$ virtualenv -p `which python3` myenv
$ cd myenv
$ source bin/activate

(myenv) $ mkdir src
(myenv) $ cd src

Selenium のインストール

pip で Selenium をインストールします。

(myenv) $ pip install selenium
(myenv) $ pip list

動作テスト

2. Getting Started — Selenium Python Bindings 2 documentation からサンプルコードを持ってきて動作テストを速やかに行う。

(myenv) $ vi test.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

(myenv) $ python ./test.py

Firefox が起動してぶんぶん動くよ!(・∀・)ワーイ

クロスブラウザでWebページをテストする

firefoxdriver はデフォルトで入るらしいので Chrome 用のドライバも pip で入れる。

(myenv) $ pip install chromedriver

ローカルにテスト用のHTMLを作成。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Test</title>
</head>
<body>
    <h1>Test of Selenium2 with Python3</h1>
    <form action="" method="POST">
        <input type="text" placeholder="Your name" name="name" value="">
        <input type="submit" name="submit" value="Login">
    </form>
</body>
</html>

Clicker クラスを作成してクロスブラウザに対応。

#!/usr/bin/python3
# coding: utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class Clicker():

    def __init__(self, driver):
        self._driver = driver

    def run(self, url):
        self._driver.get(url)

        name = self._driver.find_element_by_name("name")
        name.send_keys('My name')

        submit = self._driver.find_element_by_name("submit")
        submit.submit()

        # self._driver.close()

firefox = Clicker(webdriver.Firefox())
chrome = Clicker(webdriver.Chrome('../chromedriver'))

url = 'file:///path/to/myenv/src/test.html'
firefox.run(url)
chrome.run(url)

Chrome のドライバーは仮想環境の影響かエラーが出た。ドライバーのパスを渡してあげると無事に動作。パスは仮想環境下の chromedriver を指定。

webdriver.Chrome('../chromedriver') # 相対パスは実行時に影響が出る

↑のように相対パスで指定してしまうと実行時の cd によって参照するパスが変わってしまうので、↓のように絶対パスを参照したほうが良いかもしれません。
(↓のコードは追記でテストしていません。参考までに)

import os

origin = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
driver_path = os.path.join(origin, 'chromedriver')

webdriver.Chrome(driver_path)

Chrome と Firefox で同一ページへの自動アクセスが可能になりました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
6
Help us understand the problem. What are the problem?