LambdaTest migrations usually start with capability cleanup. Tests often keep the same WebDriver or Appium logic, but the LT:Options payload, tunnel assumptions, and remote endpoint need to be replaced with the webmate equivalents.
What Changes First
- Remove
LT:Options, LambdaTest credentials, and LambdaTest-only metadata keys. - Point Selenium or Appium traffic to the webmate Selenium endpoint.
- Keep standard browser or Appium capabilities and add
wm:apikey, wm:project, and optional wm:* metadata. - Reconfigure Playwright and Cypress to use the same remote target through their webmate-specific entry points.
Selenium or WebDriver Migration
Use a plain remote WebDriver configuration and move all vendor-specific settings out of LT:Options:
1
2
3
4
5
6
7
8
| DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("browserName", "chrome");
caps.setCapability("browserVersion", "126");
caps.setCapability("platformName", "WINDOWS_11_64");
caps.setCapability("wm:apikey", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=");
caps.setCapability("wm:project", "7c4f09fd-xxx-xxx-xxx-xxx");
RemoteWebDriver driver = new RemoteWebDriver(new URL("https://selenium.webmate.io/wd/hub"), caps);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| const browser = await webdriverio.remote({
protocol: 'https',
hostname: 'selenium.webmate.io',
port: 443,
path: '/wd/hub',
capabilities: {
browserName: 'chrome',
browserVersion: '126',
platformName: 'WINDOWS_11_64',
'wm:apikey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=',
'wm:project': '7c4f09fd-xxx-xxx-xxx-xxx',
},
});
|
The same rule applies if your suite builds capabilities dynamically. Keep the standards-based keys, then re-add only the webmate metadata you still need.
Appium Migration
For mobile automation, remove LambdaTest-specific device or app-upload wrappers and keep the actual Appium capability set plus the wm:* keys:
1
2
3
4
5
6
7
8
9
10
| DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platformName", "Android_11");
caps.setCapability("browserName", "APPIUM");
caps.setCapability("wm:model", "Pixel 4");
caps.setCapability("wm:apikey", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=");
caps.setCapability("wm:project", "7c4f09fd-xxx-xxx-xxx-xxx");
caps.setCapability("appium:appPackage", "com.example.app");
caps.setCapability("appium:appActivity", "com.example.app.MainActivity");
AndroidDriver driver = new AndroidDriver(new URL("https://selenium.webmate.io/wd/hub"), caps);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| const driver = await webdriverio.remote({
protocol: 'https',
hostname: 'selenium.webmate.io',
port: 443,
path: '/wd/hub',
capabilities: {
platformName: 'Android_11',
browserName: 'APPIUM',
'wm:model': 'Pixel 4',
'wm:apikey': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=',
'wm:project': '7c4f09fd-xxx-xxx-xxx-xxx',
'appium:appPackage': 'com.example.app',
'appium:appActivity': 'com.example.app.MainActivity',
},
});
|
If your previous setup depended on tunnel-managed app access, validate the equivalent proxy or network setup in webmate before you parallelize the migrated suite.
Playwright Migration
Playwright stays lightweight. Replace the LambdaTest remote endpoint with the webmate Selenium endpoint and pass the new capabilities through the environment:
1
2
3
4
5
6
7
8
9
10
| export SELENIUM_REMOTE_URL="https://selenium.webmate.io/wd/hub"
export SELENIUM_REMOTE_CAPABILITIES='{
"browserName": "chrome",
"browserVersion": "126",
"platformName": "WINDOWS_11_64",
"wm:apikey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=",
"wm:project": "7c4f09fd-xxx-xxx-xxx-xxx"
}'
npx playwright test
|
Cypress Migration
For Cypress, move away from LambdaTest service configuration and use a local webmate-cypressbridge.conf file plus the bridge binary:
1
2
3
4
5
6
7
| user: "xxx@xxx.com"
apikey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
project: "7c4f09fd-xxx-xxx-xxx-xxx"
browser: chrome
version: 126
platform: WINDOWS_11_64
sessionTimeout: 6m
|
Helper: Translate LT:Options to webmate Metadata
Use this helper when your project still merges LambdaTest metadata into one object and you need a quick first-pass rewrite:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| function lambdaTestToWebmate(input) {
const caps = { ...input };
const ltOptions = caps['LT:Options'] || {};
delete caps['LT:Options'];
delete caps['user'];
delete caps['accessKey'];
if (ltOptions.name) caps['wm:name'] = ltOptions.name;
if (ltOptions.build) caps['wm:sessions'] = ltOptions.build;
if (ltOptions.tags) caps['wm:tags'] = [].concat(ltOptions.tags).join(', ');
caps['wm:apikey'] = process.env.WEBMATE_API_KEY;
caps['wm:project'] = process.env.WEBMATE_PROJECT_ID;
return caps;
}
console.log(JSON.stringify(lambdaTestToWebmate(JSON.parse(process.argv[2])), null, 2));
|
Use the output as a draft only. You still need to decide whether each former LambdaTest metadata field maps best to wm:name, wm:sessions, or wm:tags.
Next Steps