Aller au contenu
Cette page n’est pas encore traduite — voici la version anglaise.

Browser Automation Without Selenium, Playwright or Puppeteer

Map each Selenium, Playwright or Puppeteer step (open, click, type, wait, extract, schedule) to a no-driver workflow in your own Chrome, and when to keep the script.

Dannick K.
1 décembre 2026 · 6 min de lecture
PrésenterTableau

Aussi dans English

Partager
Sur cette page
  1. Why look past Selenium for a small job?
  2. How does each script step map to a node?
  3. Where does your Python go?
  4. How do you keep selectors honest?
  5. When should you keep Playwright?
  6. FAQ

You wrote a small script to pull a report out of a portal every Monday. It worked for a month. Then the browser updated and the driver didn’t, the login started asking for a second factor, and the headless run on your server began failing at a step that works fine when you click it yourself.

For jobs you run for yourself, behind your own logins, there is another way to do the same thing: a visual workflow that runs in the Chrome you are already signed into. Every step of your script has a matching node. This post is the translation table, plus an honest list of the cases where you should keep Selenium or Playwright.

If the DOM and selectors are new to you, start with DOM automation without code. This post is for people who would normally open an editor.

Why look past Selenium for a small job?

Selenium and Playwright are code libraries that drive a browser, often headless on a server. They are the right tool for test suites and pipelines. For a weekly personal job, most of the effort goes into things around the task: installing the library, matching the driver to the browser, scripting a login, keeping a machine running.

The pattern

Most small scripts repeat the same handful of steps.

The same steps every time. Only the page and the selectors change.The control flow is generic; the selectors are the site-specific part.

Ligne animée
Version texte
  1. The pattern: Most small scripts repeat the same handful of steps.

The extension runs in your browser and reuses the session you already have: no headless browser and no stored passwords. When the site asks you for a second factor, you answer it once in your normal tab, like any other day.

Avant

A script with a driver

  • Install the library
  • Match driver to browser
  • Script the login
  • Keep a machine running

4 moving parts

Library, driver, login, a machine that stays up.

Après

A workflow in your Chrome

  • Install the extension
  • Already signed in
  • Pick elements on page
  • Schedule in the flow

1 extension

Runs while your browser is open.

Drag to compare. Note the catch: the browser has to be open.No headless mode: the extension needs a running browser.

Avant / après
Version texte
  1. Before: A script with a driver, 4 moving parts. Library, driver, login, a machine that stays up.
  2. After: A workflow in your Chrome, 1 extension. Runs while your browser is open.
  3. Compare before and after

How does each script step map to a node?

Here is the mapping. The left column uses the names you know from Selenium (Python) and Playwright; the right column is the node and the setting that does the same job.

Your script
Open the page
Click and type
Wait for it
Extract and shape
Send on a schedule
requests + cron → HTTP Request + Schedule

Send it on a timer. HTTP Request for the API call, Schedule for the cron.HTTP Request: GET/POST/PUT/DELETE/PATCH/OPTIONS/HEAD; Schedule trigger replaces crontab.

Chaîne
Version texte
  1. Your script: open → act → wait → extract → send
  2. Open the page: driver.get → Tab Control: navigate
  3. Click and type: click / send_keys → UI Automation
  4. Wait for it: WebDriverWait → waitForElement
  5. Extract and shape: page_source → Get Structured Data
  6. Send on a schedule: requests + cron → HTTP Request + Schedule

The full table:

In your script In the workflow
driver.get(url) / page.goto(url) Tab Control → navigate (or open for a new tab)
element.click() / page.click() UI Automation → click (also dblclick, rightclick, hover)
send_keys() / page.fill() UI Automation → type, clear, select, check (or Form Fill for a whole form)
WebDriverWait(...) / page.waitForSelector() UI Automation → waitForElement (visible, attached or detached), or the Wait for Element node
assert on the page UI Automation → assertExists, assertText
driver.page_source / page.content() Get All HTML (or Get All Text for just the words)
a loop over table rows Get Structured Data (mode Table, List or Auto)
driver.save_screenshot() / page.screenshot() Screenshot Page
requests.post(...) HTTP Request (JSON, form-urlencoded or multipart bodies)
your own Python function Code node (Python, see below)
a line in crontab Schedule trigger

Each row is one node on a canvas, and the data flows from one to the next as items. Here is a real example from the docs, the equivalent of a “scrape this table to CSV” script:

Page Table to CSV

DéclencheurWhen Started
PageRead the table
DonnéesBuild CSV
PageCopy to clipboard
started by hand
12 rows read from the table
CSV text built
copied to clipboard
Chiffres d'exemple

Run it. Four nodes, no driver, no loop to write.One run; each node shows its output. Row count is an example.

Workflow en direct
Version texte
  1. table-to-csv.awf
  2. started by hand
  3. 12 rows read from the table
  4. CSV text built
  5. copied to clipboard

Where does your Python go?

You don’t have to give up code. The Code node runs Python with Pyodide, inside a dedicated worker. It’s a good place for the logic that is easier to write than to click: parsing, scoring, reshaping a list.

Entrées

inputjson
PythonCode

Réglages

LanguagePython, run with Pyodide
Where it runsA fresh worker for every run
NetworkOff: call APIs with HTTP Request
TimeoutStops the worker, really stopping the code

Sorties

resultjson

What comes out: whatever your code returns.Output field `result`, null when nothing is returned.

Anatomie d’un nœud
Version texte
  1. Code (Python)
  2. input (json)
  3. Language: Python, run with Pyodide · Where it runs: A fresh worker for every run · Network: Off: call APIs with HTTP Request · Timeout: Stops the worker, really stopping the code
  4. result (json)

Three things are different from your usual Python:

  1. No network inside the code. The node can’t call an API itself. Put an HTTP Request node before or after it.
  2. No access to the page. Read the page with the page nodes, then pass the result in.
  3. No pip install. The node doesn’t load extra packages, so stick to the standard library (json and friends). If you need a heavy library, that job probably belongs in your script.

How do you keep selectors honest?

In a script you write By.CSS_SELECTOR by hand and find out it’s wrong at run time. In a workflow you click the crosshair next to Target Element and pick the element on the page; Ping highlights what a selector matches before you run anything. Or press Record actions, do the task once, and each click and keystroke becomes a step (how the recorder picks selectors).

One behaviour catches people who come from test frameworks:

Idée reçue

If a step can't find its element, the run fails.

Réalité

A UI Automation step whose element isn't found in time is skipped. Add assertExists to stop the run instead.

What actually happens: the action is skipped. Use an assert to fail loudly.Missing target within the wait timeout → action skipped with a warning; assertExists (onFailure: stop) throws.

Idée reçue
Version texte
  1. If a step can't find its element, the run fails.
  2. A UI Automation step whose element isn't found in time is skipped. Add assertExists to stop the run instead.

So when a step matters, put an assertExists or assertText right after it, the same way you’d assert in a test.

Your workflow is also a file. Export it as a .awf: a small JSON text file with the steps, connections and notes. You can commit it, diff it and share it, and your credentials are never part of the file.

When should you keep Playwright?

AWFlow is not a replacement for a test framework. It needs your browser to be open, and it works in your session, one run at a time. Here is the fair comparison:

CritèreAWFlowSelenium / Playwright
SetupInstall the extensionInstall the library and a browser it can drive
Sites behind your loginUses the session you're already signed intoYour script logs in or loads a saved session
Headless, on a server or in CINo: it needs your browser openYes, that's what they're built for
Many runs in parallelNo: one browser, your sessionYes: start as many browsers as you need
Custom logicPython in the Code node, no networkAny code you can write
Who can change itAnyone who can read a canvasSomeone who reads the code

Handover. A canvas is easier to hand over.Visual workflow vs source code.

Tableau comparatif
Version texte
  1. Setup: AWFlow: Install the extension; Selenium / Playwright: Install the library and a browser it can drive
  2. Sites behind your login: AWFlow: Uses the session you're already signed into; Selenium / Playwright: Your script logs in or loads a saved session
  3. Headless, on a server or in CI: AWFlow: No: it needs your browser open; Selenium / Playwright: Yes, that's what they're built for
  4. Many runs in parallel: AWFlow: No: one browser, your session; Selenium / Playwright: Yes: start as many browsers as you need
  5. Custom logic: AWFlow: Python in the Code node, no network; Selenium / Playwright: Any code you can write
  6. Who can change it: AWFlow: Anyone who can read a canvas; Selenium / Playwright: Someone who reads the code

Keep the script when:

  • the job runs in CI or on a server, or needs to run while your laptop is closed;
  • you need many runs at once, or many accounts;
  • it’s a test suite, with fixtures and reports.

Move it to a workflow when it’s a personal or team routine on sites you already use, a few times a day at most, and the hardest part of the script was the login. For the bigger picture of where each approach wins, see browser automation vs server automation.

FAQ

Can I do Python web automation without Selenium?

Yes, for jobs in your own browser. The workflow nodes do the browser part (open, click, type, wait, extract) and the Code node runs your Python on the result. For headless runs on a server you still need a library like Selenium or Playwright.

Is there a way to automate a browser without Selenium or Puppeteer?

Yes, for jobs you run in your own browser. Puppeteer is a JavaScript library that drives Chrome from a script, much like Playwright, so the same translation table applies: each page.goto, page.click or page.type becomes a node. You skip installing a library and launching a separate browser, because the workflow runs in the Chrome you already have open. Keep Puppeteer for headless runs on a server, in CI or at scale.

Is there a browser automation API without managing Playwright infrastructure?

Not as an API you call from your code today. AWFlow runs workflows inside your browser, started by hand, from the right-click menu, a hotkey or a schedule. There is no server for you to manage, but also no endpoint for your own code to call.

How often can a schedule run?

The browser rounds alarms to about a minute, so think in minutes, not seconds. Scheduled workflows run while the browser is open.

Can a workflow wait for hours or days?

Yes. A Wait of a minute or more in the extension survives closing the tab and restarting the browser, up to 30 days.

What does “dom automation” mean here?

Acting on the page’s elements (the DOM) the way you would: reading text, clicking buttons, filling inputs. The DOM automation guide explains it without code.

Start here

Rebuild your first scraper

It fetches a page, pulls each item out with CSS selectors and shows the data. Swap in your URL and selectors.

Ouvrir dans AWFlow (s’ouvre dans un nouvel onglet)docs.awflow.io/examples/web-scrape-to-json.awf
Scannez pour ouvrir

Your turn. Open it, change two settings, run it.

À vous
Version texte
  1. Rebuild your first scraper · It fetches a page, pulls each item out with CSS selectors and shows the data. Swap in your URL and selectors. · https://docs.awflow.io/examples/web-scrape-to-json.awf

Pick the script you maintain most reluctantly, open the starter above, and rebuild it node by node using the table. If it turns out to need CI or parallel runs, you’ll know in ten minutes, and the script stays. Get AWFlow to try it.

In short

  1. Most small scripts are the same few steps
  2. Each step has a node; the table maps them
  3. Python fits in the Code node, without network
  4. Assert the steps that matter
  5. Keep Playwright for CI, headless and scale

Use both. That's the honest answer.

Récap
Version texte
  1. In short
  2. Most small scripts are the same few steps
  3. Each step has a node; the table maps them
  4. Python fits in the Code node, without network
  5. Assert the steps that matter
  6. Keep Playwright for CI, headless and scale

Automatisez le web où vous êtes. Gratuit, dans votre navigateur.