回答編集履歴

4

VBAのコードを追記

2021/04/10 00:28

投稿

退会済みユーザー
answer CHANGED
@@ -30,21 +30,47 @@
30
30
  ![イメージ説明](a89d1ee077a6d026dca637a7536f51e0.png)
31
31
 
32
32
 
33
- `driver.execute_script(JavaScript実行文)`と書くことにより、selenium内で任意のJavaScriptを実行できます。
33
+ `driver.execute_script(JavaScript実行文)`と書くことにより、特に参照設定を行わなくとも、selenium内で任意のJavaScriptを実行できます。
34
34
   
35
35
   
36
36
  色々なサイトを調べて試行錯誤した結果、手元の環境では下記スクリプトだとうまく行きました。
37
37
   
38
38
  キモとなる点というか、たどり着くのに苦労した点は
39
39
  ・印刷ボタンをクリックさせるには、setTimeOut関数を使ってwindow.print()を呼び出さないといけない(理由不明)
40
- ・印刷ダイアログは別ウィンドウ扱いなので、switch_to.window() で指定対象を切り替える必要がある。
40
+ ・印刷ダイアログは別ウィンドウ扱いなので、SwitchToNextWindow で指定対象を切り替える必要がある。
41
41
  ・(当然ですが)印刷ダイアログの構築完了前にボタンクリックのJSを実行してしまうとボタンをクリックできないため、一定時間待つ必要がある。
42
42
  の3点です。
43
43
 
44
44
  あと現在のOKボタンのPathは、①のページに記載のPathとは若干変わっていました。
45
45
  バージョンアップに伴って変わる可能性があるとすれば、Chromeのバージョンごとに確認とメンテナンスが必要かもしれませんね。
46
46
 
47
+
48
+ ```VBA
49
+ Sub CommandButton1_Click()
50
+ Dim s As String
51
+ s = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""print-preview-button-strip"").shadowRoot.querySelector(""div > cr-button.action-button"").click();"
52
+
53
+ Dim Driver As New Selenium.WebDriver
54
+ Driver.Start "chrome", "http://www.selenium.jp/test-site"
55
+ Driver.Get "/"
56
+
57
+ Driver.ExecuteScript "setTimeout(function(){window.print();}, 0);"
58
+ 'VBAの場合十分な時間待たないと失敗する。
59
+ Driver.Wait (10000)
60
+
61
+ Driver.SwitchToNextWindow
62
+ Driver.ExecuteScript s
63
+
64
+ 'VBAの場合Closeで勝手に閉じるので十分な時間WAIT。
65
+ Driver.Wait (20000)
66
+ Driver.Close
67
+
68
+ End Sub
47
69
  ```
70
+
71
+ -------------
72
+ (参考)下記は検証に用いた(上のVBAコードの元にした)pythonスクリプトです。
73
+ ```python
48
74
  from selenium import webdriver
49
75
  import chromedriver_binary # 手元環境で使っているため指定。chromedriver.exeを直接利用している場合は不要。
50
76
  import time

3

修正

2021/04/10 00:28

投稿

退会済みユーザー
answer CHANGED
@@ -57,10 +57,10 @@
57
57
  driver.execute_script("setTimeout(function(){window.print();}, 0);")
58
58
  driver.implicitly_wait(10)
59
59
 
60
- '''印刷できない場合は印刷ダイアログの構築完了前に要素を選択してしまってい
60
+ '''印刷ダイアログの構築完了前に要素を選択してしまう場合があため、
61
- 可能性があるため、下記time.sleepをコメントアウトして印刷ダイアログの完全表示まで強制的
61
+ 下記time.sleep印刷ダイアログの完全表示まで強制的
62
62
  にウェイトをかけています。
63
- driver.implicitly_wait(10)だけではうまく行かない場合があるため、time.sleepでさらに待機ています。
63
+ driver.implicitly_wait(10)だけではうまく行かない場合があるため、time.sleepを使用して強制的に待機させています。
64
64
  なくてもうまく動くなら削除して構いません。
65
65
  本来なら WebDriverWait.untilを使うところですが、要素の指定にJSPathしか使えない状況での
66
66
  untilの使い方が分かりませんでした。

2

修正

2021/04/09 17:09

投稿

退会済みユーザー
answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > shaddow_rootという変数の型
2
2
 
3
- Selenium上で印刷ダイアログは下の画像のように、印刷元のページに#shadow-rootというID特別に差し込まれた形になってます。
3
+ selenium上で印刷ダイアログを表示させた場合下の画像のように、印刷元のページに#shadow-rootというID特別に差し込まれた形になます。
4
4
  ![イメージ説明](d802f362938a310c764c2eae530f83b2.png)
5
5
 
6
6
  この#shadow-root配下の要素をどうやって取得するか...そのあたりの話が質問文中の①のページでされています。
@@ -36,8 +36,8 @@
36
36
  色々なサイトを調べて試行錯誤した結果、手元の環境では下記スクリプトだとうまく行きました。
37
37
   
38
38
  キモとなる点というか、たどり着くのに苦労した点は
39
- ・印刷ダイアログ表示するにはwindow.printはsetTimeOut 使わないといけない(理由不明)
39
+ ・印刷ボタンクリックさせるには、setTimeOut関数を使ってwindow.print()呼び出さないといけない(理由不明)
40
- ・印刷ダイアログは別ウィンドウ扱いなので、switch_to.window() で切り替える必要がある。
40
+ ・印刷ダイアログは別ウィンドウ扱いなので、switch_to.window() で指定対象を切り替える必要がある。
41
41
  ・(当然ですが)印刷ダイアログの構築完了前にボタンクリックのJSを実行してしまうとボタンをクリックできないため、一定時間待つ必要がある。
42
42
  の3点です。
43
43
 

1

修正

2021/04/09 17:06

投稿

退会済みユーザー
answer CHANGED
@@ -21,11 +21,12 @@
21
21
  記載の「document.querySelector~」で始まるコマンドが、**印刷ダイアログのOKボタンを指定してクリックするためのJavaScript**になっています。
22
22
 
23
23
  このJavaScriptのうち.click()を除く部分は、下記の手順で取得できます。
24
- Seleniumのdriver.get(url)で適当なページを表示させます。
24
+ selenium driver.get(url) で適当なページを表示させます。
25
25
  ・Ctrl+Pを押して印刷ダイアログを表示させます。
26
26
  ・印刷ダイアログの適当な部分で右クリックし、コンテキストメニューの一番下の「検証」をクリックすると、印刷ダイアログに対するDevToolsが起動します。
27
27
  ・「要素の選択」ボタン(下の画像のオレンジ色で囲まれたボタン)をクリックして要素選択モードにしたあと、印刷ダイアログのOKボタンを右クリックします。
28
- ・OKボタンに対応するHTMLソースが選択されるので、れを右クリックしCopy→JSPath を選択します。
28
+ すると、OKボタンに対応するHTMLソースが選択されるので、選択さているソース部分を右クリックしCopy Copy JSPath」を選択します。
29
+ ・クリップボードに、選択した要素のJSPathが格納されます。
29
30
  ![イメージ説明](a89d1ee077a6d026dca637a7536f51e0.png)
30
31
 
31
32