Skip to content

Commit 9c071a8

Browse files
committed
Look for "CHROME_PATH" env variable to find binaries [ci skip]
1 parent d8a08ef commit 9c071a8

File tree

5 files changed

+129
-1
lines changed

5 files changed

+129
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
2020
* Features:
2121
* Added option ``windowSize`` in BrowserFactory
22+
* Added methods ``Page::setViewportSize`` and ``Page::setDeviceMetricsOverride``
2223

2324
## 0.2.0
2425

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ Here are the options available for the browser factory:
135135
| headless | true | Enable or disable headless mode |
136136
| userDataDir | none | chrome user data dir (default: a new empty dir is generated temporarily) |
137137
| startupTimeout | 30 | Maximum time in seconds to wait for chrome to start |
138-
| windowSize | - | Size of the window. Must be an array of 2 number ``[$width, $height]`` |
138+
| windowSize | - | Size of the window. usage: ``[$width, $height]`` - see also Page::setViewportSize |
139139

140140
### Browser API
141141

@@ -223,6 +223,17 @@ You can achieve this by using ``$page->evaluate('some js that will reload the pa
223223
An example is available in [form-submit.php](./examples/form-submit.php)
224224

225225

226+
#### Set viewport size
227+
228+
This features allows to change the size of the viewport (emulation) for the current page without affecting the size of
229+
all the browser's pages (see also option ``"windowSize"`` of [BrowserFactory::createBrowser](#options)).
230+
231+
```php
232+
$width = 600;
233+
$height = 300;
234+
$page->setViewportSize($width, $height)
235+
->await(); // wait for operation to complete
236+
```
226237

227238
#### Make a screenshot
228239

src/Page.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use HeadlessChromium\PageUtils\PageEvaluation;
1717
use HeadlessChromium\PageUtils\PageNavigation;
1818
use HeadlessChromium\PageUtils\PageScreenshot;
19+
use HeadlessChromium\PageUtils\ResponseWaiter;
1920

2021
class Page
2122
{
@@ -278,6 +279,60 @@ public function screenshot(array $options = []): PageScreenshot
278279
return new PageScreenshot($responseReader);
279280
}
280281

282+
/**
283+
* Allows to change viewport size, enabling mobile mode, or changing the scale factor
284+
*
285+
* usage:
286+
*
287+
* ```
288+
* $page->setDeviceMetricsOverride
289+
* ```
290+
* @param $overrides
291+
* @throws CommunicationException
292+
* @throws NoResponseAvailable
293+
*
294+
* @return ResponseWaiter
295+
*
296+
*/
297+
public function setDeviceMetricsOverride(array $overrides)
298+
{
299+
if (!array_key_exists('width', $overrides)) {
300+
$overrides['width'] = 0;
301+
}
302+
if (!array_key_exists('height', $overrides)) {
303+
$overrides['height'] = 0;
304+
}
305+
if (!array_key_exists('deviceScaleFactor', $overrides)) {
306+
$overrides['deviceScaleFactor'] = 0;
307+
}
308+
if (!array_key_exists('mobile', $overrides)) {
309+
$overrides['mobile'] = false;
310+
}
311+
312+
$this->assertNotClosed();
313+
return new ResponseWaiter($this->getSession()->sendMessage(
314+
new Message('Emulation.setDeviceMetricsOverride', $overrides)
315+
));
316+
}
317+
318+
/**
319+
* Set viewport size
320+
*
321+
* @param int $width
322+
* @param int $height
323+
* @throws CommunicationException
324+
* @throws NoResponseAvailable
325+
*
326+
* @return ResponseWaiter
327+
*/
328+
public function setViewport(int $width, int $height)
329+
{
330+
return $this->setDeviceMetricsOverride([
331+
'width' => $width,
332+
'height' => $height
333+
]);
334+
}
335+
281336
/**
282337
* Request to close the page
283338
* @throws CommunicationException

src/PageUtils/ResponseWaiter.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* @license see LICENSE
4+
*/
5+
6+
namespace HeadlessChromium\PageUtils;
7+
8+
use HeadlessChromium\Communication\ResponseReader;
9+
10+
class ResponseWaiter
11+
{
12+
13+
/**
14+
* @var ResponseReader
15+
*/
16+
protected $responseReader;
17+
18+
/**
19+
* @param ResponseReader $responseReader
20+
*/
21+
public function __construct(ResponseReader $responseReader)
22+
{
23+
$this->responseReader = $responseReader;
24+
}
25+
26+
/**
27+
* @param $time
28+
* @throws \HeadlessChromium\Exception\NoResponseAvailable
29+
* @throws \HeadlessChromium\Exception\OperationTimedOut
30+
*/
31+
public function await(int $time = null)
32+
{
33+
$this->responseReader->waitForResponse($time);
34+
}
35+
36+
/**
37+
* @return ResponseReader
38+
*/
39+
public function getResponseReader(): ResponseReader
40+
{
41+
return $this->responseReader;
42+
}
43+
}

test/suites/PageTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
namespace HeadlessChromium\Test;
77

8+
use HeadlessChromium\BrowserFactory;
89
use HeadlessChromium\Communication\Connection;
910
use HeadlessChromium\Communication\Session;
1011
use HeadlessChromium\Communication\Socket\MockSocket;
@@ -26,4 +27,21 @@ public function testPage()
2627

2728
$this->assertSame($session, $page->getSession());
2829
}
30+
31+
public function testSetViewport()
32+
{
33+
$factory = new BrowserFactory();
34+
35+
$browser = $factory->createBrowser([
36+
'windowSize' => [500, 500]
37+
]);
38+
39+
$page = $browser->createPage();
40+
41+
$page->setViewport(100, 300)->await();
42+
43+
$response = $page->evaluate('[window.innerWidth, window.innerHeight]')->getReturnValue();
44+
45+
$this->assertEquals([100, 300], $response);
46+
}
2947
}

0 commit comments

Comments
 (0)