回答編集履歴

3

質問に対する正確な回答に気付いたため、再編集しました。

2023/01/23 11:02

投稿

Demerara
Demerara

スコア397

test CHANGED
@@ -1,6 +1,10 @@
1
1
  該当のページは、cloudflare の cdn を利用してデータを取得しています。そのため、ページのロードを待つ必要がありそうです。
2
2
 
3
3
  selenium でページロードを待機するには、`.implicitly_wait()` というメソッドを使います。
4
+
5
+ 追記:加えて、該当の要素は Shadow DOM となっており、shadow root が設定されている内側にある要素です。そのため、shadow root を取得してから、任意の要素を取得するようにすれば上手く取得できます。
6
+
7
+ 参照:[Using shadow DOM - Web Components | MDN](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM)
4
8
 
5
9
  ```python
6
10
  from selenium import webdriver
@@ -12,9 +16,16 @@
12
16
  browser.implicitly_wait(10)
13
17
 
14
18
  browser.get(https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html)
19
+
20
+ # Shadow root を持つ要素は、dm-calculator であることがわかるため、その要素のプロパティから shadowroot を取得します
21
+ # その上で、任意の要素を取得します
22
+ amount = browser.find_element(
23
+ By.XPATH, "//dm-calculator"
24
+ ).shadow_root.find_element(By.ID, "input_amount_paid")
25
+
15
26
  ```
16
27
 
17
- より明示的な待機については[ドキュメント](https://www.selenium.dev/documentation/webdriver/waits/)をご覧ください。
28
+ より明示的な待機については[ドキュメント](https://www.selenium.dev/documentation/webdriver/waits/)をご覧ください。
18
29
 
19
30
  ### PlayWright を使った場合
20
31
 

2

質問に対する直接的な回答ではありませんが、問題解決のための代替手段を追記しました。

2023/01/21 14:03

投稿

Demerara
Demerara

スコア397

test CHANGED
@@ -15,3 +15,47 @@
15
15
  ```
16
16
 
17
17
  より、明示的な待機については[ドキュメント](https://www.selenium.dev/documentation/webdriver/waits/)をご覧ください。
18
+
19
+ ### PlayWright を使った場合
20
+
21
+ selenium だと該当の要素の取得がどうにもうまくいかなかったため、試しに [playwright](https://playwright.dev/python/docs/library) でスクレイピングしてみたところ簡単に取得できたため、一応回答として残しておくことにします。
22
+
23
+ ```python
24
+ import asyncio
25
+
26
+ from playwright.async_api import async_playwright
27
+
28
+ url = (
29
+ "https://usa.visa.com/support/consumer/travel-support/"
30
+ "exchange-rate-calculator.html"
31
+ )
32
+ amount = "58742"
33
+
34
+
35
+ async def main():
36
+ async with async_playwright() as p:
37
+ browser = await p.chromium.launch()
38
+ page = await browser.new_page()
39
+ await page.goto(url)
40
+ await page.get_by_placeholder("Enter amount").fill(amount)
41
+
42
+ await page.get_by_role(
43
+ "button", name="Open from currency list drop down menu."
44
+ ).click()
45
+ await page.locator("#listbox-item-2").click()
46
+ await page.get_by_role(
47
+ "button", name="Open to currency list drop down menu."
48
+ ).click()
49
+ await page.locator("#listbox-item-0").click()
50
+
51
+ await page.get_by_role("button", name=" Calculate Conversion ").click()
52
+
53
+ print(await page.locator("h2.vs-h2").nth(1).text_content())
54
+ print(await page.locator("dm-calculator div").nth(45).text_content())
55
+
56
+ await browser.close()
57
+
58
+
59
+ asyncio.run(main())
60
+
61
+ ```

1

ソースコードに不要なドットが混じっていたため削除

2023/01/19 06:01

投稿

Demerara
Demerara

スコア397

test CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  # ページ遷移時すぐに要素が見つからない場合に見つかるまで待機する時間を設定
11
11
  # この場合、10 秒までは要素が見つかるまで待ちます。それでも見つからないと諦めてタイムアウトを返します
12
- browser..implicitly_wait(10)
12
+ browser.implicitly_wait(10)
13
13
 
14
14
  browser.get(https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html)
15
15
  ```