D-POSが新しくなったらしくRPAの更新作業をしました。
その際、少し面倒だったので共有です。
やりたい事
D-POSデータの全取得DLの自動化
面倒な事
全POSデータ取得設定の[JANコード]選択時に5000以上はプルダウンの全選択ができない
30000件以上はDLできない
D-POSの機能で使用できる全件取得は5000件までなのでjsで全取得します。
やる事
プルダウンはjsで順次追加されるので開発者用のコンソールで高速スクロールします。
レンダリングされた状態の要素をclick() していきます。checked = trueにしても※1fetchされません。
お気に入りに設定を保存します。
やっていきます。
まずスクロールしてレンダリングさせます。
const tile = document.querySelector(".tileContainer")
const tileScroll = (tile) => {
tile.scrollTop += 1000;
console.log("+1000px")
};
const intervalId = setInterval(tileScroll , 100, tile.parentElement)
値は適当に調整してください。
自分は90000件くらいで2000回くらい回ってました。
回り切ったら止めます
clearInterval(intervalId)
全選択します
[...document.querySelector(".tileContainer").children].forEach((ul, index, array) => {
[...ul.children].forEach((li, index) => {
li.children[1].children[0].click();
});
});
90000件くらい選択されましたが件数の上限でDL出来ませんでした。ので分割します。
上限値を確認します。
30000件でした。
listの要素数が460個だったので4分割してDLしようと思います。
document.querySelector(".tileContainer").children.length
461
115まで選択した所、23200でした。他も多少件数に差はあるものの30000件は超えなさそうです。
[...document.querySelector(".tileContainer").children].forEach((ul, index, array) => {
if (index <= 115) {
[...ul.children].forEach((li, index) => {
li.children[1].children[0].click();
});
}
});
後はレンダリングされているか確認しつつ115, 230, 345, 460で条件を変更し実行して完了です。
[...document.querySelector(".tileContainer").children].forEach((ul, index) => {
if (index > 115 && index <= 230) {
[...ul.children].forEach((li, index) => {
li.children[1].children[0].click();
});
}
});
※1 内部にtableauがiframeで埋め込まれていて通信はどのように行われているのか気になりネットワークを確認した所、以下のようにリクエスト先に送信を行っていました。
短時間に複数クリックされた場合、リクエストをまとめる。
categorical-filter-by-indexとしてまとめてリクエスト処理されているのが確認できます。
大丈夫そうですね。ペイロードのfilterAddIndicesからリストとして渡されて一回のリクエストが送信されている事が確認できました。
リクエストはドロップダウンリストの呼び出しです。
カスケードレプリケーションとかいうものも使用しているみたいですね
うーむ、わからない..