Sharepointのファイル処理をPython+Seleniumで自動化

Microsoft SharePointとは、マイクロソフト社が提供する、コラボレーションやドキュメント管理等を行うためのソフトウェアツール。

 

 

現在はWebDAVなどを使ってアクセスが可能のため、自動処理も何とか可能だ。

ただし、Microsoft 365 サービスによる Internet Explorer 11 のサポート終了に伴い、「エクスプローラーで開く」機能の廃止や、WebDAV 機能が正常に動作しなくなる可能性があると言われている。

SharePoint REST API への接続に使用できる SPHttpClient を提供しているそうだが、社内セキュリティが厳しい場合には使うことができない。

WebDAVですらファイル・フォルダ数が1000件とか増えてくると処理が重くて不安定になってしまう。

 

自動化泣かせのツール

 

……だと思ってる。

そんなSharepointをSeleniumで処理できるかどうか試してみる。

ドキュメント内のフォルダをクリックする

ドキュメント内のフォルダはButtonというタグとして存在していた。

<button data-automationid=”FieldRenderer-name” data-selection-invoke=”true” title=”フォルダ名” role=”link” type=”button” class=”ms-Link root_XXXXX nameField_XXXXX clickable_XXXXX overflow_XXXXX pre_XXXXX” tabindex=”-1″>フォルダ名</button>

しかし、buttonタグは他のUXの多くに使われているため、

<div role=”presentation” class=”ms-DetailsList-contentWrapper”>

のタグ中にあるbuttonだけ抽出する。

スクロール可能な要素内でスクロールダウン

これがAjaxサイトの自動化で嫌いなところ。

Sharepoint上のフォルダ一覧を抽出すると、たとえフォルダ・ファイル数が多くても60件しか取得できなかった。

ブラウザ上でスクロールダウンされるとajaxで追加のフォルダ・ファイルが読み込まれて表示しているようだ。

 

通常のスクロールダウンはこれで良い。

 

でも今回は次のタグの中(スクロール可能な要素内)でスクロールダウンする必要がある。

<div class=”od-scrollable-content od-scrollablePane-content-ItemsScopeList od-ItemsScopeList-content-sticky” data-is-scrollable=”true”>

ChatGPTに教えてもらったが、スクロール可能な要素内でスクロールダウンを実行するには、JavaScriptを使用してその要素をスクロールさせるそうだ。

このコードでは、execute_script()メソッドを使用してJavaScriptを実行し、scrollBy()関数を使って指定された要素内でスクロールを行う。

scrollBy()関数の第1引数は水平方向のスクロール量、第2引数は垂直方向のスクロール量を指定する。

 

もしくは、scrollIntoView() メソッドを使用して特定の要素が表示されるまでスクロールする……でも良いかもしれない(未確認)。

要素が表示されるまで待機するために、WebDriverWait を使用し、visibility_of_element_located の条件を指定。

ドキュメントホームへ戻る処理

ブラウザの「戻る」で問題なかった。

最初「ドキュメント」ボタンを押そうとしてAttributeが変わって苦労したけど不要だった。

おわりに

ライブラリとして幾つかの処理を用意できれば、やれなくはない。

内部のHTMLが変わったり、意図しないファイルが置かれていたり……という場合には何度も異常終了してしまうだろう。

動的ページではなく簡易版の静的ページを用意する等……自動化フレンドリーなページを作ってくれても良い気がする。

 

因みにChatGPTはさすが!

最近はChatGPTからのアドバイスを

 

ChatGPT様より御神託を賜わった

 

と呼ぶようにしてる。

© 泡沫に神は微睡む/安田 のら/KADOKAWA

ソースコード

参考になるかはしらないけどソースコードは公開しておく。

タイトルとURLをコピーしました