or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

application-launching.mdbrowser-configuration.mddevtools-protocol.mdindex.mdmedia-casting.mdnetwork-conditions.mdpermissions-management.mdservice-management.mdwebdriver-operations.md

media-casting.mddocs/

0

# Media Casting

1

2

Media casting capabilities allow applications to discover, connect to, and stream content to Cast-enabled devices such as Chromecast, Android TV, and other Cast receivers.

3

4

## Cast Device Discovery

5

6

### Get Available Cast Sinks

7

8

Retrieve list of available Cast devices on the network.

9

10

```java { .api }

11

public List<Map<String, String>> getCastSinks();

12

```

13

14

**Returns:** List<Map<String, String>> - List of available cast devices with ID and name pairs

15

16

**Usage Example:**

17

```java

18

// ChromiumDriver is typically used through subclasses like ChromeDriver, EdgeDriver

19

ChromiumDriver driver = ...; // Obtain from ChromeDriver, EdgeDriver, etc.

20

21

// Get available cast devices

22

List<Map<String, String>> castSinks = driver.getCastSinks();

23

for (Map<String, String> sink : castSinks) {

24

String deviceId = sink.get("id");

25

String deviceName = sink.get("name");

26

System.out.println("Found device: " + deviceName + " (ID: " + deviceId + ")");

27

}

28

```

29

30

## Cast Device Selection

31

32

### Select Cast Sink

33

34

Select a Cast device as the target for media operations.

35

36

```java { .api }

37

public void selectCastSink(String deviceName);

38

```

39

40

**Parameters:**

41

- `deviceName` (String): Name of the target Cast device

42

43

**Usage Example:**

44

```java

45

// Select a specific cast device

46

driver.selectCastSink("Living Room TV");

47

48

// Or select using device discovered from getCastSinks()

49

List<Map<String, String>> sinks = driver.getCastSinks();

50

if (!sinks.isEmpty()) {

51

String firstDevice = sinks.get(0).get("name");

52

driver.selectCastSink(firstDevice);

53

}

54

```

55

56

## Screen Mirroring

57

58

### Start Desktop Mirroring

59

60

Mirror the entire desktop to a Cast device.

61

62

```java { .api }

63

public void startDesktopMirroring(String deviceName);

64

```

65

66

**Parameters:**

67

- `deviceName` (String): Name of the target Cast device

68

69

**Usage Example:**

70

```java

71

// Start mirroring desktop to Cast device

72

driver.startDesktopMirroring("Living Room TV");

73

74

// Application continues running while desktop is mirrored

75

// User can see desktop content on the Cast device

76

```

77

78

### Start Tab Mirroring

79

80

Mirror the current browser tab to a Cast device.

81

82

```java { .api }

83

public void startTabMirroring(String deviceName);

84

```

85

86

**Parameters:**

87

- `deviceName` (String): Name of the target Cast device

88

89

**Usage Example:**

90

```java

91

// Navigate to content to cast

92

driver.get("https://video-streaming-site.com");

93

94

// Start mirroring current tab

95

driver.startTabMirroring("Bedroom Chromecast");

96

97

// The current tab content will be displayed on the Cast device

98

```

99

100

### Stop Casting

101

102

Stop active casting session to a specific device.

103

104

```java { .api }

105

public void stopCasting(String deviceName);

106

```

107

108

**Parameters:**

109

- `deviceName` (String): Name of the Cast device to stop casting to

110

111

**Usage Example:**

112

```java

113

// Stop casting to specific device

114

driver.stopCasting("Living Room TV");

115

116

// Or stop all active casting sessions

117

List<Map<String, String>> sinks = driver.getCastSinks();

118

for (Map<String, String> sink : sinks) {

119

driver.stopCasting(sink.get("name"));

120

}

121

```

122

123

## Error Handling and Monitoring

124

125

### Get Cast Issue Message

126

127

Retrieve any error messages from active Cast sessions.

128

129

```java { .api }

130

public String getCastIssueMessage();

131

```

132

133

**Returns:** String - Error message if there are Cast session issues, empty string otherwise

134

135

**Usage Example:**

136

```java

137

// Check for casting issues

138

String issueMessage = driver.getCastIssueMessage();

139

if (!issueMessage.isEmpty()) {

140

System.err.println("Cast error: " + issueMessage);

141

142

// Handle the error (retry, select different device, etc.)

143

driver.stopCasting("Problem Device");

144

}

145

```

146

147

## Complete Casting Workflow

148

149

```java

150

import org.openqa.selenium.chromium.ChromiumDriver;

151

import java.util.List;

152

import java.util.Map;

153

154

public class CastingExample {

155

public void demonstrateCasting() {

156

ChromiumDriver driver = new ChromiumDriver(commandExecutor, capabilities, "chrome");

157

158

try {

159

// Discover available Cast devices

160

List<Map<String, String>> devices = driver.getCastSinks();

161

if (devices.isEmpty()) {

162

System.out.println("No Cast devices found");

163

return;

164

}

165

166

// Display available devices

167

System.out.println("Available Cast devices:");

168

for (int i = 0; i < devices.size(); i++) {

169

Map<String, String> device = devices.get(i);

170

System.out.println((i + 1) + ". " + device.get("name"));

171

}

172

173

// Select first available device

174

String deviceName = devices.get(0).get("name");

175

driver.selectCastSink(deviceName);

176

177

// Navigate to content

178

driver.get("https://video-site.com/video/12345");

179

180

// Start tab mirroring

181

driver.startTabMirroring(deviceName);

182

183

// Monitor for issues

184

Thread.sleep(5000); // Wait for casting to establish

185

String issues = driver.getCastIssueMessage();

186

if (!issues.isEmpty()) {

187

System.err.println("Casting issues: " + issues);

188

}

189

190

// Continue with test or user interaction

191

// ...

192

193

// Stop casting when done

194

driver.stopCasting(deviceName);

195

196

} catch (Exception e) {

197

System.err.println("Casting failed: " + e.getMessage());

198

} finally {

199

driver.quit();

200

}

201

}

202

}

203

```

204

205

## Cast Command Constants

206

207

```java { .api }

208

// Command constants from AddHasCasting

209

public static final String GET_CAST_SINKS = "getCastSinks";

210

public static final String SET_CAST_SINK_TO_USE = "selectCastSink";

211

public static final String START_CAST_TAB_MIRRORING = "startCastTabMirroring";

212

public static final String START_CAST_DESKTOP_MIRRORING = "startDesktopMirroring";

213

public static final String GET_CAST_ISSUE_MESSAGE = "getCastIssueMessage";

214

public static final String STOP_CASTING = "stopCasting";

215

```

216

217

## Testing Cast-Enabled Applications

218

219

### Test Cast Button Functionality

220

221

```java

222

// Navigate to a Cast-enabled web application

223

driver.get("https://youtube.com/watch?v=example");

224

225

// Verify cast button is present

226

WebElement castButton = driver.findElement(By.className("ytp-cast-button"));

227

assertTrue(castButton.isDisplayed());

228

229

// Get available devices before clicking

230

List<Map<String, String>> devicesBeforeClick = driver.getCastSinks();

231

232

// Click cast button in application

233

castButton.click();

234

235

// Verify application shows available devices

236

// (Application-specific verification logic)

237

```

238

239

### Test Cast Session Management

240

241

```java

242

// Start casting

243

driver.selectCastSink("Test Device");

244

driver.startTabMirroring("Test Device");

245

246

// Verify no error messages

247

String issues = driver.getCastIssueMessage();

248

assertEquals("", issues);

249

250

// Navigate to different content while casting

251

driver.get("https://another-video-site.com");

252

253

// Verify casting continues (no new error messages)

254

issues = driver.getCastIssueMessage();

255

assertEquals("", issues);

256

257

// Stop casting and verify

258

driver.stopCasting("Test Device");

259

```

260

261

## Network Requirements

262

263

Cast functionality requires:

264

265

1. **Network Discovery**: Chrome must be able to discover Cast devices on the local network

266

2. **Multicast DNS**: mDNS must be enabled for device discovery

267

3. **Network Permissions**: Appropriate network access permissions

268

4. **Same Network**: Cast devices and Chrome must be on the same network segment

269

270

## Limitations and Considerations

271

272

1. **Null Handling**: Methods return empty collections/strings when casting is not available

273

2. **Device Availability**: Cast devices may appear and disappear based on network conditions

274

3. **Session Management**: Only one casting session per device is typically supported

275

4. **Content Restrictions**: Some content may have casting restrictions (DRM, etc.)

276

5. **Network Dependencies**: Casting requires stable network connectivity

277

6. **Chrome Version**: Casting features may vary between Chrome versions

278

279

## Error Scenarios

280

281

Common error conditions:

282

283

- **No Devices Found**: Network issues or no Cast devices on network

284

- **Device Unavailable**: Selected device goes offline or becomes unavailable

285

- **Content Restrictions**: Content provider blocks casting

286

- **Network Issues**: Intermittent connectivity affects casting quality

287

288

```java

289

// Robust casting with error handling

290

public boolean safeCast(ChromiumDriver driver, String deviceName, String url) {

291

try {

292

// Verify device is available

293

List<Map<String, String>> devices = driver.getCastSinks();

294

boolean deviceFound = devices.stream()

295

.anyMatch(device -> deviceName.equals(device.get("name")));

296

297

if (!deviceFound) {

298

System.err.println("Device not found: " + deviceName);

299

return false;

300

}

301

302

// Navigate and start casting

303

driver.get(url);

304

driver.selectCastSink(deviceName);

305

driver.startTabMirroring(deviceName);

306

307

// Check for immediate issues

308

Thread.sleep(2000);

309

String issues = driver.getCastIssueMessage();

310

if (!issues.isEmpty()) {

311

System.err.println("Cast issues: " + issues);

312

driver.stopCasting(deviceName);

313

return false;

314

}

315

316

return true;

317

318

} catch (Exception e) {

319

System.err.println("Casting error: " + e.getMessage());

320

try {

321

driver.stopCasting(deviceName);

322

} catch (Exception stopError) {

323

// Ignore stop errors

324

}

325

return false;

326

}

327

}

328

```

329

330

## Best Practices

331

332

1. **Device Verification**: Always verify devices are available before attempting to cast

333

2. **Error Monitoring**: Regularly check for cast issues during sessions

334

3. **Graceful Cleanup**: Always stop casting sessions when tests complete

335

4. **Network Stability**: Ensure stable network conditions for reliable casting

336

5. **Content Compatibility**: Verify content supports casting before starting sessions

337

6. **Session Management**: Handle multiple device scenarios appropriately

338

7. **User Experience**: Consider the user experience on both the browser and Cast device