Skip to content

Commit 783382b

Browse files
New Helper elementScreenshot (#1093)
* Add Helper: `elementScreenshot` * Tests added for new helper `elementScreenshot` * rename method --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent 4901980 commit 783382b

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

src/Browser.php

+24
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,30 @@ public function responsiveScreenshots($name)
448448
return $this;
449449
}
450450

451+
/**
452+
* Take a screenshot of a specific element and store it with the given name.
453+
*
454+
* @param string $selector
455+
* @param string $name
456+
* @return $this
457+
*/
458+
public function screenshotElement($selector, $name)
459+
{
460+
$filePath = sprintf('%s/%s.png', rtrim(static::$storeScreenshotsAt, '/'), $name);
461+
462+
$directoryPath = dirname($filePath);
463+
464+
if (! is_dir($directoryPath)) {
465+
mkdir($directoryPath, 0777, true);
466+
}
467+
468+
$this->scrollIntoView($selector)
469+
->driver->findElement(WebDriverBy::cssSelector($selector))
470+
->takeElementScreenshot($filePath);
471+
472+
return $this;
473+
}
474+
451475
/**
452476
* Store the console output with the given name.
453477
*

tests/Unit/BrowserTest.php

+57
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
namespace Laravel\Dusk\Tests\Unit;
44

55
use Facebook\WebDriver\Remote\RemoteKeyboard;
6+
use Facebook\WebDriver\Remote\RemoteWebDriver;
7+
use Facebook\WebDriver\Remote\RemoteWebElement;
68
use Facebook\WebDriver\Remote\WebDriverBrowserType;
9+
use Facebook\WebDriver\WebDriverBy;
710
use Facebook\WebDriver\WebDriverKeys;
811
use Laravel\Dusk\Browser;
912
use Laravel\Dusk\Keyboard;
@@ -241,6 +244,60 @@ public function test_screenshot_in_subdirectory()
241244
$this->assertFileExists(Browser::$storeScreenshotsAt.'/'.$name.'.png');
242245
}
243246

247+
public function test_element_screenshot()
248+
{
249+
$elementMock = $this->createMock(RemoteWebElement::class);
250+
$elementMock->expects($this->once())
251+
->method('takeElementScreenshot')
252+
->willReturnCallback(function ($filePath) {
253+
return touch($filePath);
254+
});
255+
256+
$driverMock = $this->createMock(RemoteWebDriver::class);
257+
$driverMock->expects($this->once())
258+
->method('findElement')
259+
->with(WebDriverBy::cssSelector('#selector'))
260+
->willReturn($elementMock);
261+
262+
$browser = new Browser($driverMock);
263+
264+
$browser::$storeScreenshotsAt = sys_get_temp_dir();
265+
266+
$browser->screenshotElement(
267+
'#selector',
268+
$name = 'screenshot-01',
269+
);
270+
271+
$this->assertFileExists(Browser::$storeScreenshotsAt.'/'.$name.'.png');
272+
}
273+
274+
public function test_element_screenshot_in_subdirectory()
275+
{
276+
$elementMock = $this->createMock(RemoteWebElement::class);
277+
$elementMock->expects($this->once())
278+
->method('takeElementScreenshot')
279+
->willReturnCallback(function ($filePath) {
280+
return touch($filePath);
281+
});
282+
283+
$driverMock = $this->createMock(RemoteWebDriver::class);
284+
$driverMock->expects($this->once())
285+
->method('findElement')
286+
->with(WebDriverBy::cssSelector('#selector'))
287+
->willReturn($elementMock);
288+
289+
$browser = new Browser($driverMock);
290+
291+
$browser::$storeScreenshotsAt = sys_get_temp_dir();
292+
293+
$browser->screenshotElement(
294+
'#selector',
295+
$name = uniqid('random').'/sub/dir/screenshot-01',
296+
);
297+
298+
$this->assertFileExists(Browser::$storeScreenshotsAt.'/'.$name.'.png');
299+
}
300+
244301
public function test_can_disable_fit_on_failure()
245302
{
246303
$this->browser->fitOnFailure = true;

0 commit comments

Comments
 (0)