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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

selenium

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

Q&A

解決済

1回答

8802閲覧

seleniumを利用して、chromeで印刷をする際に、印刷ドライバを選択したい

tetrisuehara

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

selenium

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

0グッド

0クリップ

投稿2021/08/03 06:18

編集2021/08/06 07:33

前提

お世話になっております。
以前、こちらの質問にてseleniumを利用してchromeで印刷する方法はご教授頂いたのですが、
その後様々試していく中で印刷ドライバを変更したいと思いましてコードをいじっていましたができません。

###実現したい事
seleniumを利用して、自社のサイトの画面をdocuwarksで抜き出したい。
chromeにて、
0. 印刷プレビュー画面の呼び出し**(解決済み)**
0. 送信先ドロップダウンリスト(画像参照)から、「もっと見る」を選択
0. 送信先選択画面からDocuWorks Printerを選択する。(解決済み)
0. 詳細設定画面を開く**(解決済み)**
0. 最後に印刷倍率を調整**(一部解決済み)**
0. 印刷ボタンを押す。(解決済み)
までを行いたいと考えています。
印刷プレヴュー
ドラバー選択

試したこと

2・5に関してはshadow-root下のselectタグを選択する方法として下記の通りchromeの印刷プレビューのソースのselectタグ部分をJspathで抜き出し、valueを入れてやるという方法をとってみたのですが下記のエラーが起きております。
また、5.倍率変更に関しては、倍率ボタンを押せないために、その後の数値を入れるところまでできていません。
(追記:実験的に力技でsend key で倍率ボタンをクリックした扱い(カスタム状態にする)にして倍率を変更する事はできました。この力技を使わない事が最終目標になります。また、選択すべきJsPathが違っていたので修正します。)
chrome印刷プレビューソース

VBA

1Sub chrome印刷() 2 3Dim driver As New Selenium.WebDriver 4Dim skey As New Selenium.Keys 5Dim Shadowprint As String 6 7'もっと見る呼び出し 8Dim seemore As String 9seemore = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""#destinationSettings"").shadowRoot.querySelector(""#destinationSelect"").shadowRoot.querySelector(""print-preview-settings-section:nth-child(10) > div > select"").value =""seeMore"";" 10 11'DocuWorksドライバ選択 12Dim docu As String 13docu = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""#destinationSettings"").shadowRoot.querySelector(""print-preview-destination-dialog"").shadowRoot.querySelector(""#printList"").shadowRoot.querySelector(""#destination_9 > print-preview-destination-list-item"").click();" 14 15'詳細設定展開 16Dim shousai As String 17shousai = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""#container > print-preview-more-settings"").shadowRoot.querySelector (""div"").click();" 18 19'倍率ボタンをカスタムに変更 20Dim bai As String 21bai = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""#moreSettings > print-preview-scaling-settings"").shadowRoot.querySelector(""print-preview-settings-section > div > select"").Value = ""3"";" 22 23'倍率を90に変更 24Dim par As String 25par = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""#moreSettings > print-preview-scaling-settings"").shadowRoot.querySelector(""iron-collapse > print-preview-number-settings-section"").shadowRoot.querySelector(""#userValue"").shadowRoot.querySelector(""#input"").value =""90"";" 26 27'印刷 28Dim s_print As String 29s_print = "document.querySelector(""body > print-preview-app"").shadowRoot.querySelector(""#sidebar"").shadowRoot.querySelector(""print-preview-button-strip"").shadowRoot.querySelector(""div > cr-button.action-button"").click();" 30 31'-------------------------------------------------------------------------------------------------------------------------------------- 32driver.Start "chrome" 33driver.Get "https://www.google.com/" 34 35 '印刷画面呼び出し 36 driver.ExecuteScript "setTimeout(function(){window.print();}, 0);" 37 38 'VBAの場合十分な時間待たないと失敗する。 39 driver.Wait (3000) 40 driver.SwitchToNextWindow 41 42 '送信先選択でもっと見るを選択 43 driver.ExecuteScript seemore 44 45 46 driver.Wait (3000) 47 48 '印刷ドライバ選択 49 driver.ExecuteScript docu 50 51 '倍率変更のために詳細設定をクリックし開く 52 driver.ExecuteScript shousai 53 54 '倍率をカスタムに変更 55 driver.ExecuteScript bai 56 57 '倍率を入力 58 driver.ExecuteScript par 59 driver.Wait (3000) 60 '印刷ボタンを押す 61 driver.ExecuteScript s_print 62 63 'VBAの場合Closeで勝手に閉じるので十分な時間WAIT。 64 driver.Wait (20000) 65 66 67 68 69End Sub 70

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

イメージ説明
### 疑問点
value of nullということはなにかかが認識されてはいないとは思うんですが、よくわかりません。
また、手法を変えて、valueでの変更ではなく、option[hoge].selected ="true";での記述も試みましたが結果としてはやはりnull扱いとなりました。
追記:value of null ということは、seemoreの参照を見つけていないということなのか?

また、様々サイトを見たのですが、shadowroot下でのselectタグの扱いに関するものがどうもうまく出てこないので、そもそもこれであっているのかもよくわからない状況です。

追記 試したこと

別の適当なサイトにてshadowDOM下以外でのselect要素の取得を試しに行ってみたところ同じく下記エラーが発生しました。
イメージ説明
つまり、shadow-root下の条件ではなく、select要素の取得方法が間違っている可能性が高いようです。
過去の投稿からshadowDOM下の要素の取得と実行に関しては、selenium上ではjavascriptの実行(ExecuteScript hoge )でないと成立しないようなので、
私の必要な情報はseleniumでのselect要素の取得とjavascriptの実行だということだと考えられます。
**
ご教授のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

optionの要素をJS上でreturnし、それをSelenium側でClickするようにしてはいかがでしょうか。

VBA

1seemore = "return document.querySelector(""body > print-preview-app"")" _ 2 & ".shadowRoot.querySelector(""#sidebar"")" _ 3 & ".shadowRoot.querySelector(""#destinationSettings"")" _ 4 & ".shadowRoot.querySelector(""#destinationSelect"")" _ 5 & ".shadowRoot.querySelector(""print-preview-settings-section:nth-child(10) > div > select > option:nth-child(11)"")" 6 7 8(略) 9 10'送信先選択でもっと見るをクリックする。 11driver.ExecuteScript(seemore).Click

 
【注意】上記のseemoreのスクリプト文字列を組み立てている部分は、実際の環境やChromeのバージョンによって異なる場合があります。(上記をそのままコピペしてもうまく行かない場合があります)
この部分(セレクトボックスを開いたときに現れる「もっと見る」の要素)のJSPathをクリックして取得しようとしても、
クリック時にインスペクタが無効になってしまい、なかなか取得できないように思えますが、下記のようにすれば取得することができます。

1.VBAエディタで印刷ダイアログを開く処理(driver.SwitchToNextWindow)の後の行にブレークポイントを設定しておきます。

2.マクロを実行して、VBAを中断させ、Chromeが起動したままになっている状態にします。

(実際は、特にブレークポイントを設定せずとも、印刷ダイアログが開いた後JSpathのバグ等で中断状態になっていてもOKです)

3.印刷ダイアログが開かれている状態で、どこでもいいので右クリック->「検証」でDevToolsを開き、
インスペクタのボタンを押し印刷ダイアログの「送信先」のセレクトボックスをポイントします。

すると、ソースの「md-select」が選択されるはずですので、その先頭の三角矢印をクリックして展開します。(画像中黄色丸で囲んだ部分)

4.セレクトボックスのoption の部分のソースが現れるので 「もっと見る」の行を右クリックしてJSPathをCopyします。(画像中、黄色の四角で囲んだ行)
イメージ説明


 

倍率「カスタム」の選択も同様にJS上でreturnさせてClickすれば出来ると思います。
(各クリックの前後で0.5~1秒ほどwaitをかけておいた方が安全かと思います)

VBA

1bai = "return document.querySelector(""body > print-preview-app"")" _ 2 & ".shadowRoot.querySelector(""#sidebar"")" _ 3 & ".shadowRoot.querySelector(""#moreSettings > print-preview-scaling-settings"")" _ 4 & ".shadowRoot.querySelector(""print-preview-settings-section > div > select > option:nth-child(4)"");" 5 6driver.ExecuteScript(bai).Click 7

投稿2021/08/17 16:28

編集2021/08/17 17:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tetrisuehara

2021/08/18 02:41

qnoir様 前回に続きまして今回もご回答頂きましてありがとうございました。 return 戻り値というものがあるんですね。 ご教授いただいたとおりに記述を直してみたところ無事に解決いたしました。 自分でもjavascriptでreturnの使い方を調べてみたのですが、入門向けサイトにて 「関数内で処理をした結果を「戻り値」として返す」 「returnを使うことで処理を行った結果の値を返せるので、その値を使ってさらに別の処理を続けることが出来る」 とありました。 今回の方法もreturnで戻り値を得て、ExecuteScriptでその戻り値を利用してクリックしたという認識でいいんでしょうか?
退会済みユーザー

退会済みユーザー

2021/08/18 02:53 編集

そのような御認識でよいと思います。 なお、上記のように、ボタンやラベルなどは「JSPathでquerySelectorしたものを.click()」するスクリプトをExecuteScriptすれば クリックできるようですが、 セレクトボックスのアイテムは、querySelectorでselectしたものをreturnするスクリプトをExexuteScriptした上で、 Selenium側でClick実行する必要があります。 この違いの理由については、申し訳ないですがはっきりとしたことは解明できていません。
tetrisuehara

2021/08/18 02:48

重ねてご回答頂きましてありがとうございました。 前回もそうですが親切にご回答頂きましてとてもわかりやすく、ありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問