地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

selenium小技 (プロキシ/ヘッドレス)

qiita.com

この記事は「Python Advent Calendar 2021」の記事です。

selenium-logo-150x150.png

背景

seleniumで色々作業した時に得た知見のメモ

↓導入方法 ■ Selenium WebDriverのインストール~動かしてみる

ちなみにpythonならこんな感じで爆速で始めることも可能

$ pip install selenium

# または
$ conda install selenium

ベース

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()

起動オプション

--headlessを付与することでヘッドレスモードで起動可能

options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

--no-sandboxを付与することでサンドボックス外で動作

options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)

プロキシ設定

option.add_argument('--proxy-server=http://%s' % PROXY)
option.add_argument('--proxy-auth=%s' % PROXY_AUTH)
driver = webdriver.Chrome(options=options)

既存のウィンドウの新しいタブで開くのではなく新しいウィンドウで開くように設定

options.add_argument('--new-window')
driver = webdriver.Chrome(options=options)

onclick属性で発火されるjsを実行する

seleniumでボタン系の自動化してるときのあるあるらしい。 jsを実行させたい場合はボタンクリックとかせずとも下記のように直接実行が可能

browser.execute_script('javascript:hogehoge();')

iframeをスイッチ

iframe = driver.find_element_by_id('wpnt-notes-iframe2')
# 取得したインラインフレームにスイッチ
driver.switch_to.frame(iframe)

quitとexitの違い

「driver.close()」 アクティブになっているタブのみ終了。

「driver.quit()」 すべてのタブを閉じてブラウザを終了。

docker-selenium

seleniumはまっさらな状態から入れるとなるとちょっと面倒な手順が必要です。 dockerみたいな感じでさくっと使えるかなと思って調べたら存在しました。

docker-selenium 使って見た

VNCを使ってその内部でchromeを動かしそこで動作させてるようです。 ファイルの共有なんかもdockerの知識さえあれば簡単に行えてとても便利そうです。

VNC用のコンテナとブラウザテスト用のコンテナを用意することで開発環境とは分離されたテスト環境もこんな感じでさくっと用意できますね。

version: '3.7'

services:
  chrome-server:
    build:
      context: ./chrome
      dockerfile: Dockerfile
    container_name: 'chrome-server'
    hostname: 'chrome-server'
    ports:
      - 9000:5900
      - 4444:4444
    environment:
      - 'TZ=Asia/Tokyo'
      - 'HUB_PORT_4444_TCP_ADDR=hub'
      - 'HUB_PORT_4444_TCP_PORT=4444'
    volumes:
      - ./chrome/downloads:/root/Downloads
  py-server:
    build:
      context: ./py-server
      dockerfile: Dockerfile
     container_name: 'py-server'
     hostname: 'py-server'
     environment:
       - 'TZ=Asia/Tokyo'
     tty: true
     depends_on:
       - chrome-server
     volumes:
       - ./py-server/src:/app/src
       - ./py-server/images:/app/images
     env_file:
       - app.env

ブラウザテスト環境がdockerで完結してしまうのはとても便利です。

参考

chrome 起動オプション【Python】Seleniumでiframeの内容を操作するChrome DevToolsを使いこなそう! Web開発に必須なブラウザ開発ツールによるデバッグの基本