不写一行代码来实现自动化

2021-03-16 11:10:16 浏览数 (1)

由于技术的进步,各行各业的门槛越来越低。 以前别人说会selenium就是会自动化。好像很高大上的样子。现在会selenium估计是基本的。大家都忙着内卷,各种轮子越来越多,自动化的门槛也越来越低。

我们聊到自动化,一般会聊到自动化的测试框架。

基于 Selenium 的测试框架: robot framework webdriver Appium 基于JS语言的测试工具: cypress puppeteer 每种自动化框架和工具都有各自的优点吧。

我们用自动化框架的时候,无非就是看重:一:学习成本低;二:使用和维护方便快捷;

上面的框架都不能达到这两个低门槛。现在微软直接将门槛降到零。

最近,微软开源了一个项目叫「playwright-python」这个项目是针对Python语言的纯自动化工具,连代码都不用写,就能实现自动化功能。对于小白来说,只要操作一遍,简单看懂代码,就完事了。 如果页面改变了,大不了重新录制一遍,简直不要太方便了。关键是他可以选择语言,JS, python都可以。

Playwright是一个强大的Python库,仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作,并同时支持以无头模式、有头模式运行。

Playwright提供的自动化技术是绿色的、功能强大、可靠且快速,支持Linux、Mac以及Windows操作系统。

好了,说了这么多,来看看怎么使用的吧。

Playwright使用

安装

Playwright的安装非常简单,两步走。

代码语言:javascript复制
# 安装playwright库
pip install playwright

# 安装浏览器驱动文件(安装过程稍微有点慢)
python -m playwright install

上面两个pip操作分别安装:

  • 安装Playwright依赖库,需要Python3.7
  • 安装Chromium、Firefox、WebKit等浏览器的驱动文件

录制

使用Playwright无需写一行代码,我们只需手动操作浏览器,它会录制我们的操作,然后自动生成代码脚本。

下面就是录制的命令codegen,仅仅一行。用法可以使用--help查看,如果简单使用就是直接在命令后面加上url链接,如果有其他需要可以添加options

代码语言:javascript复制
python -m playwright codegen --help
Usage: index codegen [options] [url]

open page and generate code for user actions

Options:
  -o, --output <file name>  saves the generated script to a file
  --target <language>       language to use, one of javascript, python, python-async, csharp (default: "python")
  -h, --help                display help for command

Examples:

  $ codegen
  $ codegen --target=python
  $ -b webkit codegen https://example.com

options含义:

  • -o:将录制的脚本保存到一个文件
  • --target:规定生成脚本的语言,有JSPython两种,默认为Python
  • -b:指定浏览器驱动

比如,我要在baidu.com搜索,用chromium驱动,将结果保存为my.pypython文件。

代码语言:javascript复制
python -m playwright codegen --target python -o test.py -b chromium https://www.baidu.com

命令行输入后会自动打开浏览器,然后可以看见在浏览器上的一举一动都会被自动翻译成代码,结束后自动关闭浏览器,保存生成的自动化脚本到py文件。

以下是我随便录制的一个web工具的应用。

代码语言:javascript复制
from playwright.sync_api import sync_playwright

def run(playwright):
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    # Open new page
    page = context.new_page()

    qa_url="https://xxx.cn/dbquery/dbquery.aspx"
    stg_url="https://xxx.cn/dbquery/dbquery.aspx"
    page.goto(stg_url)

    print(page.text_content("[aria-label="Sign-in options"]"))
    # Click [placeholder="someone@example.com"]
    page.click("[placeholder="someone@example.com"]")


    # Fill [placeholder="someone@example.com"]
    page.fill("[placeholder="someone@example.com"]"

    # Click text=Next

    with page.expect_navigation():
        page.click("text=Next")


    # Click [placeholder="Password"]
    page.click("[placeholder="Password"]")

    # Fill [placeholder="Password"]
    page.fill("[placeholder="Password"]", "Test@")

    # Click text=Sign in
    page.click("text=Sign in")



    # Check [aria-label="Don't show this again"]
    page.check("[aria-label="Don't show this again"]")

    # Click text=Yes
    # with page.expect_navigation(url="https://qadeepblue2.eflabs.cn/dbquery/dbquery.aspx"):
    with page.expect_navigation():
        page.click("text=Yes")
    # assert page.url == "https://login.microsoftonline.com/kmsi"

    # Click textarea[name="TxtQuery"]
    page.click("textarea[name="TxtQuery"]")

    # Fill textarea[name="TxtQuery"]
    page.fill("textarea[name="TxtQuery"]", "select top 10* from ET_main.dbo.Members")

    # Click text=Execute
    page.click("text=Execute")


    # Close page
    page.close()

    # ---------------------
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

可以看到,它每步都有注释,assert,你只需要将assert注释打开,就是测试点了,对于小白来说,省时又省力。

此外,playwright还提供了同步和异步的API接口,文档如下。

链接:https://microsoft.github.io/playwright-python/index.html

同步

下面示例代码:依次打开三个浏览器,前往baidu搜索,截图后退出。

代码语言:javascript复制
from playwright import sync_playwright

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch()
        page = browser.newPage()
        page.goto('https://baidu.com/')
        page.screenshot(path=f'example-{browser_type.name}.png')
        browser.close()

异步

异步操作可结合asyncio同时进行三个浏览器操作。

代码语言:javascript复制
import asyncio
from playwright import async_playwright

async def main():
    async with async_playwright() as p:
        for browser_type in [p.chromium, p.firefox, p.webkit]:
            browser = await browser_type.launch()
            page = await browser.newPage()
            await page.goto('https://img.yuanmabao.com/zijie/pic/2021/03/16/me5wha1as3a.html')
            await browser.close()

asyncio.get_event_loop().run_until_complete(main())

移动端

更厉害的是,playwright还可支持移动端的浏览器模拟。

如果你有点技术功底,可以尝试结合其他测试框架,例如pytest等结构化一下,就可以做一个比较漂亮的自动化测试了。

我大概尝试了一下,这个比起selenium来,方便的地方有两点,一:等待时间不需要设定,二:查找元素太方便了。

平时喜欢折腾点爬虫,数据分析等,有的时候某个元素定位不到,或者不稳定,有了这个东西,真实方便又快捷。

Mobile上我还没去尝试,等尝试好了,给大家汇报汇报。

0 人点赞