Skip to content

Commit cacc8a6

Browse files
authored
fix: beam metadata not set when using custom capabilities (#744)
1 parent 1c39c26 commit cacc8a6

4 files changed

Lines changed: 129 additions & 21 deletions

File tree

integration_test/chrome/capabilities_test.exs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,42 @@ defmodule Wallaby.Integration.CapabilitiesTest do
149149

150150
assert :ok = Wallaby.end_session(session)
151151
end
152+
153+
test "adds the beam metadata when it is present" do
154+
user_agent = "Mozilla/5.0"
155+
156+
defined_capabilities = %{
157+
chromeOptions: %{args: ["--headless", "--user-agent=#{user_agent}"]}
158+
}
159+
160+
expected_capabilities = %{
161+
chromeOptions: %{
162+
args: [
163+
"--headless",
164+
"--user-agent=#{user_agent}/BeamMetadata (g2gCZAACdjF0AAAAAW0AAAAEc29tZW0AAAAIbWV0YWRhdGE=)"
165+
]
166+
}
167+
}
168+
169+
Application.put_env(:wallaby, :chromedriver, capabilities: defined_capabilities)
170+
171+
create_session_fn = fn url, capabilities ->
172+
assert capabilities == expected_capabilities
173+
174+
WebdriverClient.create_session(url, capabilities)
175+
end
176+
177+
{:ok, session} =
178+
SessionCase.start_test_session(
179+
create_session_fn: create_session_fn,
180+
metadata: %{"some" => "metadata"}
181+
)
182+
183+
session
184+
|> visit("page_1.html")
185+
|> assert_has(Query.text("Page 1"))
186+
187+
assert :ok = Wallaby.end_session(session)
188+
end
152189
end
153190
end

integration_test/selenium/selenium_capabilities_test.exs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,50 @@ defmodule Wallaby.Integration.SeleniumCapabilitiesTest do
6363

6464
assert :ok = Wallaby.end_session(session)
6565
end
66+
67+
test "adds the beam metadata when it is present" do
68+
user_agent = "Mozilla/5.0"
69+
70+
defined_capabilities = %{
71+
browserName: "firefox",
72+
"moz:firefoxOptions": %{
73+
args: ["-headless"],
74+
prefs: %{
75+
"general.useragent.override" => user_agent
76+
}
77+
}
78+
}
79+
80+
expected_capabilities = %{
81+
browserName: "firefox",
82+
"moz:firefoxOptions": %{
83+
args: ["-headless"],
84+
prefs: %{
85+
"general.useragent.override" =>
86+
"#{user_agent}/BeamMetadata (g2gCZAACdjF0AAAAAW0AAAAEc29tZW0AAAAIbWV0YWRhdGE=)"
87+
}
88+
}
89+
}
90+
91+
Application.put_env(:wallaby, :selenium, capabilities: defined_capabilities)
92+
93+
create_session_fn = fn url, capabilities ->
94+
assert capabilities == expected_capabilities
95+
96+
WebdriverClient.create_session(url, capabilities)
97+
end
98+
99+
{:ok, session} =
100+
SessionCase.start_test_session(
101+
create_session_fn: create_session_fn,
102+
metadata: %{"some" => "metadata"}
103+
)
104+
105+
session
106+
|> visit("page_1.html")
107+
|> assert_has(Query.text("Page 1"))
108+
109+
assert :ok = Wallaby.end_session(session)
110+
end
66111
end
67112
end

lib/wallaby/chrome.ex

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,10 @@ defmodule Wallaby.Chrome do
337337
base_url = Chromedriver.base_url()
338338
create_session_fn = Keyword.get(opts, :create_session_fn, &WebdriverClient.create_session/2)
339339

340-
capabilities = Keyword.get(opts, :capabilities, capabilities_from_config(opts))
340+
capabilities =
341+
opts
342+
|> Keyword.get_lazy(:capabilities, fn -> capabilities_from_config(opts) end)
343+
|> put_beam_metadata(opts)
341344

342345
with {:ok, response} <- create_session_fn.(base_url, capabilities) do
343346
id = response["sessionId"]
@@ -361,7 +364,7 @@ defmodule Wallaby.Chrome do
361364
defp capabilities_from_config(opts) do
362365
:wallaby
363366
|> Application.get_env(:chromedriver, [])
364-
|> Keyword.get(:capabilities, default_capabilities(opts))
367+
|> Keyword.get_lazy(:capabilities, &default_capabilities/0)
365368
|> put_headless_config(opts)
366369
|> put_binary_config(opts)
367370
end
@@ -543,13 +546,7 @@ defmodule Wallaby.Chrome do
543546
defdelegate log(session_or_element), to: WebdriverClient
544547

545548
@doc false
546-
def default_capabilities(opts \\ []) do
547-
user_agent =
548-
Metadata.append(
549-
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
550-
opts[:metadata]
551-
)
552-
549+
def default_capabilities do
553550
chrome_options =
554551
maybe_put_chrome_executable(%{
555552
args: [
@@ -558,7 +555,7 @@ defmodule Wallaby.Chrome do
558555
"--disable-gpu",
559556
"--headless",
560557
"--fullscreen",
561-
"--user-agent=#{user_agent}"
558+
"--user-agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
562559
]
563560
})
564561

@@ -609,6 +606,22 @@ defmodule Wallaby.Chrome do
609606
end)
610607
end
611608

609+
defp put_beam_metadata(capabilities, opts) do
610+
capabilities
611+
|> update_in([:chromeOptions, :args], fn args ->
612+
for arg <- args do
613+
case String.split(arg, "=") do
614+
["--user-agent", user_agent] ->
615+
new_user_agent = Metadata.append(user_agent, opts[:metadata])
616+
"--user-agent=#{new_user_agent}"
617+
618+
_ ->
619+
arg
620+
end
621+
end
622+
end)
623+
end
624+
612625
defp resolve_opt(opts, key) do
613626
case Keyword.fetch(opts, key) do
614627
{:ok, value} -> value

lib/wallaby/selenium.ex

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,11 @@ defmodule Wallaby.Selenium do
103103
def start_session(opts \\ []) do
104104
base_url = Keyword.get(opts, :remote_url, remote_url_from_config())
105105
create_session = Keyword.get(opts, :create_session_fn, &WebdriverClient.create_session/2)
106-
capabilities = Keyword.get(opts, :capabilities, capabilities_from_config(opts))
106+
107+
capabilities =
108+
opts
109+
|> Keyword.get_lazy(:capabilities, &capabilities_from_config/0)
110+
|> put_beam_metadata(opts)
107111

108112
with {:ok, response} <- create_session.(base_url, capabilities) do
109113
id = response["sessionId"]
@@ -123,10 +127,10 @@ defmodule Wallaby.Selenium do
123127
end
124128
end
125129

126-
defp capabilities_from_config(opts) do
130+
defp capabilities_from_config do
127131
:wallaby
128132
|> Application.get_env(:selenium, [])
129-
|> Keyword.get(:capabilities, default_capabilities(opts))
133+
|> Keyword.get_lazy(:capabilities, &default_capabilities/0)
130134
end
131135

132136
defp remote_url_from_config() do
@@ -352,19 +356,14 @@ defmodule Wallaby.Selenium do
352356
end
353357

354358
@doc false
355-
def default_capabilities(opts \\ []) do
356-
user_agent =
357-
Metadata.append(
358-
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
359-
opts[:metadata]
360-
)
361-
359+
def default_capabilities do
362360
%{
363361
browserName: "firefox",
364362
"moz:firefoxOptions": %{
365363
args: ["-headless"],
366364
prefs: %{
367-
"general.useragent.override" => user_agent
365+
"general.useragent.override" =>
366+
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
368367
}
369368
}
370369
}
@@ -429,4 +428,18 @@ defmodule Wallaby.Selenium do
429428
Map.fetch!(response, "value")
430429
end
431430
end
431+
432+
defp put_beam_metadata(%{"moz:firefoxOptions": %{prefs: %{}}} = capabilities, opts) do
433+
capabilities
434+
|> update_in(
435+
[:"moz:firefoxOptions", :prefs, "general.useragent.override"],
436+
fn user_agent ->
437+
if user_agent do
438+
Metadata.append(user_agent, opts[:metadata])
439+
end
440+
end
441+
)
442+
end
443+
444+
defp put_beam_metadata(capabilities, _opts), do: capabilities
432445
end

0 commit comments

Comments
 (0)