質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

1996閲覧

【Python初心者】スクレイピングでクリックしたい要素の取得で「InvalidArgumentException」になる。

shin_qqq

総合スコア5

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2023/01/29 10:25

前提

閲覧頂き、ありがとうございます。
visaのサイトから特定日の為替レートを取得するため
開発しています。

Python初心者ですが、皆様のお知恵をお借りしながら
何とか1歩ずつ進めております。

クリックしたい要素の取得で躓いているため
お知恵をお借りできますと幸いです。

実現したいこと

「Edit」のボタンをクリックしたいので、
要素の取得をしたいです。

発生している問題・エラーメッセージ

該当箇所のエラーメッセージは下記です。

InvalidArgumentException Traceback (most recent call last) Cell In[11], line 4 1 #Editの要素を取得 2 edit_btn = browser.find_element( 3 By.XPATH, "//dm-calculator" ----> 4 ).shadow_root.find_element(By.XPATH, '//*[@id="skipTo"]/div[1]/div/div[1]/div[1]/div/div/div/div/div/div/dm-calculator//form/div/div/div[2]/div/div/div[2]/button') 6 ''' 7 //*[@id="skipTo"]/div[1]/div/div[1]/div[1]/div/div/div/div/div/div/dm-calculator 8 //*[@id="skipTo"]/div[1]/div/div[1]/div[1]/div/div/div/div/div/div/dm-calculator//form/div/div/div[2]/div/div/div[2]/button 9 ''' 11 ''' ↓NoSuchElementException 12 edit_btn = browser.find_element( 13 By.XPATH, "//dm-calculator" 14 ).shadow_root.find_element(By.CLASS_NAME, 'vs-link-cta vs-calculator-edit-link') 15 ''' File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\shadowroot.py:54, in ShadowRoot.find_element(self, by, value) 51 by = By.CSS_SELECTOR 52 value = '[name="%s"]' % value ---> 54 return self._execute(Command.FIND_ELEMENT_FROM_SHADOW_ROOT, {"using": by, "value": value})["value"] File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\shadowroot.py:83, in ShadowRoot._execute(self, command, params) 81 params = {} 82 params["shadowId"] = self._id ---> 83 return self.session.execute(command, params) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webdriver.py:444, in WebDriver.execute(self, driver_command, params) 442 response = self.command_executor.execute(driver_command, params) 443 if response: --> 444 self.error_handler.check_response(response) 445 response["value"] = self._unwrap_value(response.get("value", None)) 446 return response File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\errorhandler.py:249, in ErrorHandler.check_response(self, response) 247 alert_text = value["alert"].get("text") 248 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here --> 249 raise exception_class(message, screen, stacktrace) InvalidArgumentException: Message: invalid argument: invalid locator (Session info: chrome=109.0.5414.120) Stacktrace: Backtrace: (No symbol) [0x01026643] (No symbol) [0x00FBBE21] (No symbol) [0x00EBDA9D] (No symbol) [0x00EF13F3] (No symbol) [0x00EF14CB] (No symbol) [0x00EE64F1] (No symbol) [0x00F0FDC4] (No symbol) [0x00EE641F] (No symbol) [0x00F100D4] (No symbol) [0x00F26B09] (No symbol) [0x00F0FB76] (No symbol) [0x00EE49C1] (No symbol) [0x00EE5E5D] GetHandleVerifier [0x0129A142+2497106] GetHandleVerifier [0x012C85D3+2686691] GetHandleVerifier [0x012CBB9C+2700460] GetHandleVerifier [0x010D3B10+635936] (No symbol) [0x00FC4A1F] (No symbol) [0x00FCA418] (No symbol) [0x00FCA505] (No symbol) [0x00FD508B] BaseThreadInitThunk [0x764400F9+25] RtlGetAppContainerNamedObjectPath [0x77AE7BBE+286] RtlGetAppContainerNamedObjectPath [0x77AE7B8E+238]

該当のソースコード

エラー箇所は最下部です↓↓↓

Python

1 2from selenium import webdriver 3!pip install webdriver_manager 4from time import sleep 5from webdriver_manager.chrome import ChromeDriverManager 6 7#ブラウザで対象ページを開く 8browser = webdriver.Chrome(ChromeDriverManager().install()) 9url = ('https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html') 10browser.get(url) 11sleep(4) 12 13from selenium.webdriver.common.by import By 14 15#Cookie同意ボタンをクリック 16elem_ok_btn = browser.find_element(By.XPATH, '//*[@id="CookieReportsBanner"]/div[1]/div[2]/a[1]') 17elem_ok_btn.click() 18 19#Amountのボックスを取得し100入力(要素がshadow-rootに含まれるので取得の仕方を工夫) 20amount = browser.find_element( 21 By.XPATH, "//dm-calculator" 22).shadow_root.find_element(By.ID, "input_amount_paid") 23amount.send_keys('100') 24 25#Fromのボックスを取得しUSDを入力 26from_coin = browser.find_element( 27 By.XPATH, "//dm-calculator" 28).shadow_root.find_element(By.ID, "autosuggestinput_from") 29from_coin.send_keys('USD') 30 31#Toの項目を取得しJPYを入力 32to_coin = browser.find_element( 33 By.XPATH, "//dm-calculator" 34).shadow_root.find_element(By.ID, "autosuggestinput_to") 35to_coin.send_keys('JPY') 36 37 38 39#↓↓↓下記がエラー箇所です↓↓↓ 40 41#Editの要素を取得 42edit_btn = browser.find_element( 43 By.XPATH, "//dm-calculator" 44).shadow_root.find_element(By.XPATH, '//*[@id="skipTo"]/div[1]/div/div[1]/div[1]/div/div/div/div/div/div/dm-calculator//form/div/div/div[2]/div/div/div[2]/button') 45 46 47

試したこと

対象の要素がshadow-root内なので、
上記の要素の取得方法になっています。

「Edit」に対してXPATHでの指定ではなく、
CLASS_NAMEでの指定なども試みましたが
うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

Python 3.11.1 
selenium 4.7.2
jupyter lab

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

shadow root 内で、XPath は指定できないと思います。素直に CSS セレクターを使いましょう。

python

1# Get the shadow root 2shadow = browser.find_element(By.XPATH, "//dm-calculator").shadow_root 3 4# Click the 'edit' button 5shadow.find_element( 6 By.CSS_SELECTOR, "button.vs-link-cta.vs-calculator-edit-link" 7).click()

投稿2023/01/29 10:51

Demerara

総合スコア397

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shin_qqq

2023/01/29 12:48

ご教示頂いた方法で解決できました。 早速のご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問