11// DHL Geschäftskundenportal Invoices Download - Puppeteer script that logs in, filters invoices for the previous month, and extracts their details for download
22// Last update: 2025-10-03
33
4- const puppeteer = require ( " puppeteer" ) ;
4+ const puppeteer = require ( ' puppeteer' ) ;
55
66// Settings
77const username = $env . DHL_USERNAME ;
@@ -11,55 +11,55 @@ const password = $env.DHL_PASSWORD;
1111async function dhlGeschaftskundenportalInvoicesDownload ( ) {
1212 const browser = await puppeteer . launch ( {
1313 headless : false ,
14- args : [ " --no-sandbox" , " --disable-setuid-sandbox" , " --start-fullscreen" ] ,
14+ args : [ ' --no-sandbox' , ' --disable-setuid-sandbox' , ' --start-fullscreen' ] ,
1515 } ) ;
1616
1717 const page = await browser . newPage ( ) ;
1818
1919 // Settings
2020 await page . setViewport ( { width : 1920 , height : 1080 } ) ;
21- await page . setUserAgent ( " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" ) ;
21+ await page . setUserAgent ( ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' ) ;
2222 // page.on('console', msg => console.log('BROWSER CONSOLE:', msg.text()));
2323
2424 // Navigate to login page
25- await page . goto ( " https://geschaeftskunden.dhl.de" ) ;
25+ await page . goto ( ' https://geschaeftskunden.dhl.de' ) ;
2626
2727 // Cookies
2828 await page
29- . waitForSelector ( " #onetrust-reject-all-handler" , {
29+ . waitForSelector ( ' #onetrust-reject-all-handler' , {
3030 visible : true ,
3131 timeout : 5000 ,
3232 } )
3333 . catch ( ( e ) => {
34- console . log ( " Cookie consent button not found or already gone." ) ;
34+ console . log ( ' Cookie consent button not found or already gone.' ) ;
3535 } ) ;
36- if ( await page . $ ( " #onetrust-reject-all-handler" ) ) {
37- await page . click ( " #onetrust-reject-all-handler" ) ;
36+ if ( await page . $ ( ' #onetrust-reject-all-handler' ) ) {
37+ await page . click ( ' #onetrust-reject-all-handler' ) ;
3838 await page . waitForNavigation ( ) ;
3939 }
4040
4141 // "Anmelden"
42- await page . waitForSelector ( " #button-noName" , { visible : true } ) ;
43- await page . click ( " #button-noName" ) ;
42+ await page . waitForSelector ( ' #button-noName' , { visible : true } ) ;
43+ await page . click ( ' #button-noName' ) ;
4444
4545 // Fill in credentials
46- await page . waitForSelector ( " #username" , { visible : true , timeout : 10000 } ) ;
47- await page . type ( " #username" , username ) ;
48- await page . type ( " #password" , password ) ;
46+ await page . waitForSelector ( ' #username' , { visible : true , timeout : 10000 } ) ;
47+ await page . type ( ' #username' , username ) ;
48+ await page . type ( ' #password' , password ) ;
4949
5050 // Login
5151 await page . click ( 'button[type="submit"]' ) ;
5252 await page . waitForNavigation ( ) ;
5353
5454 // Navigate to invoice section
55- await page . goto ( " https://geschaeftskunden.dhl.de/billing/invoice/overview" ) ;
55+ await page . goto ( ' https://geschaeftskunden.dhl.de/billing/invoice/overview' ) ;
5656
5757 // Display "Last 3 months" invoices
5858 await page . waitForSelector ( '[data-testid="date-range-input-field-function-icon-billingView-filter-dateRange"]' ) ;
5959 await page . click ( '[data-testid="date-range-input-field-function-icon-billingView-filter-dateRange"]' ) ;
6060 const presetDropdownSelector = '[data-testid="billingView-filter-dateRange-footer-presetRangeSelector"]' ;
6161 await page . waitForSelector ( presetDropdownSelector , { visible : true } ) ;
62- await page . select ( presetDropdownSelector , "1" ) ;
62+ await page . select ( presetDropdownSelector , '1' ) ;
6363 const submitButtonSelector = '[data-testid="billingView-filter-dateRange-footer-submit"]' ;
6464 await page . waitForSelector ( submitButtonSelector , {
6565 visible : true ,
@@ -79,18 +79,18 @@ async function dhlGeschaftskundenportalInvoicesDownload() {
7979 const invoices = await page . evaluate (
8080 ( month , year ) => {
8181 const table = document . querySelector ( 'table[data-testid="billingView"]' ) ;
82- const rows = Array . from ( table . querySelectorAll ( " tbody > tr.dhlTable-row-default" ) ) ;
82+ const rows = Array . from ( table . querySelectorAll ( ' tbody > tr.dhlTable-row-default' ) ) ;
8383 const data = [ ] ;
8484
8585 for ( const row of rows ) {
86- const dateCell = row . querySelector ( " .dhlTablecell:nth-child(2)" ) ;
87- const invoiceNumberCell = row . querySelector ( " .dhlTablecell:nth-child(3)" ) ;
88- const descriptionCell = row . querySelector ( " .dhlTablecell:nth-child(4)" ) ;
89- const amountCell = row . querySelector ( " .dhlTablecell:nth-child(5)" ) ;
86+ const dateCell = row . querySelector ( ' .dhlTablecell:nth-child(2)' ) ;
87+ const invoiceNumberCell = row . querySelector ( ' .dhlTablecell:nth-child(3)' ) ;
88+ const descriptionCell = row . querySelector ( ' .dhlTablecell:nth-child(4)' ) ;
89+ const amountCell = row . querySelector ( ' .dhlTablecell:nth-child(5)' ) ;
9090
9191 if ( dateCell && invoiceNumberCell && descriptionCell && amountCell ) {
9292 const dateText = dateCell . textContent . trim ( ) ;
93- const parts = dateText . split ( "." ) ;
93+ const parts = dateText . split ( '.' ) ;
9494 const invoiceMonth = parseInt ( parts [ 1 ] , 10 ) - 1 ;
9595 const invoiceYear = parseInt ( parts [ 2 ] , 10 ) ;
9696
@@ -99,7 +99,7 @@ async function dhlGeschaftskundenportalInvoicesDownload() {
9999 const invoiceDescription = descriptionCell . textContent . trim ( ) ;
100100 const invoiceAmount = amountCell . textContent . trim ( ) ;
101101
102- const downloadButton = row . querySelector ( " td .svgIcon-pdf" ) . closest ( " button" ) ;
102+ const downloadButton = row . querySelector ( ' td .svgIcon-pdf' ) . closest ( ' button' ) ;
103103 const buttonId = downloadButton ? downloadButton . id : null ;
104104
105105 data . push ( {
@@ -115,10 +115,10 @@ async function dhlGeschaftskundenportalInvoicesDownload() {
115115 return data ;
116116 } ,
117117 targetMonth ,
118- targetYear ,
118+ targetYear
119119 ) ;
120120
121- console . log ( " Filtered Invoices for Last Month:" , invoices ) ;
121+ console . log ( ' Filtered Invoices for Last Month:' , invoices ) ;
122122
123123 // Close browser
124124 await browser . close ( ) ;
0 commit comments