Skip to content

Commit aea7f4d

Browse files
committed
Add the ability to screenshot individual elements on the page
1 parent d45e130 commit aea7f4d

File tree

4 files changed

+45
-4
lines changed

4 files changed

+45
-4
lines changed

src/Dom/Node.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace HeadlessChromium\Dom;
66

7+
use HeadlessChromium\Clip;
78
use HeadlessChromium\Communication\Message;
89
use HeadlessChromium\Communication\Response;
910
use HeadlessChromium\Exception\DomException;
@@ -214,4 +215,20 @@ public function assertNotError(Response $response): void
214215
throw new DOMException($response->getErrorMessage());
215216
}
216217
}
218+
219+
public function getClip(): ?Clip
220+
{
221+
$position = $this->getPosition();
222+
223+
if (!$position) {
224+
return null;
225+
}
226+
227+
return new Clip(
228+
$position->getX(),
229+
$position->getY(),
230+
$position->getWidth(),
231+
$position->getHeight(),
232+
);
233+
}
217234
}

src/Dom/NodePosition.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,14 @@ public function __construct(array $points)
4444
$this->width = $rightBottomX - $leftBottomX;
4545
}
4646

47-
public function getX(): int
47+
public function getX(): float
4848
{
49-
return (int) $this->x;
49+
return (float) $this->x;
5050
}
5151

52-
public function getY(): int
52+
public function getY(): float
5353
{
54-
return (int) $this->y;
54+
return (float) $this->y;
5555
}
5656

5757
public function getWidth(): int

src/Page.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use HeadlessChromium\Cookies\Cookie;
1818
use HeadlessChromium\Cookies\CookiesCollection;
1919
use HeadlessChromium\Dom\Dom;
20+
use HeadlessChromium\Dom\Node;
2021
use HeadlessChromium\Dom\Selector\CssSelector;
2122
use HeadlessChromium\Dom\Selector\Selector;
2223
use HeadlessChromium\Exception\CommunicationException;
@@ -673,6 +674,13 @@ public function screenshot(array $options = []): PageScreenshot
673674
return new PageScreenshot($responseReader);
674675
}
675676

677+
public function screenshotElement(Node $node): PageScreenshot
678+
{
679+
return $this->screenshot([
680+
'clip' => $node->getClip(),
681+
]);
682+
}
683+
676684
/**
677685
* Generate a PDF
678686
* Usage:.

tests/PageTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,4 +507,20 @@ public function testSetScriptExecution(): void
507507
$page->evaluate('document.body.innerText')->getReturnValue()
508508
);
509509
}
510+
511+
public function testElementScreenshot(): void
512+
{
513+
$factory = new BrowserFactory();
514+
515+
$browser = $factory->createBrowser();
516+
$page = $browser->createPage();
517+
518+
$page->navigate($this->sitePath('domForm.html'))->waitForNavigation();
519+
520+
$element = $page->dom()->querySelector('#myform');
521+
$screenshot = $page->screenshotElement($element);
522+
523+
self::assertNotEmpty($screenshot->getBase64());
524+
self::assertGreaterThan(4000, \strlen($screenshot->getBase64()));
525+
}
510526
}

0 commit comments

Comments
 (0)