Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Python】Seleniumによるスクレイピングでのフレーム切り替え方法(SeleniumVer4.6以降)


 

 

seleniumを使用してWeb情報取得、操作を行っている場合に必要となることの1つにフレーム間移動があります。

 

Webサイトがフレーム構造となっており、親フレーム、子フレームなどの階層構造になっている場合があります。

 

そのような場合に該当する要素の情報取得や操作を行う場合には、その要素が存在しているフレームまで移動してから取得、操作を行う必要があります。

続きを読む

【Python】Selenium4での「'WebDriver' objects has no attribute 'find_element_by_name'」などのエラーについての対処方法(SeleniumVer4.6以降)

 

Seleniumを活用して要素取得などをやり始めた頃に出るエラーの1つに「'WebDriver' objects has no attribute 'find_element_by_name'」というエラーがあります。

 

以下はその内容の説明と対処方法についてになります。

 

 

 

目次

 

1.find_elementの書式について

 

たとえば、SeleniumをVer.3からVer.4に上げた時などにそれまで出ていなかった以下のようなエラーが出ることがあります。

 

 

find_elementでの発生エラー

find_elementでの発生エラー

 

これは、それまで要素取得するような場合にfind_element_by_name("name")などと書いていた書式がSelenium4では推奨されなくなったというようなところからきています。

 

 さらに、そのような書式で記載した場合に当初はWarningレベルだったのですが最近はエラーが出るように変わってしまったものです。

 

そのため、書式としては、推奨されている書き方として、

 

find_element_by_name("name1")      ⇒ find_element(By.NAME,"name1")

find_element_by_id("id1")                  ⇒ find_element(By.ID,"id1")

 

のように変更しなければならないようになりました。 

 

 

2.よく使われるfind_elementについて旧方式と新方式の書式一覧

 

よく使われる書式についての旧方式と新方式の記載方法一覧はおよそ以下のようになります。

 

 

  旧方式 新方式
name属性 driver.find_element_by_name("name1")  driver.find_element(By.NAME,"name1")
id属性 driver.find_element_by_id("id1") driver.find_element(By.ID,"id1")
タグ名 driver.find_element_by_tag_name("tagname1") driver.find_element(By.TAG_NAME,"tagname1")
class属性 driver.find_element_by_class_name("classname1") driver.find_element(By.CLASS_NAME,"tagname1")
linkText driver.find_element_by_link_text(“element_link_text1”) driver.find_element(By.LINK_TEXT, “element_link_text1”)
partialLinkText driver.find_element_by_partial_link_text(“element_partial_link_text1”) driver.find_element(By.PARTIAL_LINK_TEXT, “element_partial_link_text1”)
cssセレクタ driver.find_element_by_css_selector(“element_css_selector1”) driver.find_element(By.CSS_SELECTOR, “element_css_selector1”)
xpath driver.find_element_by_xpath(“element_xpath1”) driver.find_element(By.XPATH, “element_xpath1”)

 

 

また、リスト型で複数要素取得するような場合には以下のように「find_element」が「find_elements」になります。

「id属性」は複数ないためこちらのリストにはありません。

 

 

  旧方式 新方式
name属性 driver.find_elements_by_name("name1")  driver.find_elements(By.NAME,"name1")
タグ名 driver.find_elements_by_tag_name("tagname1") driver.find_elements(By.TAG_NAME,"tagname1")
class属性 driver.find_elements_by_class_name("classname1") driver.find_elements(By.CLASS_NAME,"tagname1")
linkText driver.find_elements_by_link_text(“elements_link_text1”) driver.find_elements(By.LINK_TEXT, “elements_link_text1”)
partialLinkText driver.find_elements_by_partial_link_text(“elements_partial_link_text1”) driver.find_elements(By.PARTIAL_LINK_TEXT, “elements_partial_link_text1”)
cssセレクタ driver.find_elements_by_css_selector(“elements_css_selector1”) driver.find_elements(By.CSS_SELECTOR, “elements_css_selector1”)
xpath driver.find_elements_by_xpath(“elements_xpath1”) driver.find_elements(By.XPATH, “elements_xpath1”)

 

 

念のため程度としてそれを使用した例ということになりますが、よくあるGoogle検索画面でのname属性指定での要素取得として以下のようなものがあります。

 

内容はGoogle検索画面でキーワード入力のエリアの要素を取得してそこにキーワード「abc」を入力して「Enter」入力で画面展開しています。

ドライバーの設定はChrome用にて記載しています。

 

selenium ver.4.6以降の場合)

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

#指定したURLに遷移する
driver.get("https://www.google.co.jp")

#Google検索窓を要素取得
element = driver.find_element(By.NAME, "q")

#検索窓に"abc"と入力
element.send_keys("abc")
#Enterキークリック
element.submit()

# タブを閉じる
driver.close()
driver.quit()
 

ドライバーの設定方法の違いだけになりますがSelenium ver.4.6以前の場合の例は、以下に載せています。

 

kuku81kuku81.hatenablog.com

 

 

以上が「'WebDriver' objects has no attribute 'find_element_by_name'」などのエラーについての対処方法になります。

 

 

【Python Selenium】Webサイトのウインドウの最大化とスクロール方法について(SeleniumVer4.6以降)


PythonSeleniumを利用してWebサイトへウインドウアクセスする場合には、まずは、対象のウインドウを表示させるところからはじまります。

 

その後、画面内の要素の取得などを行いますがそれらについては、過去記事で記載しました。

 

 

kuku81kuku81.hatenablog.com

 

kuku81kuku81.hatenablog.com

 

今回は表示した画面に関してウインドウの最大化とスクロールをする方法の説明になります。

 

簡単な使用例として載せているものは、Chrome用になりますがドライバーの設定以外はEdgeなどでも同様です。

続きを読む

【Python Selenium】サイト内のボタンなどの要素をクリックする方法(SeleniumVer4.6以降)

 

画面操作のRPA化を行うような場合にはSeleniumなどのライブラリを使用して行うことになります。

 

その中で画面操作に関しては、対象のウインドウを表示させ、操作したい要素を取得するところからはじまりますが、それについては、以下の過去記事などでも紹介しました。

 

kuku81kuku81.hatenablog.com

 

kuku81kuku81.hatenablog.com

 

 

今回は取得した要素の中でボタンなどクリック操作が可能な要素に関してのクリック操作について説明します。

 

 

簡単な使用例として載せているものは、Chrome用になりますがドライバーの設定以外はEdgeなどでも同様です。

続きを読む

【Python Selenium】ブラウザの要素へのキー入力方法(使用例:Chrome用、SeleniumVer4.6以前、以降共)

 

 

Pythonにてブラウザの操作などを行っている時に、各要素に対してキー入力操作を行いたい場合があります。

 

そのような時には「send_keys」を使用します。

 

以下ではプログラム上での「send_keys」の使用方法を説明します。

 

 

1.ブラウザの要素へのキー入力方法

 

以下のように「send_keys」を使用することで、引数に指定した文字列をテキストボックスやテキストエリアなどのHTML要素に入力することが出来ます。

 

element.send_keys("abc")

 

 

2.実施例

 

以下のコードは、Google検索画面を開いてキー入力画面に「abc」と入力してウインドウを閉じるという例になります。

 

selenium ver.4.6以前の場合)

from selenium import webdriver
from selenium.webdriver.chrome import service as fs
import os
from selenium.webdriver.common.by import By

path_driver = os.getcwd()+'\chromedriver.exe'
# ドライバー指定でChromeブラウザを開く
chrome_service = fs.Service(executable_path=path_driver)
driver = webdriver.Chrome(service=chrome_service)

driver.get('https://www.google.com/')
element = driver.find_element(By.NAME, "q")
#検索テキストボックスに"abc"を入力
element.send_keys("abc")

# タブを閉じる
driver.close()

driver.quit()

 

 

(selenium ver.4.6以降の場合)

from selenium import webdriver

######################################################################
driver = webdriver.Chrome()  ###################################################################### driver.get('https://www.google.com/')
element = driver.find_element(By.NAME, "q")
#検索テキストボックスに"abc"を入力
element.send_keys("abc")

# タブを閉じる
driver.close()

driver.quit()

 

ドライバー設定方法が変更になります。

 

 

以上が、ブラウザの要素へのキー入力方法と使用例になります。

 

【Python】Seleniumで新しいタブを開く方法

 


今回はPythonSeleniumで新しいタブを開く方法の説明になります。

 

新タブはjavascriptの実行によりwindow.openを使用することで開くことができます。

 

 

尚、Seleniumのバージョンアップでウェブドライバーの設定方法が変わったこともあり、以下の例はSelenium Ver.4.6以降の場合の例として記載しています。

 

 Ver.4.6以前の場合については以下の過去記事などで載せています。

違いはドライバーの設定方法だけですが。

 

kuku81kuku81.hatenablog.com

 

 

目次

 

 

1.Chromeの場合

 

Selenium Ver.4.6以降の場合)

from selenium import webdriver

# ドライバー指定でChromeブラウザを開く
driver = webdriver.Chrome()

# URLを指定して、新しいタブを開く driver.execute_script("window.open('https://www.google.co.jp');")

# タブを閉じる
driver.close()

driver.quit()

 

にて、別タブでGoogleの検索画面が開きます。

 

2行目の、

 

driver = webdriver.Chrome(service=chrome_service)

 

で新しくウインドウが開きますが、

 

3行目の、

 

文driver.execute_script("window.open('https://www.google.co.jp');")

 

で、その中に別タブでGoogleの検索画面が開くことになります。

 

ウインドウを閉じる場合には、その次の、

 

driver.close()

 

で閉じ、

 

driver.quit()

 

でドライバーを抜けます。

 

2.Edgeの場合

 

ちなみに、Edgeの場合には、ほぼ同様ですが、

 

(Selenium Ver.4.6以降の場合)

from selenium import webdriver

# ドライバー指定でEdgeブラウザを開く
driver = webdriver.Edge()

# URLを指定して、新しいタブを開く
driver.execute_script("window.open('https://www.google.co.jp');")

# タブを閉じる
driver.close()

driver.quit()

 

にて新しいタブでGoogle画面が開いてその後閉じます。

 

3.空のタブを開くには

 

また、URLを指定せずに、以下のようにすると、

 

(Selenium Ver.4.6以降の場合)

from selenium import webdriver

# ドライバー指定でChromeブラウザを開く
driver = webdriver.Chrome()

#空のタブを開く
driver.execute_script("window.open();")
      
# タブを閉じる
driver.close()

driver.quit()

 

別タブを空のタブで開きます。

 

 

また、もう1つ、driver.switch_to.new_window("tab")使用による方法もありますが、それは以下の記事などで用例中に記載しています。

 

kuku81kuku81.hatenablog.com

 

 

以上がSelenium関係で別タブを開く方法となります。

 

 

PythonにてSeleniumを活用してスクレイピング、RPA化などを行っていく場合に必要となりそうな内容の記事を一覧として以下にまとめましたのでよかったらご参照ください。

 

 

kuku81kuku81.hatenablog.com

 

 

 

関連記事:

【Python】おすすめ学習本ランキング8選 - Django Girls and Boys 備忘録

 

【Python】キーボード、キー入力判定方法 - Django Girls and Boys 備忘録

 

【Python】keyboardライブラリでのキー入力検出に使用可能なキーの種類 - Django Girls and Boys 備忘録

 

【Python】range、break、continue、スライスによる範囲指定などfor文の基本的な使用方法 - Django Girls and Boys 備忘録

 

【Python】スライスによる範囲指定などスライスの使用方法 - Django Girls and Boys 備忘録

 

【Python】enumerate()関数、reversed()関数を使用したループ処理や辞書型オブジェクトdictのループ処理などのfor文の使用方法 - Django Girls and Boys 備忘録

 

【Python Selenium】Pythonで行うproxy環境設定方法 - Django Girls and Boys 備忘録

 

【PythonからWeb操作】seleniumのインストール手順 - Django Girls and Boys 備忘録

 

【PythonによるExcelファイルの読み書き】PythonのダウンロードからExcelファイルの読み書きまでの一通りすべての方法 - Django Girls and Boys 備忘録

【Python Selenium】Webサイトのスクレイピングなどで必要なフレーム間移動方法(使用例:Chrome用、SeleniumVer4.6以降)

 

Seleniumを使用してWeb情報取得、操作を行っている場合に必要となることの1つにフレーム間移動があります。

 

Webサイトがフレーム構造となっており、親フレーム、子フレームなどの階層構造になっている場合があります。

 

そのような場合に該当する要素の情報取得や操作を行う場合には、その要素が存在しているフレームまで移動してから取得、操作を行う必要があります。

続きを読む