1{ pkgs, ... }:
2{
3 name = "playwright-python";
4
5 meta = with pkgs.lib.maintainers; {
6 maintainers = [ phaer ];
7 };
8
9 nodes.machine =
10 { pkgs, ... }:
11 {
12 environment.variables = {
13 NIX_MANUAL_DOCROOT = "file://${pkgs.nix.doc}/share/doc/nix/manual/index.html";
14 PLAYWRIGHT_BROWSERS_PATH = pkgs.playwright-driver.browsers;
15 };
16 environment.systemPackages = [
17 (pkgs.writers.writePython3Bin "test_playwright"
18 {
19 libraries = [ pkgs.python3Packages.playwright ];
20 }
21 ''
22 import sys
23 import re
24 from playwright.sync_api import sync_playwright
25 from playwright.sync_api import expect
26
27 browsers = {
28 "chromium": {'args': ["--headless", "--disable-gpu"], 'channel': 'chromium'},
29 "firefox": {},
30 "webkit": {}
31 }
32 needle = re.compile("Nix.*Reference Manual")
33 if len(sys.argv) != 3 or sys.argv[1] not in browsers.keys():
34 print(f"usage: {sys.argv[0]} [{'|'.join(browsers.keys())}] <url>")
35 sys.exit(1)
36 browser_name = sys.argv[1]
37 url = sys.argv[2]
38 browser_kwargs = browsers.get(browser_name)
39 args = ' '.join(browser_kwargs.get('args', []))
40 print(f"Running test on {browser_name} {args}")
41 with sync_playwright() as p:
42 browser = getattr(p, browser_name).launch(**browser_kwargs)
43 context = browser.new_context()
44 page = context.new_page()
45 page.goto(url)
46 expect(page.get_by_text(needle)).to_be_visible()
47 ''
48 )
49 ];
50 };
51
52 testScript = ''
53 # FIXME: Webkit segfaults
54 for browser in ["firefox", "chromium"]:
55 with subtest(f"Render Nix Manual in {browser}"):
56 machine.succeed(f"test_playwright {browser} $NIX_MANUAL_DOCROOT")
57 '';
58
59}