ricksonoliveira

ricksonoliveira

Use open_browser() in tests when using WSL

Has anyone by any chance using WSL tried to use open_browser in your tests?

I’ve heard one could do something like open_browser(lv, &System.cmd("wslview", [&1])). But I have no idea how to make WSL or Elixir know how to open my default browser.

Has anyone gone through this and have been victorious? :rofl:

Thanks!

Marked As Solved

slouchpie

slouchpie

I tried using my answer today and it needed improvement because CSS was not being loaded.

I have a hacky way of making the CSS work (which is better than no way).

First, use this slightly better open_browser_wsl function.

      def open_browser_wsl(view) do
        Phoenix.LiveViewTest.open_browser(view, fn html_unix_path ->
          drive_dir = "/c"
          {wsl_path, 0} = System.cmd("wslpath", ["-aw", html_unix_path])
          cmd_args = [drive_dir, "start", String.trim_trailing(wsl_path), drive_dir, "zsh"]
          opts = [cd: "/mnt" <> drive_dir]
          System.cmd("cmd.exe", cmd_args, opts)
        end)
      end

It is better for 2 reasons:

  1. It changes directory so there is no more annoying warning about not being a Windows path.
  2. It makes the drive letter clearly customizable, in case that is necessary.

I usually just slap that function into the block of code in conn_case.ex that starts with:

  using do
    quote do

With the function inside the using block, any test that has use MyAppWeb.ConnCase will be able to call open_browser_wsl(view).

Now for the CSS. Configure the test Endpoint so that static URLs can be resolved. In config/text.exs, add this:

static_url_path =
  try do
    {windows_static_path, 0} = System.cmd("wslpath", ["-aw", "priv/static"])

    windows_static_path
    |> String.trim()
    |> String.trim_leading("\\")
    |> String.replace("\\", "/")
    |> then(&Kernel.<>("file://", &1))
  rescue
      # revert to default path if command not found, else re-raise the error
      e in ErlangError -> if e.original == :enoent, do: "/", else: reraise(e, __STACKTRACE__)
  end

and then finally tell the Endpoint (still in the test config file) to use this static path:

config :my_app, RangerWeb.Endpoint,
  # ...
  static_url: [host: "localhost", path: static_url_path]

The try/rescue block is to make sure people who don’t use WSL can still run tests.

It’s hacky, for sure, but now CSS will be loaded.

@ricksonoliveira Please mark this answer as the solution. It is better than my previous answer.

Also Liked

slouchpie

slouchpie

I had some success with this:

  def open_browser_wsl(view) do
    Phoenix.LiveViewTest.open_browser(view, fn html_unix_path ->
      {wsl_path, 0} = System.cmd("wslpath", ["-aw", html_unix_path])
      cmd_args = ["/C", "start", String.trim_trailing(wsl_path), "/C", "bash"]
      System.cmd("cmd.exe", cmd_args)
    end)
  end
chgeuer

chgeuer

Not referring to tests in particular, but on WSL, you can run applications “on the Windows side”, such as cmd.exe. cmd.exe allows you to provide a shell command.

In Bash for example, you can do something like this:

cmd.exe /C "start https://elixirforum.com/"

# or
cmd.exe /C "start $( echo "https://jwt.ms/#access_token=${access_token}" )"

In Elixir, this might be a start:

System.cmd("cmd.exe", ["/C", "start https://elixirforum.com/"])

However, escaping stuff the right way can always be ‘difficult’ (https://flatt.tech/research/posts/batbadbut-you-cant-securely-execute-commands-on-windows/)

Where Next?

Popular in Questions Top

greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
nobody
Hi! In PHP: $SERVER['SERVERADDR'] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New

Other popular topics Top

chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 43591 214
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52238 488
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement