Skip to content

Commit 2187935

Browse files
committed
refactor: add focus and hover tracking elements with corresponding tests
1 parent df801f8 commit 2187935

4 files changed

Lines changed: 113 additions & 21 deletions

File tree

playground/resources/views/test-pages/element-tests.blade.php

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,12 @@ class="profile-picture" />
252252
<!-- Elements for Event Testing -->
253253
<div class="section">
254254
<h2>Event Testing</h2>
255+
<div id="focus-display" data-testid="focus-display" class="p-2 bg-blue-50 border text-sm mb-2">No element focused yet</div>
256+
<div id="hover-display" data-testid="hover-display" class="p-2 bg-green-50 border text-sm mb-2">No element hovered yet</div>
257+
<div id="hover-target" data-testid="hover-target" class="p-4 border bg-blue-100 hover:bg-blue-200 transition-colors cursor-pointer mb-4">
258+
Hover Target
259+
</div>
260+
<input id="focus-target" data-testid="focus-target" type="text" class="bg-white text-black p-2 border focus:border-blue-500 mb-4" placeholder="Focus on me" />
255261
<button id="event-button" data-testid="event-button">Click Me</button>
256262
<div id="event-result" data-testid="event-result"></div>
257263
</div>
@@ -262,9 +268,7 @@ class="profile-picture" />
262268
<div data-testid="scroll-target" style="margin-top: 500px;">
263269
This element is far down the page for scroll testing
264270
</div>
265-
</div>
266-
267-
<script>
271+
</div> <script>
268272
// Counter for click testing
269273
let clickCounter = 0;
270274
@@ -273,6 +277,22 @@ function incrementCounter() {
273277
document.querySelector('[data-testid="click-counter"]').textContent = clickCounter;
274278
}
275279
280+
// Focus tracking function
281+
function trackFocus(elementId) {
282+
const focusDisplay = document.getElementById('focus-display');
283+
if (focusDisplay) {
284+
focusDisplay.textContent = 'Last focused: ' + elementId;
285+
}
286+
}
287+
288+
// Hover tracking function
289+
function trackHover(elementId) {
290+
const hoverDisplay = document.getElementById('hover-display');
291+
if (hoverDisplay) {
292+
hoverDisplay.textContent = 'Last hovered: ' + elementId;
293+
}
294+
}
295+
276296
// Add some basic interactivity for testing
277297
document.addEventListener('DOMContentLoaded', function() {
278298
// Event button click handler
@@ -285,6 +305,40 @@ function incrementCounter() {
285305
});
286306
}
287307
308+
// Add focus tracking event listeners
309+
document.getElementById('focus-target').addEventListener('focus', function() {
310+
trackFocus('focus-target');
311+
});
312+
document.getElementById('username').addEventListener('focus', function() {
313+
trackFocus('username');
314+
});
315+
document.getElementById('password').addEventListener('focus', function() {
316+
trackFocus('password');
317+
});
318+
document.getElementById('search').addEventListener('focus', function() {
319+
trackFocus('search');
320+
});
321+
document.getElementById('comments').addEventListener('focus', function() {
322+
trackFocus('comments');
323+
});
324+
325+
// Hover tracking
326+
const hoverTarget = document.getElementById('hover-target');
327+
if (hoverTarget) {
328+
['mouseenter', 'mouseover', 'pointerenter'].forEach(event => {
329+
hoverTarget.addEventListener(event, function() {
330+
trackHover('hover-target');
331+
});
332+
});
333+
}
334+
335+
// Add global hover detection for Playwright compatibility
336+
document.addEventListener('mousemove', function(e) {
337+
if (e.target.id === 'hover-target') {
338+
trackHover('hover-target');
339+
}
340+
});
341+
288342
// Make forms more interactive
289343
const usernameInput = document.getElementById('username');
290344
if (usernameInput) {

tests/Browser/Playwright/Element/FocusTest.php

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,36 @@
22

33
declare(strict_types=1);
44

5-
use Pest\Browser\Playwright\Element;
5+
it('can focus on different elements and track focus changes', function (): void {
6+
$page = $this->page()->goto('/test/element-tests');
7+
8+
$page->waitForSelector('[data-testid="focus-target"]');
9+
expect($page->textContent('[data-testid="focus-display"]'))->toBe('No element focused yet');
10+
11+
$focusTarget = $page->locator('[data-testid="focus-target"]')->elementHandle();
12+
$focusTarget->focus();
13+
14+
$page->waitForSelector('[data-testid="focus-display"]:text("Last focused: focus-target")');
15+
expect($page->textContent('[data-testid="focus-display"]'))->toBe('Last focused: focus-target');
16+
17+
$username = $page->locator('#username')->elementHandle();
18+
$username->focus();
619

7-
it('can focus elements', function (): void {
20+
$page->waitForSelector('[data-testid="focus-display"]:text("Last focused: username")');
21+
expect($page->textContent('[data-testid="focus-display"]'))->toBe('Last focused: username');
22+
});
23+
24+
it('can focus and interact with the focused element', function (): void {
825
$page = $this->page()->goto('/test/element-tests');
9-
$locator = $page->getByLabel('Username');
10-
$element = $locator->elementHandle();
1126

12-
$element->focus();
13-
expect($element)->toBeInstanceOf(Element::class);
27+
$page->waitForSelector('[data-testid="focus-target"]');
28+
29+
$input = $page->locator('[data-testid="focus-target"]')->elementHandle();
30+
$input->focus();
31+
32+
$page->waitForSelector('[data-testid="focus-display"]:text("Last focused: focus-target")');
33+
expect($page->textContent('[data-testid="focus-display"]'))->toBe('Last focused: focus-target');
34+
35+
$input->type('typing in focused element');
36+
expect($page->inputValue('[data-testid="focus-target"]'))->toBe('typing in focused element');
1437
});

tests/Browser/Playwright/Element/HoverTest.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22

33
declare(strict_types=1);
44

5-
it('can hover over elements', function (): void {
5+
it('hovers over elements and verifies hover state changes', function (): void {
66
$page = $this->page()->goto('/test/element-tests');
7-
$locator = $page->getByRole('button', ['name' => 'Save']);
8-
$element = $locator->elementHandle();
97

10-
$element->hover();
11-
expect($element->isVisible())->toBeTrue();
8+
$hoverTargetLocator = $page->getByTestId('hover-target');
9+
$hoverTarget = $hoverTargetLocator->elementHandle();
10+
11+
$hoverDisplayLocator = $page->getByTestId('hover-display');
12+
$hoverDisplay = $hoverDisplayLocator->elementHandle();
13+
14+
expect($hoverDisplay->textContent())->toBe('No element hovered yet');
15+
16+
$hoverTarget->hover();
17+
18+
expect($hoverDisplay->textContent())->toBe('Last hovered: hover-target');
19+
expect($hoverTarget->isVisible())->toBeTrue();
1220
});

tests/Browser/Playwright/Element/PressTest.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22

33
declare(strict_types=1);
44

5-
use Pest\Browser\Playwright\Element;
6-
7-
it('can press keys', function (): void {
5+
it('presses keys on input elements and verifies input changes', function (): void {
86
$page = $this->page()->goto('/test/element-tests');
9-
$locator = $page->getByLabel('Username');
7+
$locator = $page->getByTestId('text-input');
108
$element = $locator->elementHandle();
119

1210
$element->focus();
11+
$element->fill('');
12+
13+
$element->press('a');
14+
$element->press('b');
15+
$element->press('c');
16+
expect($element->inputValue())->toBe('abc');
17+
18+
$element->press('Backspace');
19+
expect($element->inputValue())->toBe('ab');
1320

14-
$element->press('Enter');
15-
// Key press doesn't change the element state, just verify no error
16-
expect($element)->toBeInstanceOf(Element::class);
21+
$element->press('Control+a');
22+
$element->press('Delete');
23+
expect($element->inputValue())->toBe('');
1724
});

0 commit comments

Comments
 (0)