seleniumを使用してWeb情報取得、操作を行っている場合に必要となることの1つにフレーム間移動があります。
Webサイトがフレーム構造となっており、親フレーム、子フレームなどの階層構造になっている場合があります。
そのような場合に該当する要素の情報取得や操作を行う場合には、その要素が存在しているフレームまで移動してから取得、操作を行う必要があります。
続きを読む
Seleniumを活用して要素取得などをやり始めた頃に出るエラーの1つに「'WebDriver' objects has no attribute 'find_element_by_name'」というエラーがあります。
以下はその内容の説明と対処方法についてになります。
目次
たとえば、SeleniumをVer.3からVer.4に上げた時などにそれまで出ていなかった以下のようなエラーが出ることがあります。
これは、それまで要素取得するような場合に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")
のように変更しなければならないようになりました。
よく使われる書式についての旧方式と新方式の記載方法一覧はおよそ以下のようになります。
旧方式 | 新方式 | |
---|---|---|
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以前の場合の例は、以下に載せています。
以上が「'WebDriver' objects has no attribute 'find_element_by_name'」などのエラーについての対処方法になります。
Pythonにてブラウザの操作などを行っている時に、各要素に対してキー入力操作を行いたい場合があります。
そのような時には「send_keys」を使用します。
以下ではプログラム上での「send_keys」の使用方法を説明します。
以下のように「send_keys」を使用することで、引数に指定した文字列をテキストボックスやテキストエリアなどのHTML要素に入力することが出来ます。
element.send_keys("abc")
以下のコードは、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で新しいタブを開く方法の説明になります。
新タブはjavascriptの実行によりwindow.openを使用することで開くことができます。
尚、Seleniumのバージョンアップでウェブドライバーの設定方法が変わったこともあり、以下の例はSelenium Ver.4.6以降の場合の例として記載しています。
Ver.4.6以前の場合については以下の過去記事などで載せています。
違いはドライバーの設定方法だけですが。
目次
(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()
でドライバーを抜けます。
ちなみに、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画面が開いてその後閉じます。
また、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")使用による方法もありますが、それは以下の記事などで用例中に記載しています。
以上がSelenium関係で別タブを開く方法となります。
PythonにてSeleniumを活用してスクレイピング、RPA化などを行っていく場合に必要となりそうな内容の記事を一覧として以下にまとめましたのでよかったらご参照ください。
関連記事:
【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 Selenium】Pythonで行うproxy環境設定方法 - Django Girls and Boys 備忘録
【PythonからWeb操作】seleniumのインストール手順 - Django Girls and Boys 備忘録
【PythonによるExcelファイルの読み書き】PythonのダウンロードからExcelファイルの読み書きまでの一通りすべての方法 - Django Girls and Boys 備忘録