Skip to content

Commit 2f7727c

Browse files
[JS] Adding support for print endpoint (#8880)
Co-authored-by: David Burns <david.burns@theautomatedtester.co.uk>
1 parent 65563b8 commit 2f7727c

6 files changed

Lines changed: 304 additions & 0 deletions

File tree

common/src/web/printPage.html

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<!--
2+
~ Licensed to the Software Freedom Conservancy (SFC) under one
3+
~ or more contributor license agreements. See the NOTICE file
4+
~ distributed with this work for additional information
5+
~ regarding copyright ownership. The SFC licenses this file
6+
~ to you under the Apache License, Version 2.0 (the
7+
~ "License"); you may not use this file except in compliance
8+
~ with the License. You may obtain a copy of the License at
9+
~
10+
~ http://www.apache.org/licenses/LICENSE-2.0
11+
~
12+
~ Unless required by applicable law or agreed to in writing,
13+
~ software distributed under the License is distributed on an
14+
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
~ KIND, either express or implied. See the License for the
16+
~ specific language governing permissions and limitations
17+
~ under the License.
18+
-->
19+
20+
<!DOCTYPE html>
21+
<html>
22+
<body>
23+
24+
<table>
25+
<tbody>
26+
<tr>
27+
<td>
28+
<div class="page" style="line-height: 3;">
29+
<br/> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tincidunt metus eu consectetur rutrum. Praesent tempor facilisis dapibus. Aliquam cursus diam ac vehicula pulvinar. Integer lacinia non odio et condimentum. Aenean faucibus cursus
30+
mi, sed interdum turpis sagittis a. Quisque quis pellentesque mi. Ut erat eros, posuere sed scelerisque ut, pharetra vitae tellus. Suspendisse ligula sapien, laoreet ac hendrerit sit amet, viverra vel mi. Pellentesque faucibus nisl et dolor
31+
pharetra, vel mattis massa venenatis. Integer congue condimentum nisi, sed tincidunt velit tincidunt non. Nulla sagittis sed lorem pretium aliquam. Praesent consectetur volutpat nibh, quis pulvinar est volutpat id. Cras maximus odio posuere
32+
suscipit venenatis. Donec rhoncus scelerisque metus, in tempus erat rhoncus sed. Morbi massa sapien, porttitor id urna vel, volutpat blandit velit. Cras sit amet sem eros. Quisque commodo facilisis tristique. Proin pellentesque sodales rutrum.
33+
Vestibulum purus neque, congue vel dapibus in, venenatis ut felis. Donec et ligula enim. Sed sapien sapien, tincidunt vitae lectus quis, ultricies rhoncus mi. Nunc dapibus nulla tempus nunc interdum, sed facilisis ex pellentesque. Nunc vel
34+
lorem leo. Cras pharetra sodales metus. Cras lacus ex, consequat at consequat vel, laoreet ac dui. Curabitur aliquam, sapien quis congue feugiat, nisi nisl feugiat diam, sed vehicula velit nulla ac nisl. Aliquam quis nisi euismod massa blandit
35+
pharetra nec eget nunc. Etiam eros ante, auctor sit amet quam vel, fringilla faucibus leo. Morbi a pulvinar nulla. Praesent sed vulputate nisl. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean commodo
36+
mollis iaculis. Maecenas consectetur enim vitae mollis venenatis. Ut scelerisque pretium orci id laoreet. In sit amet pharetra diam. Vestibulum in molestie lorem. Nunc gravida, eros non consequat fermentum, ex orci vestibulum orci, non accumsan
37+
sem velit ac lectus. Vivamus malesuada lacus nec velit dignissim, ac fermentum nulla pretium. Aenean mi nisi, convallis sed tempor in, porttitor eu libero. Praesent et molestie ante. Duis suscipit vitae purus sit amet aliquam. Vestibulum lectus
38+
justo, lobortis a purus a, dapibus efficitur metus. Suspendisse potenti. Duis dictum ex lorem. Suspendisse nec ligula consectetur magna hendrerit ullamcorper et eget mauris. Etiam vestibulum sodales diam, eget venenatis nunc luctus quis. Ut
39+
fermentum placerat neque nec elementum. Praesent orci erat, rhoncus vitae est eu, dictum molestie metus. Cras et fermentum elit. Aenean eget augue lacinia, varius ante in, ullamcorper dolor. Cras viverra purus non egestas consectetur. Nulla
40+
nec dolor ac lectus convallis aliquet sed a metus. Suspendisse eu imperdiet nunc, id pulvinar risus. Maecenas varius sagittis est, vel fermentum risus accumsan at. Vestibulum sollicitudin dui pharetra sapien volutpat, id convallis mi vestibulum.
41+
Phasellus commodo sit amet lorem quis imperdiet. Proin nec diam sed urna euismod ultricies at sed urna. Quisque ornare, nulla et vehicula ultrices, massa purus vehicula urna, ac sodales lacus leo vitae mi. Sed congue placerat justo at placerat.
42+
Aenean suscipit fringilla vehicula. Quisque iaculis orci vitae arcu commodo maximus. Maecenas nec nunc rutrum, cursus elit quis, porttitor sapien. Sed ac hendrerit ipsum, lacinia fringilla velit. Donec ultricies feugiat dictum.
43+
</div>
44+
</td>
45+
</tr>
46+
<tr>
47+
<td>
48+
<div class="page" style="line-height: 3;">
49+
<br/> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tincidunt metus eu consectetur rutrum. Praesent tempor facilisis dapibus. Aliquam cursus diam ac vehicula pulvinar. Integer lacinia non odio et condimentum. Aenean faucibus cursus
50+
mi, sed interdum turpis sagittis a. Quisque quis pellentesque mi. Ut erat eros, posuere sed scelerisque ut, pharetra vitae tellus. Suspendisse ligula sapien, laoreet ac hendrerit sit amet, viverra vel mi. Pellentesque faucibus nisl et dolor
51+
pharetra, vel mattis massa venenatis. Integer congue condimentum nisi, sed tincidunt velit tincidunt non. Nulla sagittis sed lorem pretium aliquam. Praesent consectetur volutpat nibh, quis pulvinar est volutpat id. Cras maximus odio posuere
52+
suscipit venenatis. Donec rhoncus scelerisque metus, in tempus erat rhoncus sed. Morbi massa sapien, porttitor id urna vel, volutpat blandit velit. Cras sit amet sem eros. Quisque commodo facilisis tristique. Proin pellentesque sodales rutrum.
53+
Vestibulum purus neque, congue vel dapibus in, venenatis ut felis. Donec et ligula enim. Sed sapien sapien, tincidunt vitae lectus quis, ultricies rhoncus mi. Nunc dapibus nulla tempus nunc interdum, sed facilisis ex pellentesque. Nunc vel
54+
lorem leo. Cras pharetra sodales metus. Cras lacus ex, consequat at consequat vel, laoreet ac dui. Curabitur aliquam, sapien quis congue feugiat, nisi nisl feugiat diam, sed vehicula velit nulla ac nisl. Aliquam quis nisi euismod massa blandit
55+
pharetra nec eget nunc. Etiam eros ante, auctor sit amet quam vel, fringilla faucibus leo. Morbi a pulvinar nulla. Praesent sed vulputate nisl. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean commodo
56+
mollis iaculis. Maecenas consectetur enim vitae mollis venenatis. Ut scelerisque pretium orci id laoreet. In sit amet pharetra diam. Vestibulum in molestie lorem. Nunc gravida, eros non consequat fermentum, ex orci vestibulum orci, non accumsan
57+
sem velit ac lectus. Vivamus malesuada lacus nec velit dignissim, ac fermentum nulla pretium. Aenean mi nisi, convallis sed tempor in, porttitor eu libero. Praesent et molestie ante. Duis suscipit vitae purus sit amet aliquam. Vestibulum lectus
58+
justo, lobortis a purus a, dapibus efficitur metus. Suspendisse potenti. Duis dictum ex lorem. Suspendisse nec ligula consectetur magna hendrerit ullamcorper et eget mauris. Etiam vestibulum sodales diam, eget venenatis nunc luctus quis. Ut
59+
fermentum placerat neque nec elementum. Praesent orci erat, rhoncus vitae est eu, dictum molestie metus. Cras et fermentum elit. Aenean eget augue lacinia, varius ante in, ullamcorper dolor. Cras viverra purus non egestas consectetur. Nulla
60+
nec dolor ac lectus convallis aliquet sed a metus. Suspendisse eu imperdiet nunc, id pulvinar risus. Maecenas varius sagittis est, vel fermentum risus accumsan at. Vestibulum sollicitudin dui pharetra sapien volutpat, id convallis mi vestibulum.
61+
Phasellus commodo sit amet lorem quis imperdiet. Proin nec diam sed urna euismod ultricies at sed urna. Quisque ornare, nulla et vehicula ultrices, massa purus vehicula urna, ac sodales lacus leo vitae mi. Sed congue placerat justo at placerat.
62+
Aenean suscipit fringilla vehicula. Quisque iaculis orci vitae arcu commodo maximus. Maecenas nec nunc rutrum, cursus elit quis, porttitor sapien. Sed ac hendrerit ipsum, lacinia fringilla velit. Donec ultricies feugiat dictum.
63+
</div>
64+
</td>
65+
</tr>
66+
</tbody>
67+
</table>
68+
</body>
69+
</html>

javascript/node/selenium-webdriver/lib/command.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ const Name = {
156156
TAKE_ELEMENT_SCREENSHOT: 'takeElementScreenshot',
157157
SET_SCRIPT_TIMEOUT: 'setScriptTimeout',
158158

159+
PRINT_PAGE: 'printPage',
160+
159161
GET_TIMEOUT: 'getTimeout',
160162
SET_TIMEOUT: 'setTimeout',
161163

javascript/node/selenium-webdriver/lib/http.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ const W3C_COMMAND_MAP = new Map([
432432
cmd.Name.TAKE_ELEMENT_SCREENSHOT,
433433
get('/session/:sessionId/element/:id/screenshot'),
434434
],
435+
// print page.
436+
[cmd.Name.PRINT_PAGE, post('/session/:sessionId/print')],
435437
// Log extensions.
436438
[cmd.Name.GET_LOG, post('/session/:sessionId/se/log')],
437439
[cmd.Name.GET_AVAILABLE_LOG_TYPES, get('/session/:sessionId/se/log/types')],

javascript/node/selenium-webdriver/lib/test/fileserver.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ const Pages = (function () {
8787
addPage('redirectPage', 'redirect')
8888
addPage('resultPage', 'resultPage.html')
8989
addPage('richTextPage', 'rich_text.html')
90+
addPage('printPage', 'printPage.html')
9091
addPage('selectableItemsPage', 'selectableItems.html')
9192
addPage('selectPage', 'selectPage.html')
9293
addPage('simpleTestPage', 'simpleTest.html')

javascript/node/selenium-webdriver/lib/webdriver.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,25 @@ class IWebDriver {
600600
* instance.
601601
*/
602602
switchTo() {}
603+
604+
/**
605+
*
606+
* Takes a PDF of the current page. The driver makes a best effort to
607+
* return a PDF based on the provided parameters.
608+
*
609+
* @param {{orientation: (string|undefined),
610+
* scale: (number|undefined),
611+
* background: (boolean|undefined)
612+
* width: (number|undefined)
613+
* height: (number|undefined)
614+
* top: (number|undefined)
615+
* bottom: (number|undefined)
616+
* left: (number|undefined)
617+
* right: (number|undefined)
618+
* shrinkToFit: (boolean|undefined)
619+
* pageRanges: (<Array>|undefined)}} options.
620+
*/
621+
printPage(options) {} // eslint-disable-line
603622
}
604623

605624
/**
@@ -1049,6 +1068,88 @@ class WebDriver {
10491068
switchTo() {
10501069
return new TargetLocator(this)
10511070
}
1071+
1072+
validatePrintPageParams(keys, object) {
1073+
let page = {}
1074+
let margin = {}
1075+
let data
1076+
Object.keys(keys).forEach(function (key) {
1077+
data = keys[key]
1078+
let obj = {
1079+
orientation: function () {
1080+
object.orientation = data
1081+
},
1082+
1083+
scale: function () {
1084+
object.scale = data
1085+
},
1086+
1087+
background: function () {
1088+
object.background = data
1089+
},
1090+
1091+
width: function () {
1092+
page.width = data
1093+
object.page = page
1094+
},
1095+
1096+
height: function () {
1097+
page.height = data
1098+
object.page = page
1099+
},
1100+
1101+
top: function () {
1102+
margin.top = data
1103+
object.margin = margin
1104+
},
1105+
1106+
left: function () {
1107+
margin.left = data
1108+
object.margin = margin
1109+
},
1110+
1111+
bottom: function () {
1112+
margin.bottom = data
1113+
object.margin = margin
1114+
},
1115+
1116+
right: function () {
1117+
margin.right = data
1118+
object.margin = margin
1119+
},
1120+
1121+
shrinkToFit: function () {
1122+
object.shrinkToFit = data
1123+
},
1124+
1125+
pageRanges: function () {
1126+
object.pageRanges = data
1127+
},
1128+
}
1129+
1130+
if (!Object.prototype.hasOwnProperty.call(obj, key)) {
1131+
throw new error.InvalidArgumentError(`Invalid Argument '${key}'`)
1132+
} else {
1133+
obj[key]()
1134+
}
1135+
})
1136+
1137+
return object
1138+
}
1139+
1140+
/** @override */
1141+
printPage(options = {}) {
1142+
let keys = options
1143+
let params = {}
1144+
let resultObj
1145+
1146+
let self = this
1147+
resultObj = self.validatePrintPageParams(keys, params)
1148+
1149+
return this.execute(
1150+
new command.Command(command.Name.PRINT_PAGE).setParameters(resultObj)
1151+
)
1152+
}
10521153
}
10531154

10541155
/**
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// Licensed to the Software Freedom Conservancy (SFC) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The SFC licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
'use strict'
19+
20+
const test = require('../lib/test')
21+
const { Pages } = require('../lib/test')
22+
const { Browser } = require('../')
23+
const chrome = require('../chrome')
24+
const assert = require('assert')
25+
26+
let startIndex = 0
27+
let endIndex = 5
28+
let pdfMagicNumber = 'JVBER'
29+
let base64Code
30+
31+
test.suite(
32+
function (env) {
33+
let driver
34+
35+
afterEach(function () {
36+
return driver.quit()
37+
})
38+
39+
it('Should Print pdf with 2 pages', async function () {
40+
driver = env.builder().build()
41+
await driver.get(Pages.printPage)
42+
base64Code = await driver.printPage({ pageRanges: ['1-2'] })
43+
base64Code = base64Code.slice(startIndex, endIndex)
44+
assert.equal(base64Code, pdfMagicNumber)
45+
})
46+
47+
it('Should Print pdf with total pages', async function () {
48+
driver = env.builder().build()
49+
await driver.get(Pages.printPage)
50+
base64Code = await driver.printPage()
51+
base64Code = base64Code.slice(startIndex, endIndex)
52+
assert.equal(base64Code, pdfMagicNumber)
53+
})
54+
55+
it('Check with all valid params', async function () {
56+
driver = env.builder().build()
57+
await driver.get(Pages.printPage)
58+
base64Code = await driver.printPage({
59+
orientation: 'landscape',
60+
scale: 1,
61+
background: true,
62+
width: 30,
63+
height: 30,
64+
top: 1,
65+
bottom: 1,
66+
left: 1,
67+
right: 1,
68+
shrinkToFit: true,
69+
pageRanges: ['1-2'],
70+
})
71+
base64Code = base64Code.slice(startIndex, endIndex)
72+
assert.equal(base64Code, pdfMagicNumber)
73+
})
74+
75+
it('Check with page params', async function () {
76+
driver = env.builder().build()
77+
await driver.get(Pages.printPage)
78+
base64Code = await driver.printPage({ width: 30, height: 30 })
79+
base64Code = base64Code.slice(startIndex, endIndex)
80+
assert.equal(base64Code, pdfMagicNumber)
81+
})
82+
83+
it('Check with margin params', async function () {
84+
driver = env.builder().build()
85+
await driver.get(Pages.printPage)
86+
base64Code = await driver.printPage({
87+
top: 1,
88+
bottom: 1,
89+
left: 1,
90+
right: 1,
91+
})
92+
base64Code = base64Code.slice(startIndex, endIndex)
93+
assert.equal(base64Code, pdfMagicNumber)
94+
})
95+
},
96+
{ browsers: [Browser.FIREFOX] }
97+
)
98+
99+
// in chrome printPdf supports in headless mode
100+
test.suite(
101+
function (env) {
102+
let driver
103+
104+
let options = new chrome.Options()
105+
options.headless()
106+
107+
afterEach(function () {
108+
return driver.quit()
109+
})
110+
111+
it('Should Print pdf with 2 pages', async function () {
112+
driver = env.builder().setChromeOptions(options).build()
113+
114+
await driver.get(Pages.printPage)
115+
base64Code = await driver.printPage({ pageRanges: ['1-2'] })
116+
base64Code = base64Code.slice(startIndex, endIndex)
117+
assert.equal(base64Code, pdfMagicNumber)
118+
})
119+
120+
it('Should Print pdf with total pages', async function () {
121+
driver = env.builder().setChromeOptions(options).build()
122+
await driver.get(Pages.printPage)
123+
base64Code = await driver.printPage()
124+
base64Code = base64Code.slice(startIndex, endIndex)
125+
assert.equal(base64Code, pdfMagicNumber)
126+
})
127+
},
128+
{ browsers: [Browser.CHROME] }
129+
)

0 commit comments

Comments
 (0)