回答編集履歴
4
VBAのコードを追記
answer
CHANGED
@@ -30,21 +30,47 @@
|
|
30
30
|

|
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
|
-
・印刷ダイアログは別ウィンドウ扱いなので、
|
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
修正
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
|
-
|
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
修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
> shaddow_rootという変数の型
|
2
2
|
|
3
|
-
|
3
|
+
selenium上で印刷ダイアログを表示させた場合は、下の画像のように、印刷元のページに#shadow-rootというIDが特別に差し込まれた形になります。
|
4
4
|

|
5
5
|
|
6
6
|
この#shadow-root配下の要素をどうやって取得するか...そのあたりの話が質問文中の①のページでされています。
|
@@ -36,8 +36,8 @@
|
|
36
36
|
色々なサイトを調べて試行錯誤した結果、手元の環境では下記スクリプトだとうまく行きました。
|
37
37
|
|
38
38
|
キモとなる点というか、たどり着くのに苦労した点は
|
39
|
-
・印刷
|
39
|
+
・印刷ボタンをクリックさせるには、setTimeOut関数を使ってwindow.print()を呼び出さないといけない(理由不明)
|
40
|
-
・印刷ダイアログは別ウィンドウ扱いなので、switch_to.window() で切り替える必要がある。
|
40
|
+
・印刷ダイアログは別ウィンドウ扱いなので、switch_to.window() で指定対象を切り替える必要がある。
|
41
41
|
・(当然ですが)印刷ダイアログの構築完了前にボタンクリックのJSを実行してしまうとボタンをクリックできないため、一定時間待つ必要がある。
|
42
42
|
の3点です。
|
43
43
|
|
1
修正
answer
CHANGED
@@ -21,11 +21,12 @@
|
|
21
21
|
記載の「document.querySelector~」で始まるコマンドが、**印刷ダイアログのOKボタンを指定してクリックするためのJavaScript**になっています。
|
22
22
|
|
23
23
|
このJavaScriptのうち.click()を除く部分は、下記の手順で取得できます。
|
24
|
-
・
|
24
|
+
・selenium の driver.get(url) で適当なページを表示させます。
|
25
25
|
・Ctrl+Pを押して印刷ダイアログを表示させます。
|
26
26
|
・印刷ダイアログの適当な部分で右クリックし、コンテキストメニューの一番下の「検証」をクリックすると、印刷ダイアログに対するDevToolsが起動します。
|
27
27
|
・「要素の選択」ボタン(下の画像のオレンジ色で囲まれたボタン)をクリックして要素選択モードにしたあと、印刷ダイアログのOKボタンを右クリックします。
|
28
|
-
・OKボタンに対応するHTMLソースが選択されるので、
|
28
|
+
・すると、OKボタンに対応するHTMLソースが選択されるので、選択されているソース部分を右クリックし「Copy → Copy JSPath」を選択します。
|
29
|
+
・クリップボードに、選択した要素のJSPathが格納されます。
|
29
30
|

|
30
31
|
|
31
32
|
|