playwright
is Microsoft’s open source automated web application testing framework, supporting the mainstream Python
, NodeJS
, Java
and other languages, the official documentation has been very well developed, this article will quickly share some common usage in production development.
1. Installation
The version of Python used is 3.8.6
.
Windows 7 supports up to version 3.8.10, for compatibility reasons try to use versions below 3.8.10
Install playwright
using pip
as follows.
1
2
|
pip3 install playwright
playwright install
|
Example 1: Use the traditional synchronisation method.
1
2
3
4
5
6
7
8
|
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("http://playwright.dev")
print(page.title())
browser.close()
|
Example 2: Using async/await
asynchronously.
1
2
3
4
5
6
7
8
9
10
11
12
|
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("http://playwright.dev")
print(await page.title())
await browser.close()
asyncio.run(main())
|
Using async
is a simple and effective way to increase concurrency, playwright
is network IO intensive in most scenarios, but writing with async
is more demanding on the developer and debug
is not as convenient as traditional synchronous methods
Whether or not to use asynchronous writing depends on your application framework and development needs.
2. Use
2.1. element selection
Documentation reference: https://playwright.dev/python/docs/api/class-locator
The following is an example of a search for chancel.me
at bing.com
and outputting the first search result.
1
2
3
4
5
6
7
8
9
10
11
|
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
b = p.chromium.launch()
page = b.new_page()
page.goto('https://bing.com')
page.locator('#sb_form_q').fill('chancel.me') # fills the string
page.locator('#search_icon').click() # select and click
print(page.locator('[class=b_algo]').nth(0).text_content()) # Get text after selection
|
The output is shown below.
1
|
syncmemo - Chancel's bloghttps://memo.chancel.me/help ...
|
2.2. Cookies management
Documentation reference: https://playwright.dev/python/docs/api/class-browsercontext
Automation usually involves saving cookies, and playwright
needs to create a new context to get them.
The following is an example of a get/set
operation for cookies
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
from playwright.sync_api import sync_playwright
cookies = None
with sync_playwright() as p:
b = p.chromium.launch()
c = b.new_context()
page = c.new_page()
page.goto('https://www.chancel.me/')
cookies = c.cookies()
print(cookies)
with sync_playwright() as p:
b = p.chromium.launch()
c = b.new_context()
page = c.new_page()
c.add_cookies(cookies)
page.goto('https://www.chancel.me/')
cookies = c.cookies()
print(cookies)
|
The output is shown below.
1
|
[{'name': 'TOKEN', 'value': 'c263e3a6-c88d-11ed-8979-6ee82343e005', 'domain': 'www.chancel.me', 'path': '/', 'expires': 1684658669.818441, 'httpOnly': True, 'secure': True, 'sameSite': 'Lax'}]
|
2.3. document download
Reference documentation: https://playwright.dev/python/docs/api/class-download
As an example of downloading a Github binary package.
1
2
3
4
5
6
7
8
9
10
11
|
from playwright.sync_api import sync_playwright
cookies = None
with sync_playwright() as p:
b = p.chromium.launch()
page = b.new_page()
page.goto('https://github.com/chancelyg/godaddy-ddns/releases')
with page.expect_download() as download_info:
page.locator('[href="/chancelyg/godaddy-ddns/releases/download/v23.01.06/godaddy-ddns_Darwin_arm64.tar.gz"]').click()
download_info.value.save_as('godaddy-ddns_Darwin_arm64.tar.gz')
|
2.4. Video recordings and screenshots
Reference document: https://playwright.dev/python/docs/api/class-video
When developing playwright
you will often need to take screenshots to confirm that the automation process is working properly.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from playwright.sync_api import sync_playwright
# Screenshots
with sync_playwright() as p:
b = p.chromium.launch()
page = b.new_page()
page.goto('https://www.chancel.me')
page.screenshot(path='screenshot.png')
# Record video
with sync_playwright() as p:
b = p.chromium.launch()
page = b.new_page(record_video_dir="videos", record_video_size={"width": 640, "height": 480})
page.goto('https://www.google.com')
page.goto('https://www.chancel.me')
|
3. Running in Docker
Reference documentation: https://playwright.dev/docs/docker#image-tags
playwright
has an official image, take mcr.microsoft.com/playwright/python:v1.31.0-focal
as an example, and run a uvicorn
gateway application with the following Dockerfile
file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
FROM mcr.microsoft.com/playwright/python:v1.31.0-focal
ENV LANG en_US.UTF-8
WORKDIR /app
COPY ./web /app/web
COPY ./requirements.txt /app/requirements.txt
RUN pip3 install -r /app/requirements.txt && \
playwright install && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
CMD ["uvicorn", "web:app", "--host=0.0.0.0", "--port=5000"]
|