nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Python + Selenium + ChromeでGoogleの検索を自動化する [非headlessモード][XPath]

はじめに

本記事は、Python + Selenium + ChromeGoogleの検索を自動化する手法について記載したものです。

今回は、XPathを使用して、検索を行います。

XPathとは

XPathXML文章中の要素、属性値などを指定するための言語です。 XPathではXML文章をツリーとして捉えることで、要素や属性の位置を指定することができます。 HTMLもXMLの一種とみなすことができるため、XPathを使ってHTML文章中の要素を指定することができます。

(※記事記載時点(2019/10/17)では本記事のコードが動作することを確認していますが、Googleのデザイン等が変われば動作しなくなる可能性があります。ご了承ください)

環境

環境は以下のとおりです。パッケージの管理はAnacondaで実施しています。pythonコードの実行はjupyter Noteboookを使用しております。

  • OS : Windows 10 Pro
  • conda version : 4.7.12
  • conda-build version : 3.18.9
  • python version : 3.7.4.final.0
  • selenium : 3.141.0
  • ChromeDriver : 77.0.3865.40

XPathを用いた検索方法

XPathを用いた検索方法は、以下の記事で分かりやすく説明してあります。

本記事のサンプルコードでは、Full XPath(絶対XPathパス)を用いてWebページの要素を取得しています。

XPathを用いれば、以下のように、要素にID指定やclass名指定がなくても、テストしたいページのタグ構成から要素を掴むことが可能です。

element = driver.find_element_by_xpath("/html/body/form[1]")

XPathを用いて、要素を操作する処理は何度も繰り返すと思いますので、関数化するとよいと思います。

# XPathを用いて、ボタンをクリックする
def click_button_using_XPath(element_XPath : str):
    
    element = WebDriverWait(driver, MAX_WAIT_TIME_SEC).until(
        EC.presence_of_element_located((By.XPATH, element_XPath))
    )
    
    element.click()
    
    return element

サンプルコード

Googleの検索を自動化したコードです。検索文字列を入力してEnterキーを押した後、ニュースボタンを押します。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

MAX_WAIT_TIME_SEC = 100


# ChromeDriverのパスを引数に指定しChromeを起動
CHROME_DRIVER_PATH = "chromedriver.exe"
options = Options()

driver = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH, options=options)
driver.maximize_window() # 画面表示を最大化する

# 指定したURLに遷移する
web_site = 'https://www.google.com/'
driver.get(web_site )


# XPathを用いて、ボタンをクリックする
def click_button_using_XPath(element_XPath : str):
    
    element = WebDriverWait(driver, MAX_WAIT_TIME_SEC).until(
        EC.presence_of_element_located((By.XPATH, element_XPath))
    )
    
    element.click()
    
    return element

    
# XPathを用いて、テキストボックスに文字列を入力する
def input_textbox_using_XPath(element_XPath : str, send_code : str):
    
    element = WebDriverWait(driver, MAX_WAIT_TIME_SEC).until(
        EC.presence_of_element_located((By.XPATH, element_XPath))
    )
    
    # 検索テキストボックスをクリアする
    for item in range(0,100) :
        element.send_keys(Keys.BACK_SPACE)
                                 
    element.send_keys(send_code)
    
    return element

    
# テキストボックスに検索ワードを入力して、直後にEnterキーを押す
input_textbox_using_XPath("/html/body/div/div[4]/form/div[2]/div[1]/div[1]/div/div[2]/input", "test").send_keys(Keys.RETURN)


# ニュースボタンを押す
click_button_using_XPath("/html/body/div[7]/div[3]/div[5]/div/div/div[1]/div/div/div[1]/div/div[2]/a")


driver.close() # ウィンドウを閉じることが出来ます。閉じることが出来るのは引数にブラウザのバイナリを指定したインスタンスウインドウのみ

driver.quit() # 「quit」を実行することで全てのウィンドウを閉じることが出来ます。

リンク

Seleniumを安定稼働させるために行うべき3つの設定(Headlessモードにも対応) | たぬハック