diff --git a/browser_tests/assets/execution/partial_execution.json b/browser_tests/assets/execution/partial_execution.json
new file mode 100644
index 000000000..5685ab814
--- /dev/null
+++ b/browser_tests/assets/execution/partial_execution.json
@@ -0,0 +1,85 @@
+{
+ "id": "1a95532f-c8aa-4c9d-a7f6-f928ba2d4862",
+ "revision": 0,
+ "last_node_id": 4,
+ "last_link_id": 3,
+ "nodes": [
+ {
+ "id": 4,
+ "type": "PreviewAny",
+ "pos": [946.2566528320312, 598.4373168945312],
+ "size": [140, 76],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "source",
+ "type": "*",
+ "link": 3
+ }
+ ],
+ "outputs": [],
+ "properties": {
+ "Node name for S&R": "PreviewAny"
+ },
+ "widgets_values": []
+ },
+ {
+ "id": 1,
+ "type": "PreviewAny",
+ "pos": [951.0236206054688, 421.3861083984375],
+ "size": [140, 76],
+ "flags": {},
+ "order": 1,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "source",
+ "type": "*",
+ "link": 2
+ }
+ ],
+ "outputs": [],
+ "properties": {
+ "Node name for S&R": "PreviewAny"
+ },
+ "widgets_values": []
+ },
+ {
+ "id": 3,
+ "type": "PrimitiveString",
+ "pos": [575.1760864257812, 504.5214538574219],
+ "size": [270, 58],
+ "flags": {},
+ "order": 0,
+ "mode": 0,
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "STRING",
+ "type": "STRING",
+ "links": [2, 3]
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "PrimitiveString"
+ },
+ "widgets_values": ["foo"]
+ }
+ ],
+ "links": [
+ [2, 3, 0, 1, 0, "*"],
+ [3, 3, 0, 4, 0, "*"]
+ ],
+ "groups": [],
+ "config": {},
+ "extra": {
+ "frontendVersion": "1.19.1",
+ "ds": {
+ "offset": [400, 400],
+ "scale": 1
+ }
+ },
+ "version": 0.4
+}
diff --git a/browser_tests/tests/execution.spec.ts b/browser_tests/tests/execution.spec.ts
index 1352d792f..4adab98b6 100644
--- a/browser_tests/tests/execution.spec.ts
+++ b/browser_tests/tests/execution.spec.ts
@@ -18,3 +18,27 @@ test.describe('Execution', () => {
)
})
})
+
+test.describe('Execute to selected output nodes', () => {
+ test('Execute to selected output nodes', async ({ comfyPage }) => {
+ await comfyPage.loadWorkflow('execution/partial_execution')
+ const input = await comfyPage.getNodeRefById(3)
+ const output1 = await comfyPage.getNodeRefById(1)
+ const output2 = await comfyPage.getNodeRefById(4)
+ expect(await (await input.getWidget(0)).getValue()).toBe('foo')
+ expect(await (await output1.getWidget(0)).getValue()).toBe('')
+ expect(await (await output2.getWidget(0)).getValue()).toBe('')
+
+ await output1.click('title')
+
+ await comfyPage.executeCommand('Comfy.QueueSelectedOutputNodes')
+ // @note: Wait for the execution to finish. We might want to move to a more
+ // reliable way to wait for the execution to finish. Workflow in this test
+ // is simple enough that this is fine for now.
+ await comfyPage.page.waitForTimeout(200)
+
+ expect(await (await input.getWidget(0)).getValue()).toBe('foo')
+ expect(await (await output1.getWidget(0)).getValue()).toBe('foo')
+ expect(await (await output2.getWidget(0)).getValue()).toBe('')
+ })
+})
diff --git a/src/components/graph/SelectionToolbox.vue b/src/components/graph/SelectionToolbox.vue
index 2c36a6c2a..122d270c8 100644
--- a/src/components/graph/SelectionToolbox.vue
+++ b/src/components/graph/SelectionToolbox.vue
@@ -6,6 +6,7 @@
content: 'p-0 flex flex-row'
}"
>
+