CastTab and CastDesktop drive Chrome's built-in cast feature to send a tab or the whole desktop to a network device such as a smart TV, then StopCasting ends the session. The workflow also shows the common (IBrowser)/(Browser) cast pattern of looping over AutomationEngine and skipping engines that don't support a given feature.
Here's the whole workflow, start to finish. Each piece is broken down and explained below.
using GenerallyPositive;
using GenerallyPositive.Browser;
using static GenerallyPositive.Enums;
GPAL
.WithPublishToConsole()
.WithDriverLocation(@"C:drivers");
IBrowser browser = GPAL.Browser
.WithBrowserType(BrowserType.Chrome)
.WithUseAutomationEngine(AutomationEngine.Selenium)
.ToGPALObject();
browser
.GoTo("https://www.youtube.com/watch?v=example")
.CastTab("Living Room TV")
.WaitFor(30_000)
.StopCasting();
browser
.GoTo("https://www.youtube.com/watch?v=example")
.CastDesktop("Living Room TV")
.WaitFor(30_000);
browser.Close(true);
Casting relies on Chrome's native cast menu, so this workflow uses BrowserType.Chrome with the Selenium automation engine - the engine that talks directly to a real chromedriver session capable of reaching Chrome's cast UI.
GPAL
.WithPublishToConsole()
.WithDriverLocation(@"C:drivers");
IBrowser browser = GPAL.Browser
.WithBrowserType(BrowserType.Chrome)
.WithUseAutomationEngine(AutomationEngine.Selenium)
.ToGPALObject();
GoTo loads the page you want to cast, CastTab("Living Room TV") opens Chrome's cast menu and casts the current tab to the named device, WaitFor gives the cast time to play, and StopCasting ends the cast session cleanly.
browser
.GoTo("https://www.youtube.com/watch?v=example")
.CastTab("Living Room TV")
.WaitFor(30_000)
.StopCasting();
The string passed to CastTab and CastDesktop must match the device name as it appears in Chrome's cast device list - check the device's display name on your network before hardcoding it.
CastDesktop works the same way as CastTab but casts the entire desktop instead of just the tab. This is useful for content that doesn't play nicely inside a single browser tab, at the cost of casting everything visible on screen.
browser
.GoTo("https://www.youtube.com/watch?v=example")
.CastDesktop("Living Room TV")
.WaitFor(30_000);
browser.Close(true);
Unlike CastTab, CastDesktop shares whatever is visible on the monitor for the duration of the cast - close sensitive windows before running this in an unattended environment.
The real CastTest program loops over every AutomationEngine value and uses a switch with continue to skip engines that don't support cast operations, running the cast workflow only for engines like Selenium and PuppeteerPort that do.
Array automationEngines = Enum.GetValues(typeof(AutomationEngine));
foreach (AutomationEngine ae in automationEngines)
{
switch (ae)
{
case AutomationEngine.Selenium:
case AutomationEngine.PuppeteerPort:
break;
default:
continue;
}
IBrowser browser = GPAL.Browser.WithBrowserType(BrowserType.Chrome).WithUseAutomationEngine(ae).ToGPALObject();
// cast workflow here
browser.Close(true);
}
Showing off some plain text in these paragraphs eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo veniam mollitia excepturi animi eum illum non libero sapiente provident assumenda, delectus voluptatum nobis sed dolorem adipisci laudantium incidunt. Error, ratione?
Here you can find different accents and emphasis sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
This is a link and how it could look like bestlinkinthebeautifulworld. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Here's just some classic bold text adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam notBoldSecondbestlinkinthebeautifulworld illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Obcaecati, iste distinctio veritatis eligendi laboriosam adipisicing elit illo nostrum corporis at adipisicing elit libero vel voluptas? Expedita, adipisicing facere dolores voluptatem ad ab rem assumenda soluta!
Other cuple of colors in case we want to emphasize several ways adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam adipisicing elit illo nostrum corporis at voluptatem libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta! Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quod veniam, quam ad expedita laborum sed at voluptates culpa ipsam ut vel. Ullam temporibus a mollitia quod aliquam ratione exercitationem nesciunt.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta! Lorem ipsum dolor, sit amet consectetur adipisicing elit. Quod veniam, quam ad expedita laborum sed at voluptates culpa ipsam ut vel. Ullam temporibus a mollitia quod aliquam ratione exercitationem nesciunt.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Obcaecati, iste distinctio veritatis eligendi laboriosam illo nostrum corporis at libero vel voluptas? Expedita, facere dolores voluptatem ad ab rem assumenda soluta!
Lorem ipsum dolor sit amet consectetur adipisicing elit. Repudiandae quas consequuntur illo numquam assumenda autem exercitationem distinctio perspiciatis in natus. Eius dicta similique ipsam ipsa minima, nemo quae enim tempore.
GPAL
.CallIfNotFound(GenericCallIfNotFound)
.WithPublishToConsole();
//System.Drawing.Rectangle windowSize = new System.Drawing.Rectangle(10, 10, 1500, 1024);
// NOTE: we have to set browser = before we execute any steps
// this is due to the 'GenericCallIfNotFound' which might throw an exception, and BankScraper will not have the browser set when it calls scraper.Close()
// until the complete fluent line gets executed (meaning every step, meaning browser is not set until everything else succeeds)
browser = GPAL.Browser
.WithBrowserType(Enums.BrowserType.Chrome)
.WithProfileDataDirectory(ChromeProfileLocation)
.WithUseAutomationEngine(AutomationEngine.Selenium)
.WithWindowSize(new System.Drawing.Rectangle(0,0,1920,1080))
.ToGPALObject();