Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
mhanberg committed Jan 6, 2025
1 parent cfa4adc commit 75b2773
Show file tree
Hide file tree
Showing 13 changed files with 753 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
elixir 1.18.1
elixir 1.17.3
erlang 27.2
11 changes: 9 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
outputs = inputs @ {
beam-flakes,
flake-parts,
self,
...
}:
flake-parts.lib.mkFlake {inherit inputs;} {
Expand All @@ -25,13 +26,19 @@
pkgs,
system,
...
}: {
}: let
selenium-server = pkgs.callPackage ./nix/selenium-server.nix {};
in {
packages.selenium-server = selenium-server;
beamWorkspace = {
enable = true;
devShell = {
packages = with pkgs; [
chromedriver
selenium-server
selenium-server-standalone
chromedriver
geckodriver
firefox
];
languageServers.elixir = false;
languageServers.erlang = false;
Expand Down
15 changes: 15 additions & 0 deletions integration_test/selenium4/all_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
Code.require_file("../tests.exs", __DIR__)

# Additional test cases supported by selenium
Code.require_file("../cases/browser/double_click_test.exs", __DIR__)
Code.require_file("../cases/browser/frames_test.exs", __DIR__)
Code.require_file("../cases/browser/hover_test.exs", __DIR__)
Code.require_file("../cases/element/hover_test.exs", __DIR__)
Code.require_file("../cases/browser/move_mouse_by_test.exs", __DIR__)
Code.require_file("../cases/browser/window_handles_test.exs", __DIR__)
Code.require_file("../cases/browser/window_position_test.exs", __DIR__)
Code.require_file("../cases/element/size_test.exs", __DIR__)
Code.require_file("../cases/element/location_test.exs", __DIR__)
Code.require_file("../cases/feature/use_feature_test.exs", __DIR__)
Code.require_file("../cases/feature/import_feature_test.exs", __DIR__)
Code.require_file("../cases/feature/automatic_screenshot_test.exs", __DIR__)
137 changes: 137 additions & 0 deletions integration_test/selenium4/selenium4_capabilities_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
defmodule Wallaby.Integration.Selenium4CapabilitiesTest do
use ExUnit.Case, async: false
use Wallaby.DSL

import Wallaby.SettingsTestHelpers

alias Wallaby.Integration.SessionCase

setup do
ensure_setting_is_reset(:wallaby, :selenium4)
end

describe "capabilities" do
test "reads default capabilities" do
expected_capabilities = %{
capabilities: %{
alwaysMatch: %{
browserName: "firefox",
"moz:firefoxOptions": %{
binary: System.find_executable("firefox"),
args: ["-headless"],
prefs: %{
"general.useragent.override" =>
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
}
}
}
}
}

create_session_fn = fn config, capabilities ->
assert capabilities == expected_capabilities

WebDriverClient.start_session(config, capabilities)
end

{:ok, session} = SessionCase.start_test_session(create_session_fn: create_session_fn)

session
|> visit("page_1.html")
|> assert_has(Query.text("Page 1"))

assert :ok = Wallaby.end_session(session)
end

test "reads capabilities from application config" do
expected_capabilities = %{
capabilities: %{
alwaysMatch: %{
browserName: "firefox",
"moz:firefoxOptions": %{
binary: System.find_executable("firefox"),
args: ["-headless"]
}
}
}
}

Application.put_env(:wallaby, :selenium4, capabilities: expected_capabilities)

create_session_fn = fn config, capabilities ->
assert capabilities == expected_capabilities

WebDriverClient.start_session(config, capabilities)
end

{:ok, session} = SessionCase.start_test_session(create_session_fn: create_session_fn)

session
|> visit("page_1.html")
|> assert_has(Query.text("Page 1"))

assert :ok = Wallaby.end_session(session)
end

test "adds the beam metadata when it is present" do
user_agent = "Mozilla/5.0"

defined_capabilities = %{
capabilities: %{
alwaysMatch: %{
browserName: "firefox",
"moz:firefoxOptions": %{
binary: System.find_executable("firefox"),
args: ["-headless"],
prefs: %{
"general.useragent.override" => user_agent
}
}
}
}
}

metadata =
if Version.compare(System.version(), "1.16.0") in [:eq, :gt] do
"g2gCdwJ2MXQAAAABbQAAAARzb21lbQAAAAhtZXRhZGF0YQ=="
else
"g2gCZAACdjF0AAAAAW0AAAAEc29tZW0AAAAIbWV0YWRhdGE="
end

expected_capabilities = %{
capabilities: %{
alwaysMatch: %{
browserName: "firefox",
"moz:firefoxOptions": %{
binary: System.find_executable("firefox"),
args: ["-headless"],
prefs: %{
"general.useragent.override" => "#{user_agent}/BeamMetadata (#{metadata})"
}
}
}
}
}

Application.put_env(:wallaby, :selenium4, capabilities: defined_capabilities)

create_session_fn = fn config, capabilities ->
assert capabilities == expected_capabilities

WebDriverClient.start_session(config, capabilities)
end

{:ok, session} =
SessionCase.start_test_session(
create_session_fn: create_session_fn,
metadata: %{"some" => "metadata"}
)

session
|> visit("page_1.html")
|> assert_has(Query.text("Page 1"))

assert :ok = Wallaby.end_session(session)
end
end
end
13 changes: 13 additions & 0 deletions integration_test/selenium4/test_helper.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
ExUnit.configure(max_cases: 2, exclude: [pending: true])

# Load support files
Code.require_file("../support/test_server.ex", __DIR__)
Code.require_file("../support/pages/index_page.ex", __DIR__)
Code.require_file("../support/pages/page_1.ex", __DIR__)
Code.require_file("../support/session_case.ex", __DIR__)
Code.require_file("../support/helpers.ex", __DIR__)

{:ok, server} = Wallaby.Integration.TestServer.start()
Application.put_env(:wallaby, :base_url, server.base_url)

ExUnit.start()
3 changes: 2 additions & 1 deletion lib/wallaby.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ defmodule Wallaby do

@drivers %{
"chrome" => Wallaby.Chrome,
"selenium" => Wallaby.Selenium
"selenium" => Wallaby.Selenium,
"selenium4" => Wallaby.Selenium4
}

use Application
Expand Down
8 changes: 2 additions & 6 deletions lib/wallaby/browser.ex
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,9 @@ defmodule Wallaby.Browser do

@typep session :: Session.t()
@typep element :: Element.t()
@opaque queryable ::
Query.t()
| Element.t()
@opaque queryable :: Query.t() | Element.t()

@type parent ::
element
| session
@type parent :: element | session
@type opts :: Query.opts()

@default_max_wait_time 3_000
Expand Down
9 changes: 3 additions & 6 deletions lib/wallaby/element.ex
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,14 @@ defmodule Wallaby.Element do

alias Wallaby.StaleReferenceError

defstruct [:url, :session_url, :parent, :id, :driver, screenshots: []]
defstruct [:url, :session_url, :session, :parent, :id, :driver, screenshots: []]

@type value ::
String.t()
| number()
| :selected
| :unselected
@type value :: String.t() | number() | :selected | :unselected
@type attr :: String.t()
@type keys_to_send :: String.t() | list(atom | String.t())
@type t :: %__MODULE__{
session_url: String.t(),
session: Wallaby.Session.t(),
url: String.t(),
id: String.t(),
screenshots: list,
Expand Down
Loading

0 comments on commit 75b2773

Please sign in to comment.