Unverified Commit a6df6655 authored by Matthieu Coudron's avatar Matthieu Coudron Committed by GitHub
Browse files

Playwright: browser improvements, update (#298944)

parents 9e8fbf0f 01fd62f3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -786,6 +786,7 @@ in {
  plasma6 = handleTest ./plasma6.nix {};
  plasma5-systemd-start = handleTest ./plasma5-systemd-start.nix {};
  plausible = handleTest ./plausible.nix {};
  playwright-python = handleTest ./playwright-python.nix {};
  please = handleTest ./please.nix {};
  pleroma = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./pleroma.nix {};
  plikd = handleTest ./plikd.nix {};
+58 −0
Original line number Diff line number Diff line
import ./make-test-python.nix (
  { pkgs, ... }:
  {
    name = "playwright-python";

    meta = with pkgs.lib.maintainers; {
      maintainers = [ phaer ];
    };

    nodes.machine =
      { pkgs, ... }:
      {
        environment.variables = {
          NIX_MANUAL_DOCROOT = "file://${pkgs.nix.doc}/share/doc/nix/manual/index.html";
          PLAYWRIGHT_BROWSERS_PATH = pkgs.playwright-driver.browsers;
        };
        environment.systemPackages = [
          (pkgs.writers.writePython3Bin "test_playwright"
            {
              libraries = [ pkgs.python3Packages.playwright ];
            }
            ''
              import sys
              from playwright.sync_api import sync_playwright
              from playwright.sync_api import expect

              browsers = {
                "chromium": ["--headless", "--disable-gpu"],
                "firefox": [],
                "webkit": []
              }
              if len(sys.argv) != 3 or sys.argv[1] not in browsers.keys():
                  print(f"usage: {sys.argv[0]} [{'|'.join(browsers.keys())}] <url>")
                  sys.exit(1)
              browser_name = sys.argv[1]
              url = sys.argv[2]
              browser_args = browsers.get(browser_name)
              print(f"Running test on {browser_name} {' '.join(browser_args)}")
              with sync_playwright() as p:
                  browser = getattr(p, browser_name).launch(args=browser_args)
                  context = browser.new_context()
                  page = context.new_page()
                  page.goto(url)
                  expect(page.get_by_text("Nix Reference Manual")).to_be_visible()
            ''
          )
        ];
      };

    testScript = ''
      # FIXME: Webkit segfaults
      for browser in ["firefox", "chromium"]:
          with subtest(f"Render Nix Manual in {browser}"):
              machine.succeed(f"test_playwright {browser} $NIX_MANUAL_DOCROOT")
    '';

  }
)
+9 −4
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
  setuptools,
  setuptools-scm,
  playwright-driver,
  nixosTests,
  nodejs,
}:

@@ -93,9 +94,13 @@ buildPythonPackage rec {

  passthru = {
    inherit driver;
    tests = {
    tests =
      {
        driver = playwright-driver;
        browsers = playwright-driver.browsers;
      }
      // lib.optionalAttrs stdenv.isLinux {
        inherit (nixosTests) playwright-python;
      };
    updateScript = ./update.sh;
  };
+47 −7
Original line number Diff line number Diff line
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl gnused common-updater-scripts jq prefetch-npm-deps
#!nix-shell -i bash -p curl gnused common-updater-scripts jq prefetch-npm-deps unzip
set -euo pipefail

root="$(dirname "$(readlink -f "$0")")"
@@ -11,18 +11,60 @@ version=$(curl ${GITHUB_TOKEN:+" -u \":$GITHUB_TOKEN\""} -s https://api.github.c
setup_py_url="https://github.com/microsoft/playwright-python/raw/v${version}/setup.py"
driver_version=$(curl -Ls "$setup_py_url" | grep '^driver_version =' | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')

# TODO: skip if update-source-version reported the same version
update-source-version playwright-driver "$driver_version"
update-source-version python3Packages.playwright "$version"

# Update package-lock.json files for all npm deps that are built in playwright
# TODO: skip if update-source-version reported the same version
driver_file="$root/../../web/playwright/driver.nix"
playwright_dir="$root/../../web/playwright"
driver_file="$playwright_dir/driver.nix"
repo_url_prefix="https://github.com/microsoft/playwright/raw"
temp_dir=$(mktemp -d)

temp_dir=$(mktemp -d)
trap 'rm -rf "$temp_dir"' EXIT



# update binaries of browsers, used by playwright.
replace_sha() {
  sed -i "s|$2 = \".\{44,52\}\"|$2 = \"$3\"|" "$1"
}

prefetch_browser() {
    nix store prefetch-file --json --hash-type sha256 --unpack "$1" | jq -r .hash
}

update_browser() {
    name="$1"
    suffix="$2"
    arm64_suffix="${3:-$2-arm64}"
    revision="$(jq -r ".browsers.$name.revision" "$playwright_dir/browsers.json")"
    replace_sha "$playwright_dir/$name.nix" "x86_64-linux" \
        "$(prefetch_browser "https://playwright.azureedge.net/builds/$name/$revision/$name-$suffix.zip")"
    replace_sha "$playwright_dir/$name.nix" "aarch64-linux" \
        "$(prefetch_browser "https://playwright.azureedge.net/builds/$name/$revision/$name-$arm64_suffix.zip")"
}

curl -fsSl \
    "https://raw.githubusercontent.com/microsoft/playwright/v${driver_version}/packages/playwright-core/browsers.json" \
    | jq '
      .comment = "This file is kept up to date via update.sh"
      | .browsers |= (
        [.[]
          | select(.installByDefault) | del(.installByDefault)]
          | map({(.name): . | del(.name)})
          | add
      )
    ' > "$playwright_dir/browsers.json"

# We currently use Chromium from nixpkgs, so we don't need to download it here
# Likewise, darwin can be ignored here atm as we are using an impure install anyway.
update_browser "firefox" "ubuntu-22.04"
update_browser "webkit" "ubuntu-22.04"
update_browser "ffmpeg" "linux"


# Update package-lock.json files for all npm deps that are built in playwright

# Function to download `package-lock.json` for a given source path and update hash
update_hash() {
    local source_root_path="$1"
@@ -30,7 +72,6 @@ update_hash() {

    # Formulate download URL
    local download_url="${repo_url_prefix}/v${driver_version}${source_root_path}/package-lock.json"

    # Download package-lock.json to temporary directory
    curl -fsSL -o "${temp_dir}/package-lock.json" "$download_url"

@@ -45,7 +86,6 @@ update_hash() {
while IFS= read -r source_root_line; do
    [[ "$source_root_line" =~ sourceRoot ]] || continue
    source_root_path=$(echo "$source_root_line" | sed -e 's/^.*"${src.name}\(.*\)";.*$/\1/')

    # Extract the current npmDepsHash for this sourceRoot
    existing_hash=$(grep -A1 "$source_root_line" "$driver_file" | grep 'npmDepsHash' | sed -e 's/^.*npmDepsHash = "\(.*\)";$/\1/')

+28 −0
Original line number Diff line number Diff line
{
  "comment": "This file is kept up to date via update.sh",
  "browsers": {
    "chromium": {
      "revision": "1134",
      "browserVersion": "129.0.6668.29"
    },
    "firefox": {
      "revision": "1463",
      "browserVersion": "130.0"
    },
    "webkit": {
      "revision": "2070",
      "revisionOverrides": {
        "mac10.14": "1446",
        "mac10.15": "1616",
        "mac11": "1816",
        "mac11-arm64": "1816",
        "mac12": "2009",
        "mac12-arm64": "2009"
      },
      "browserVersion": "18.0"
    },
    "ffmpeg": {
      "revision": "1010"
    }
  }
}
Loading