PythonでSeleniumを使う

Pythonを使ってSeleniumを操作する方法を忘れないようにまとめておきました。これで大体のことはできると思います。

必要なものをインストールする

pip install chromedriver-binary
pip install selenium

プログラムのはじめに書くやつ

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

# ブラウザーを起動
options = webdriver.ChromeOptions()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1200x600')
options.add_argument('--incognito')

driver = webdriver.Chrome(chrome_options=options)

各種処理

ブラウザを指定して起動

driver = webdriver.Chrome()

サイトにアクセス

#()の中にURLを''で囲んで指定する
driver.get()

ブラウザを終了させる

driver.quit()

現在のブラウザを閉じる

driver.close()

アクティブなウインドウに切り替え

driver.switch_to.window(driver.window_handles[1])

一番下までスクロールする

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

スクリーンショットをとる

#()の中に保存先のファイルを''で囲んで指定する
driver.save_screenshot()

ブラウザを更新する

driver.refresh()

現在のサイトのURLを所得

url = driver.current_url

現在のサイトのHTMLを所得

html = driver.page_source

ボタンをクリックする

.click()

文字を入力する

#()の中に文字を''で囲んで指定
.send_keys()

textを取得する

.text

テキストを削除する

.clear

idで取得

#()の中にidを''で囲んで指定
driver.find_element_by_id()

classで取得

#()の中にclassを''で囲んで指定
driver.find_element_by_class_name()

nameで取得

#()の中にnameを''で囲んで指定
driver.find_element_by_name()

txtNameというidを指定してPythonという文字を入力する

driver.find_element_by_id('txtName').send_keys('Python')

btnAというnameを指定してクリックする

driver.find_element_by_name('btnA').click()

要素を指定して探す

from selenium.webdriver.common.by import By
#idがsrchtxtのものを上から1つ探す
driver.find_element_by_xpath("//*[@id='srchtxt']")
driver.find_element(By.XPATH, "//*[@id='srchtxt']")

#idがsrchtxtのものを全て探す
driver.find_elements_by_xpath("//*[@class='srchtxt']")

#aタグのclassがbtnNormalのものを見つける
driver.find_element_by_xpath("//a[@class='btnNormal']")

待機

Webサイトではajaxを使用してページを読み込んでから画面を書き換えるといったことが行われているものもある。 Seleniumは要素が存在しない状態で参照した場合に、NoSuchElementExceptionを発生させるので、それを回避するためにSeleniumで待機処理を行う。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get('https://www.yahoo.co.jp/')
#指定された要素(id=myDynamicElement)が表示状態になるまで待機する
element = WebDriverWait(driver, 10).until( expected_conditions.presence_of_element_located((By.ID, "myDynamicElement")) )

この処理では、最大10秒間指定した要素が存在するまで待機します。 存在しない間、デフォルトでは0.5秒ごとに要素が存在するか確認しています。

driver.implicitly_wait(10)

指定した待ち時間(10秒)の間、要素が見つかるまで(ロードされるまで)待機させる方法です。 デフォルトでは0になっていますが、設定すると各処理で待機処理をしなくて済むので便利になります。

urlが変わったら次の操作に移行する。

if 'https://vcard.ameba.jp/raid/boss/discovery-animation?eventId=' in driver.current_url:
  print("True")
  driver.get('https://vcard.ameba.jp/raid/quest/detail?eventId=76')
else:
  print("False")
  pass

対象が画面に表示されるまで、最大30秒待つ

try:
  element = WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#target img")) )
  #以降の処理を記述していく
except TimeoutException:
  #30秒経っても対象が表示されなかった場合、エラーログをprintして、続きのプログラムに移行
  print("Assert: 対象物がページにありませんでした index[" + n + "] URL:" + url)

要素が存在するならクリックする。もし存在しないなら他の処理をする。

try:
  #div要素のclassがjs_attackBtnが存在するならばクリックする
  #存在しないならexcept以下の処理を行う。
  driver.find_element_by_xpath('//div[@class="js_attackBtn"]')
  driver.find_element_by_xpath('//div[@class="js_attackBtn"]').click()
  print("ボタンが存在するよ")
except:
  print("ボタンが存在しないよ")
  driver.find_element_by_id("canvas").click()