Skip to main content

Execute on Instance

Executes a browser operation on a specific instance without changing the active instance, providing direct control over which instance performs the operation.

Syntax​

const result = await codebolt.executeOnInstance(instanceId, operation, params);

Parameters​

  • instanceId (string): The unique identifier of the browser instance to execute on
  • operation (string): The name of the browser operation to execute
  • params (any): Parameters for the operation (varies by operation)

Supported Operations​

  • "goToPage": Navigate to a URL
    • params.url (string): URL to navigate to
  • "screenshot": Take a screenshot
    • params.fullPage (boolean, optional): Full page screenshot
    • params.quality (number, optional): Image quality (0-100)
    • params.format (string, optional): Image format ('png' | 'jpeg')
  • "getContent": Extract page content
    • No additional parameters required

Return Value​

Returns a promise that resolves to the result of the operation, which varies by operation type.

Examples​

Execute Navigation on Specific Instance​

import codebolt from '@codebolt/codeboltjs';

const instanceId = "browser-1234567890-abc123";

// Navigate to a URL on specific instance without changing active instance
const result = await codebolt.executeOnInstance(
instanceId,
"goToPage",
{ url: "https://example.com" }
);

console.log('Navigation result:', result);

Take Screenshot on Background Instance​

async function captureAllInstances() {
const instances = await codebolt.listBrowserInstances();
const screenshots = [];

for (const instance of instances) {
try {
const screenshot = await codebolt.executeOnInstance(
instance.instanceId,
"screenshot",
{ fullPage: true, quality: 90 }
);

screenshots.push({
instanceId: instance.instanceId,
url: instance.currentUrl,
screenshot: screenshot.payload.screenshot
});

} catch (error) {
console.error(`Failed to capture ${instance.instanceId}:`, error.message);
}
}

return screenshots;
}

// Usage
const allScreenshots = await captureAllInstances();
console.log(`Captured ${allScreenshots.length} screenshots`);

Parallel Operations on Multiple Instances​

async function parallelNavigation(urls) {
// Create instances for each URL
const instances = await Promise.all(
urls.map((url, index) =>
codebolt.openNewBrowserInstance({
instanceId: `parallel-${index}`,
setActive: false
})
)
);

// Navigate all instances in parallel
const navigationPromises = instances.map((instance, index) =>
codebolt.executeOnInstance(
instance.instanceId,
"goToPage",
{ url: urls[index] }
)
);

const results = await Promise.all(navigationPromises);

console.log(`Navigated ${results.length} instances in parallel`);

// Cleanup
for (const instance of instances) {
await codebolt.closeBrowserInstance(instance.instanceId);
}

return results;
}

// Usage
const urls = [
"https://example.com",
"https://google.com",
"https://github.com"
];

const results = await parallelNavigation(urls);

Content Extraction from Multiple Instances​

async function extractContentFromAllInstances() {
const instances = await codebolt.listBrowserInstances();
const contentData = [];

for (const instance of instances) {
try {
const content = await codebolt.executeOnInstance(
instance.instanceId,
"getContent",
{}
);

contentData.push({
instanceId: instance.instanceId,
url: instance.currentUrl,
title: instance.title,
content: content.payload.content,
extractedAt: new Date().toISOString()
});

} catch (error) {
console.error(`Failed to extract content from ${instance.instanceId}:`, error.message);
}
}

return contentData;
}

// Usage
const allContent = await extractContentFromAllInstances();
console.log(`Extracted content from ${allContent.length} instances`);

Instance-Specific Operation Wrapper​

class InstanceOperationExecutor {
constructor(instanceId) {
this.instanceId = instanceId;
}

async navigate(url) {
return await codebolt.executeOnInstance(
this.instanceId,
"goToPage",
{ url }
);
}

async screenshot(options = {}) {
return await codebolt.executeOnInstance(
this.instanceId,
"screenshot",
options
);
}

async getContent() {
return await codebolt.executeOnInstance(
this.instanceId,
"getContent",
{}
);
}

async executeCustom(operation, params) {
return await codebolt.executeOnInstance(
this.instanceId,
operation,
params
);
}
}

// Usage
const executor = new InstanceOperationExecutor("browser-1234567890-abc123");

await executor.navigate("https://example.com");
const screenshot = await executor.screenshot({ fullPage: true });
const content = await executor.getContent();

Batch Operations with Error Handling​

async function batchOperationOnInstances(instanceIds, operation, params) {
const results = [];
const errors = [];

// Execute operations in parallel with error handling
const promises = instanceIds.map(async (instanceId) => {
try {
const result = await codebolt.executeOnInstance(instanceId, operation, params);
return { instanceId, success: true, result };
} catch (error) {
return { instanceId, success: false, error: error.message };
}
});

const batchResults = await Promise.all(promises);

// Separate successful and failed operations
batchResults.forEach(result => {
if (result.success) {
results.push(result);
} else {
errors.push(result);
}
});

console.log(`Batch operation completed: ${results.length} successful, ${errors.length} failed`);

return { results, errors };
}

// Usage
const instanceIds = ["browser-123", "browser-456", "browser-789"];

const { results, errors } = await batchOperationOnInstances(
instanceIds,
"screenshot",
{ fullPage: false }
);

console.log(`Successfully captured ${results.length} screenshots`);
if (errors.length > 0) {
console.log(`Failed to capture ${errors.length} screenshots`);
}

Operation Queue for Instance​

class InstanceOperationQueue {
constructor(instanceId) {
this.instanceId = instanceId;
this.queue = [];
this.processing = false;
}

async add(operation, params) {
return new Promise((resolve, reject) => {
this.queue.push({ operation, params, resolve, reject });
this.processQueue();
});
}

async processQueue() {
if (this.processing || this.queue.length === 0) {
return;
}

this.processing = true;

while (this.queue.length > 0) {
const { operation, params, resolve, reject } = this.queue.shift();

try {
const result = await codebolt.executeOnInstance(
this.instanceId,
operation,
params
);
resolve(result);
} catch (error) {
reject(error);
}
}

this.processing = false;
}

async navigate(url) {
return await this.add("goToPage", { url });
}

async screenshot(options) {
return await this.add("screenshot", options);
}

async getContent() {
return await this.add("getContent", {});
}
}

// Usage
const queue = new InstanceOperationQueue("browser-1234567890-abc123");

// Queue multiple operations - they'll execute sequentially
await queue.navigate("https://example.com");
await queue.screenshot({ fullPage: true });
await queue.getContent();

Use Cases​

Background Operations​

Perform operations on instances without disturbing the active instance.

Parallel Processing​

Execute operations on multiple instances simultaneously.

Isolated Testing​

Run tests on specific instances without affecting others.

Content Aggregation​

Extract content from multiple instances at once.

Batch Operations​

Perform the same operation across multiple instances.

Error Handling​

async function safeExecuteOnInstance(instanceId, operation, params) {
try {
// Verify instance exists first
const instance = await codebolt.getBrowserInstance(instanceId);
if (!instance) {
throw new Error(`Instance ${instanceId} not found`);
}

if (!instance.isReady) {
throw new Error(`Instance ${instanceId} is not ready`);
}

// Execute operation
const result = await codebolt.executeOnInstance(instanceId, operation, params);

console.log(`✅ Successfully executed ${operation} on ${instanceId}`);
return result;

} catch (error) {
console.error(`❌ Failed to execute ${operation} on ${instanceId}:`, error.message);
throw error;
}
}

Notes​

  • No Active Instance Change: Does not modify which instance is currently active
  • Direct Execution: Operates directly on the specified instance
  • Operation Support: Only supports predefined operations (goToPage, screenshot, getContent)
  • Error Propagation: Errors from the operation are propagated to the caller
  • Concurrent Safe: Can be called concurrently on different instances

Best Practices​

  1. Instance Validation: Verify instance exists before executing operations
  2. Error Handling: Handle operation failures gracefully
  3. Parallel Operations: Use Promise.all for concurrent operations on different instances
  4. Resource Management: Close instances when no longer needed
  5. Operation Limits: Be aware of supported operations and their parameters