ricksonoliveira

ricksonoliveira

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!

Showing Posts 1 to 10

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://forum.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://forum.elixirforum.com/"])

However, escaping stuff the right way can always be ‘difficult’ (BatBadBut: You can't securely execute commands on Windows - GMO Flatt Security Research)

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
ricksonoliveira

ricksonoliveira OP

Nice this one worked!

The only problem is adding this function every time I need to open the browser :smile:

Will keep it in a notepad!

ricksonoliveira

ricksonoliveira OP

Good one! Kinda the same path I was trying with System.cmd

sodapopcan

sodapopcan

Just add a helper to your ConnCase :upside_down_face:

Otherwise, one of you should consider contributing this to PhoenixTest if it’s universal enough (I had to look up what WSL is so I don’t know anything here, but I did do some work around open_browser for that lib).

slouchpie

slouchpie

Do your test files have a line like this:

use MyAppWeb.ConnCase

?

If so, you can just write the function in test/support/conn_case.ex and then it will be available in all your live view tests.

slouchpie

slouchpie

Ah, yes. This. I am saying the same thing. :slight_smile:

slouchpie

slouchpie

I do not know if it is universal at all. It worked for me, one day. That’s all.
After that, all bets are off
I guarantee nothing!
Life is chaos! :wink:

ricksonoliveira

ricksonoliveira OP

That’s the function we would need to “contribute” to: phoenix_test/lib/phoenix_test/open_browser.ex at main · germsvel/phoenix_test · GitHub

Actually it’s a good idea to contribute, but I still know too little about what’s really going on behind it to contribute, so I’m gonna do some homework and.. who knows, right? :person_shrugging:

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.

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
itzmidinesh
Hi all, I’m working on a Phoenix project where I need to make external HTTP requests and I’m trying to choose between Req and HTTPoison....
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New
csmr
Hi all, I’m new here and would like to hear peoples views on my Elixir/Phoenix based game-engine! :smiley: Mutonex gamedesign was finish...
New
Stef-Verniers
Hello I’ve been coding in Elixir for almost two years now because of my current job where we implemented Elixir in our application. But ...
New

Other Trending Topics Top

dominicletz
Hey there, I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first. ...
New
raa-ziq
Hi everyone :waving_hand: I wanted to share something I’ve been building — NowBlind, a random chat app designed to help people discover ...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews