【Python】【Selenium】Google-Chrome によるサンプル集

Python3 + Selenium 使用メモ

  • OS
    • Ubuntu 18.04
  • ブラウザ
    • Google-Chrome
  • ドライバ
    • Chromedriver 2.43

 

 

Selenium 実行時に Xvfb を起動させる

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.alert import Alert
import os
import sys
import subprocess

try:
  # Xvfb プロセスが存在するか?
  subprocess.check_output('pidof Xvfb', shell=True)
except subprocess.CalledProcessError as e:
  # Xvfb プロセスが存在しない場合は起動させる
  subprocess.Popen('Xvfb -ac :99 -screen 0 1280x1024x16', shell=True)
  pass
finally:
  # DISPLAY=:99 と設定する
  os.environ['DISPLAY'] = str(':99')
  pass

# これ以降、Selenium で動作させたい処理を書く

 

データのダウンロード先を /tmp/DL に変更する

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.alert import Alert

# --snip--

prefs = {"download.default_directory" : "/tmp/DL" }
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_experimental_option("prefs",prefs)
chromeOptions.add_argument('--headless')
chromeOptions.add_argument('--disable-gpu')
chromeOptions.add_argument('--ignore-certificate-errors')

URL = "https://www.msn.com/ja-jp"

driver = webdriver.Chrome(chrome_options=chromeOptions)

try:
    driver.get(URL)
    driver.save_screenshot('/tmp/debug_entry.png')
# 以下処理を書いていく

 

HTML に記載されている ID を使って操作する場合。

下記 HTML に書かれている ユーザ、パスワード欄に各値を入力し、Submit ボタンを押すという内容である。
HTML

<tr>
    <td>
        <span id="LABEL_USER_ID">ログインID:</span>
    </td>
    <td align="left">
        <input name="USR_ID" type="text" maxlength="24" id="USR_ID" />
    </td>
</tr>
<tr>
    <td>
        <span id="LABEL_USR_PASS">パスワード:</span>
    </td>
    <td align="left">
        <input name="USR_PASS" type="password" maxlength="24" id="USR_PASS" value="" />
    </td>
</tr>
<tr>
    <td colspan="2" class="style1">
        <input type="submit" name="BTN_LOGIN" value="ログイン" id="BUTTON_LOGIN" style="height:48px;width:240px;" />
    </td>
</tr>

Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.alert import Alert
import time
import sys

# -- snip --

driver = webdriver.Chrome(chrome_options=chromeOptions)

try:
    nameField = driver.find_element_by_xpath("//*[@id='USR_ID']")
    nameField.send_keys('neko')
    time.sleep(1)

    passField = driver.find_element_by_xpath("//*[@id='USR_PASS']")
    passField.send_keys('mike')
    time.sleep(1)

    submitButton  = driver.find_element_by_xpath("//*[@id='BUTTON_LOGIN']")
    submitButton.click()

 

name を使ってボタンを押す

HTML

<input type="file" name="FILE_UPLOAD" id="FILE_UPLOAD" style="height:24px;width:90%;" />

 
Python
name を使ってファイルのアップロードボタンを押す。
アップロードするファイルに /home/neko/xx.data を指定する。

driver = webdriver.Chrome(chrome_options=chromeOptions)

try:
    upload = driver.find_element_by_name("FILE_UPLOAD")
    upload.send_keys("/home/neko/xx.data")

 

SSL 警告を無視する

自作サーバなどでCA認証局が無い場合にブラウザに警告が表示されるが、その警告を無視するためのオプション。

chromeOptions.add_argument('--ignore-certificate-errors')

driver = webdriver.Chrome(chrome_options=chromeOptions)

 

アラートメッセージが表示されるので「OK」を押す場合

ボタン押下後にアラートメッセージが表示されて「OK」ボタンを押す

    driver = webdriver.Chrome(chrome_options=chromeOptions)

    # ボタンを押下する
    submitButton  = driver.find_element_by_xpath("//*[@id='BUTTON_OK']")
    submitButton.click()
    time.sleep(1)

    # ********************************************************
    # ここでアラートメッセージが表示されたものとする
    # ********************************************************
    alert = driver.switch_to.alert
    alert.accept()

    # ********************************************************
    # 連続でアラートメッセージが表示された場合は、以下のようにして OK を押す
    # ********************************************************
    Alert(driver).accept()

 

Javascript で書かれたリンク URL を押す

HTML

<a onclick="return ProcDone('https://example.com/DL/data/%12%34&amp;st=2000&amp;id=A');" 
    id="LINK_DOWNLOAD" href="javascript:PostDone('LINK_DOWNLOAD')">ダウンロードする</a>

 
Python
id="LINK_DOWNLOAD" を指定して onclick の処理を呼び出す。

    driver = webdriver.Chrome(chrome_options=chromeOptions)

    driver.find_element_by_id("LINK_DOWNLOAD").click()