diff --git a/packages/select/test/visual/base/screenshots/select/baseline/feature-error-message.png b/packages/select/test/visual/base/screenshots/select/baseline/feature-error-message.png
new file mode 100644
index 00000000000..0daff264b29
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/feature-error-message.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/feature-helper-above-field.png b/packages/select/test/visual/base/screenshots/select/baseline/feature-helper-above-field.png
new file mode 100644
index 00000000000..b6ed5532cf3
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/feature-helper-above-field.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/feature-helper-text.png b/packages/select/test/visual/base/screenshots/select/baseline/feature-helper-text.png
new file mode 100644
index 00000000000..a9e8926f4e8
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/feature-helper-text.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/feature-prefix.png b/packages/select/test/visual/base/screenshots/select/baseline/feature-prefix.png
new file mode 100644
index 00000000000..a9476f5bacd
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/feature-prefix.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-basic.png b/packages/select/test/visual/base/screenshots/select/baseline/state-basic.png
new file mode 100644
index 00000000000..9f63e4c750c
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-basic.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-disabled.png b/packages/select/test/visual/base/screenshots/select/baseline/state-disabled.png
new file mode 100644
index 00000000000..df39e8b0a4e
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-disabled.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-focus.png b/packages/select/test/visual/base/screenshots/select/baseline/state-focus.png
new file mode 100644
index 00000000000..fa38f8d7aeb
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-focus.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-opened.png b/packages/select/test/visual/base/screenshots/select/baseline/state-opened.png
new file mode 100644
index 00000000000..fb568a7a817
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-opened.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-placeholder.png b/packages/select/test/visual/base/screenshots/select/baseline/state-placeholder.png
new file mode 100644
index 00000000000..999403b71ec
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-placeholder.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-readonly.png b/packages/select/test/visual/base/screenshots/select/baseline/state-readonly.png
new file mode 100644
index 00000000000..53d197ba243
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-readonly.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/state-required.png b/packages/select/test/visual/base/screenshots/select/baseline/state-required.png
new file mode 100644
index 00000000000..0d55a89af4f
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/state-required.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/value-disabled.png b/packages/select/test/visual/base/screenshots/select/baseline/value-disabled.png
new file mode 100644
index 00000000000..5b90b512e77
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/value-disabled.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/value-multiline.png b/packages/select/test/visual/base/screenshots/select/baseline/value-multiline.png
new file mode 100644
index 00000000000..9d16046a0bd
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/value-multiline.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/value-opened.png b/packages/select/test/visual/base/screenshots/select/baseline/value-opened.png
new file mode 100644
index 00000000000..6762f6fcc47
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/value-opened.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/value-overflow.png b/packages/select/test/visual/base/screenshots/select/baseline/value-overflow.png
new file mode 100644
index 00000000000..6a96665f91b
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/value-overflow.png differ
diff --git a/packages/select/test/visual/base/screenshots/select/baseline/value.png b/packages/select/test/visual/base/screenshots/select/baseline/value.png
new file mode 100644
index 00000000000..7e742f1654e
Binary files /dev/null and b/packages/select/test/visual/base/screenshots/select/baseline/value.png differ
diff --git a/packages/select/test/visual/base/select.test.js b/packages/select/test/visual/base/select.test.js
new file mode 100644
index 00000000000..873bc12a7c5
--- /dev/null
+++ b/packages/select/test/visual/base/select.test.js
@@ -0,0 +1,147 @@
+import { sendKeys } from '@vaadin/test-runner-commands';
+import { fixtureSync, nextFrame } from '@vaadin/testing-helpers';
+import { visualDiff } from '@web/test-runner-visual-regression';
+import '../common.js';
+import '@vaadin/item/src/vaadin-lit-item.js';
+import '@vaadin/list-box/src/vaadin-lit-list-box.js';
+import '../../../src/vaadin-lit-select.js';
+
+describe('select', () => {
+ let div, element;
+
+ beforeEach(() => {
+ div = document.createElement('div');
+ div.style.display = 'inline-block';
+ div.style.padding = '10px';
+ element = fixtureSync('', div);
+ element.items = [
+ { label: 'item 1', value: 'value-1' },
+ { label: 'item 2', value: 'value-2' },
+ { label: 'item 3', value: 'value-3' },
+ ];
+ });
+
+ describe('states', () => {
+ it('basic', async () => {
+ await visualDiff(div, 'state-basic');
+ });
+
+ it('placeholder', async () => {
+ element.placeholder = 'Placeholder';
+ await visualDiff(div, 'state-placeholder');
+ });
+
+ it('disabled', async () => {
+ element.disabled = true;
+ await visualDiff(div, 'state-disabled');
+ });
+
+ it('readonly', async () => {
+ element.readonly = true;
+ await visualDiff(div, 'state-readonly');
+ });
+
+ it('required', async () => {
+ element.label = 'Label';
+ element.required = true;
+ await visualDiff(div, 'state-required');
+ });
+
+ it('focus', async () => {
+ await sendKeys({ press: 'Tab' });
+ await visualDiff(div, 'state-focus');
+ });
+
+ it('opened', async () => {
+ div.style.height = '200px';
+ div.style.width = '200px';
+ await sendKeys({ press: 'Tab' });
+ element.opened = true;
+ await nextFrame();
+ await visualDiff(div, 'state-opened');
+ });
+ });
+
+ describe('value', () => {
+ it('value', async () => {
+ element.value = 'value-1';
+ await visualDiff(div, 'value');
+ });
+
+ it('disabled value', async () => {
+ element.disabled = true;
+ element.value = 'value-1';
+ await visualDiff(div, 'value-disabled');
+ });
+
+ it('opened value', async () => {
+ div.style.height = '200px';
+ div.style.width = '200px';
+ element.value = 'value-1';
+ await sendKeys({ press: 'Tab' });
+ element.opened = true;
+ await nextFrame();
+ await visualDiff(div, 'value-opened');
+ });
+
+ it('overflow', async () => {
+ element.renderer = (root) => {
+ root.innerHTML = `
+
+ Very long item text content
+
+ `;
+ };
+ element.value = 'long';
+ await visualDiff(div, 'value-overflow');
+ });
+
+ it('multiline', async () => {
+ element.renderer = (root) => {
+ root.innerHTML = `
+
+
+
+ Line 1
+
+ Line 2
+
+
+
+ `;
+ };
+ element.value = 'custom';
+ await visualDiff(div, 'value-multiline');
+ });
+ });
+
+ describe('features', () => {
+ it('error message', async () => {
+ element.label = 'Label';
+ element.errorMessage = 'This field is required';
+ element.required = true;
+ element.validate();
+ await visualDiff(div, 'feature-error-message');
+ });
+
+ it('helper text', async () => {
+ element.helperText = 'Helper text';
+ await visualDiff(div, 'feature-helper-text');
+ });
+
+ it('helper above field', async () => {
+ element.label = 'Label';
+ element.helperText = 'Helper text';
+ element.setAttribute('theme', 'helper-above-field');
+ await visualDiff(div, 'feature-helper-above-field');
+ });
+
+ it('prefix', async () => {
+ const span = document.createElement('span');
+ span.setAttribute('slot', 'prefix');
+ span.textContent = '$';
+ element.appendChild(span);
+ await visualDiff(div, 'feature-prefix');
+ });
+ });
+});