Search code examples
javaseleniumautomated-testswinium

Automation for "Chrome Legacy Window" (Chromium) using Winium


I'm trying to automate a Windows application GUI using Winium. The app is using both WPF windows and "Chrome Legacy Window" (Chromium) windows.

I'm using the tool "Automation Spy" to inspect the GUI elements' ids inside the WPF windows to use with Winium. Automation Spy can't inspect elements in the "Chrome Legacy Window" windows in the same manner that Winium can't access these elements.

"Chrome Legacy Window" is a WEB window, so it requires automation with Selenium.

How do I use Selenium to hook on a Chromium window, which is not a browser like Firefox, Chrome and similar?


Solution

  • "Remote Debugging Port" was the solution for my problem.

    1. I added the "remote-debugging-port=XXXX" to my CEF (Chromium Embedded Framework) command: https://blog.chromium.org/2011/05/remote-debugging-with-chrome-developer.html This allowed me to see and manage my app's CEF windows through localhost:XXXX.

    2. I used both Winium and Selenium to test my app. Winium for all my WPF windows and selenium for all my CEF windows. My GUI test starts with Winium Driver to open my app and navigate WPF windows. Each time I need to debug a CEF window, I'm opening a Chrome Driver using selenium with the "remote-debugging-port" argument, which allows me to click elements inside that window. When I'm finish with this chromium window I'm closing the selenium driver and continues with Winium.

    Use Selenium and Winium with IntelliJ IDEA

    Selenium is a portable framework for testing and automating web applications. Winium is a Selenium-based tool for testing and automating desktop applications on Windows. In order to use these modules inside IntelliJ IDEA project, follow these steps:

    1. Download selenium-server-standalone jar file (e.g. selenium-server-standalone-3.141.59.jar) https://www.seleniumhq.org/download/
    2. Download winium-webdriver jar file (e.g. winium-webdriver-0.1.0-1.jar) http://central.maven.org/maven2/com/github/2gis/winium/winium-webdriver/0.1.0-1/
    3. Add both jars to your project structure: File → Project Structure → Dependencies → +
    4. Now all Selenium and Winium imports should work. For example:

      import org.openqa.selenium.By;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.chrome.ChromeDriver;
      import org.openqa.selenium.chrome.ChromeOptions;
      import org.openqa.selenium.support.ui.ExpectedConditions;
      import org.openqa.selenium.support.ui.WebDriverWait;
      import org.openqa.selenium.winium.DesktopOptions;
      import org.openqa.selenium.winium.WiniumDriver;
      import org.openqa.selenium.winium.WiniumDriverService;
      

    Use ChromeDriver with Selenium

    Follow these steps:

    1. Install the Java JDK and add its bin directory to your system PATH variable.
    2. Create a directory that will contain all files. This tutorial uses c:\temp.
    3. Download ChromeDriver and extract it (e.g. chromedriver_win32.zip provides chomedriver.exe) https://sites.google.com/a/chromium.org/chromedriver/downloads
    4. Download selenium-server-standalone-X.X.X-alpha-1.zip (e.g. selenium-server-standalone-4.0.0-alpha-1.zip) http://selenium-release.storage.googleapis.com/index.html
    5. Download a CEF binary distribution client from Cefbuilds and extract (e.g. cef_binary_76.1.13+gf19c584+chromium-76.0.3809.132_windows64.tar.bz2) http://opensource.spotify.com/cefbuilds/index.html
    6. Your directory structure should now look similar to this:
    c:\temp\
      cef_binary_3.2171.1979_windows32_client\
        Release\
          cefclient.exe  (and other files)
      chromedriver.exe
      Example.java
      selenium-server-standalone-2.44.0.jar
    

    For more information you can read this wiki: https://bitbucket.org/chromiumembedded/cef/wiki/UsingChromeDriver.md

    Use WiniumDriver with Winium

    Follow these steps:

    1. Download the Winium.Desktop.Driver.zip and extract it to c:\temp https://github.com/2gis/Winium.Desktop/releases

    Java Code Example

    Start a winium driver and open your app:

    DesktopOptions desktopOption = new DesktopOptions();
    desktopOption.setApplicationPath("Path_to_your_app.exe");
    File drivePath = new File("C:\\temp\\Winium.Desktop.Driver.exe");
    WiniumDriverService service = new WiniumDriverService.Builder().usingDriverExecutable(drivePath).usingPort(9999).withVerbose(true).withSilent(false).buildDesktopService();
    service.start();
    WiniumDriver winiumDriver = WiniumDriver(service, desktopOption);
    

    Navigate and test WPF windows using winium. For example:

    winiumDriver.findElement(By.id("someElementID")).click();
    

    Create a ChromeOptions object which holds all needed selenium information such as chromium client and remote debugging port. Make sure to change the "XXXX" port to your remote debugging port.

    System.setProperty("webdriver.chrome.driver", "c:/temp/chromedriver.exe");
    ChromeOptions chromeOptions = new ChromeOptions();
    chromeOptions.setBinary("c:/temp/cef_binary_76.1.13+gf19c584+chromium-76.0.3809.132_windows64_client/Release/cefclient.exe");
    chromeOptions.addArguments("remote-debugging-port=XXXX");
    

    Open a chrome driver (selenium) using the chrome options object.

    WebDriver seleniumDriver = ChromeDriver(chromeOptions);
    

    Use element inside the chromium windows. For example:

    seleniumWait.until(ExpectedConditions.visibilityOfElementLocated(By.className("someButtonClassName")));
    seleniumDriver.findElement(By.className("someButtonClassName")).click();
    

    When you're done with the CEF window, close selenium driver and continue with the winium driver:

    seleniumDriver.quit();
    winiumDriver.findElement(By.id("someElementID")).click();
    

    Close main winium driver:

    winiumDriver.quit();