Web自动化

2018-06-26

自动化测试

自动化测试是软件开发过程中的一个重要环节,它有许多好处,主要有:

1.持续集成和持续部署:自动化测试是实现持续集成(CI)和持续部署(CD)的关键。在每次代码提交后,自动化测试可以立即运行,确保新的改动没有破坏现有的功能。

2.回归测试:当代码发生更改时,自动化测试可以帮助检查现有功能是否仍然正常工作。

3.提高软件质量:通过自动化测试,可以更早地发现和修复问题,从而提高软件的总体质量。

4.节省成本:虽然自动化测试需要一定的初期投入,但是长期来看,它可以减少因为错误和问题而产生的维护成本。

总的来说,前端自动化测试可以提高开发团队的效率,提高软件质量,减少错误,帮助团队更快地发布更高质量的产品。

接口自动化测试

除了传统用代码写测试用例外,市面上有很多产品可以直接进行接口测试如:

postman

https://www.postman.com/downloads/

PostmanCanary

https://www.postman.com/downloads/canary/

insomnia

https://insomnia.rest/download/

ApiPost

https://www.apipost.cn/download.html

https://www.eolink.com/

apifox

https://www.apifox.cn/

前端web自动化测试

实现Web自动化同样有很多工具,如模拟图形化操作的xdotool,常见Playwright、Puppeteer、selenium,或者DrissionPage:

xdotool

参考这份笔记:http://git.malu.me/xdotool自动化工具笔记/

Playwright

Python版文档:https://playwright.dev/python/docs/intro

Playwright 是一个开源的自动化测试工具,由 Microsoft 发布,专为测试现代 Web 应用而设计。它支持多种浏览器,包括 Chromium(Chrome 和 Edge)、Firefox 和 WebKit(Safari),使得跨浏览器测试变得简单。Playwright 允许开发者编写用于自动化浏览器操作的脚本,包括页面导航、元素选择、输入、文件上传下载等操作,以及捕捉网络活动、模拟移动设备、地理位置等高级功能。

Playwright 的主要特点包括:

  1. 跨浏览器支持:能够在所有主流浏览器上运行相同的测试脚本。
  2. 无头模式和图形界面模式:支持无头(headless)模式运行测试,这在 CI/CD 环境中非常有用,同时也支持有界面(headful)模式,方便开发时调试。
  3. 快速准确:通过等待元素可用而非固定时间等待,提高了测试的准确性和执行速度。
  4. 现代 Web 功能支持:支持最新的 Web 功能,包括但不限于网络存储、服务工作者、WebSockets 等。
  5. 丰富的 API:提供了一套丰富的 API,能够模拟几乎所有用户操作,并且能够处理复杂的 Web 应用场景。
  6. 多语言绑定:虽然 Playwright 本身是用 TypeScript/JavaScript 开发的,但它也提供了 Python、Java 和 C# 的绑定,使得非 JavaScript 开发者也能够轻松使用。

Playwright 适用于端到端的测试,包括功能测试、视觉回归测试和性能测试等。它通过提供一致的 API 来简化测试脚本的编写和维护工作,帮助开发者和测试工程师提高 Web 应用的质量和稳定性。

记录脚本

命令行界面CLI可用于记录用户交互并生成 Python 代码

playwright codegen malu.me

地址栏带多个传参解决办法:

set url="https://malu.me?aa=aa^^^&bb=bb^^^&cc=cc"
playwright codegen %url%

代码段

兄弟选择器,比如选择选择 text为“最近使用”的下面的兄弟div,可以使用布局选择器:https://playwright.dev/python/docs/selectors#selecting-elements-based-on-layout

page.click('div:below(:text("最近使用"))')

MediaCrawler

能抓小红书、抖音、快手、B站、微博的视频、图片、评论、点赞、转发等信息。

原理:利用playwright搭桥,保留登录成功后的上下文浏览器环境,通过执行JS表达式获取一些加密参数

Puppeteer

puppeteer是谷歌chrome团队出的,支持chrome原生录制脚本,支持chrome无头模式,可模拟移动端,node编写,语法精炼,性能强劲。

API文档:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md

原生录制

Recorder参考文档:https://developer.chrome.com/docs/devtools/recorder/reference

puppeteer 自动收取邮件示例:

const puppeteer = require('puppeteer');

// 注意该路径会和原始用户配置冲突,如果要用用户配置启动,请把开着的chrome先全部关闭
const user_data_path = String.raw`${process.env.LocalAppData}\Google\Chrome\User Data`;
const chrome_exe = String.raw`${process.env["ProgramFiles(x86)"]}\Google\Chrome\Application\chrome.exe`;

const autoSubmitForm = async (url) => {
    // 启动浏览器
    const browser = await puppeteer.launch({
        // 关闭无头模式,方便我们看到这个无头浏览器执行的过程
        headless: false,
		// 取消加载默认配置
		// ignoreDefaultArgs: true,
        // chrome 启动参数
        args: ['--no-sandbox'],
        // 显示chrome log信息和错误信息
        dumpio: true,
		userDataDir: user_data_path,  // 浏览器用户路径(可选)
		executablePath: chrome_exe,  //调用浏览器位置(可选)
    });

    // 打开页面
    const page = await browser.newPage();
    // 设置浏览器视窗
    page.setViewport({
        width: 1920,
        height: 1080,
    });
    // 地址栏输入网页地址
    await page.goto(url, {
        waitUntil: 'networkidle2', // 等待网络状态为空闲的时候才继续执行
    });

    // 点头像登录
    await page.mouse.click(1300,441);
    await page.waitFor(3000);
    // 点代收邮箱
    await page.mouse.click(80,376);
    await page.waitFor(2000);
    while (true) {
        // 点收取
        await page.mouse.click(265, 119);
        await page.waitFor(60000*5);
    }
};

if (require.main === module) {
    autoSubmitForm('http://mail.qq.com/cgi-bin/frame_html');
}

puppeteer 中启用扩展

默认情况下puppeteer关闭了扩展,具体代码在 node_modules\puppeteer\lib\Launcher.js

const DEFAULT_ARGS = [
'--disable-background-networking',
'--disable-background-timer-throttling',
'--disable-breakpad',
'--disable-client-side-phishing-detection',
'--disable-default-apps',
'--disable-dev-shm-usage',
'--disable-extensions',
....

我们可以在启动时关闭它:

ignoreDefaultArgs: true,

Selenium

Selenium 是一个用于 Web 自动化的开源工具。它可以用于自动化 Web 应用程序的测试、爬虫和其他操作。

Selenium 由两个主要部分组成:

  • Selenium WebDriver:用于控制浏览器并与 Web 元素进行交互。
  • Selenium IDE:一个用于记录和回放 Selenium 测试的集成开发环境。

Selenium 支持多种编程语言,包括 Python、Java、C#、JavaScript 等。

使用 Python 使用 Selenium

要使用 Python 使用 Selenium,您需要做的第一件事是安装 Selenium 库。您可以使用 pip 工具进行安装:

pip install selenium

安装 Selenium 库后,您就可以开始编写 Selenium 脚本了。

以下是一个简单的示例,用于打开首页并搜索“Selenium”:

from selenium import webdriver

# 创建一个 WebDriver 实例
driver = webdriver.Chrome()

# 打开首页
driver.get("https://malu.me")

# 在搜索框中输入“Selenium”
search_box = driver.find_element_by_name("q")
search_box.send_keys("Selenium")

# 提交搜索
search_box.submit()

# 关闭浏览器
driver.quit()

Selenium 的优势

Selenium 具有以下优势:

  • 开源且免费
  • 支持多种编程语言
  • 支持多种浏览器
  • 易于使用
  • 功能强大

Selenium 的应用场景

Selenium 可用于以下场景:

  • Web 自动化测试
  • Web 爬虫
  • 自动化表单填写
  • 自动化数据提取
  • 自动化操作 Web 应用程序

Selenium 是一个强大的 Web 自动化工具。它可以用于自动化 Web 应用程序的测试、爬虫和其他操作。

DrissionPage

文档:https://g1879.gitee.io/drissionpagedocs/

Linux下安装

wget "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" -O chrome.deb

dpkg -i chrome.deb

# apt-get install libatk1.0-0   # 可不执行
apt --fix-broken install

pip install DrissionPage

example:

_base.py

#!/usr/bin/env python
# 将上级目录绝对路径加入到path路径列表中
import os,sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from DrissionPage import WebPage, ChromiumOptions
from Monitor.WEB_monitor.check_model import CKM

class BASE():
    '''监测模块基类'''

    STD_MSG = '(说明:如果标准差偏大表示数列存在异常)'
    URL_TIMEOUT = 20

    def _base(self,url,title):
        '''监测基础方法'''
        # 检查模块
        self.C = CKM()
        URL = url
        print(f'监测模块: {title}',"\n请求地址:", self.C.color_url(URL))
        return self._create_browser()

    def _create_browser(self,args=None):
        co = ChromiumOptions()
        if os.name != 'nt':
            '''Linux'''
            co = co.set_browser_path(r'/opt/google/chrome/google-chrome')
            co = co.set_argument('--no-sandbox') # 解决$DISPLAY报错
            # co = co.set_argument('--headless=new')
            co = co.set_headless(True)  # 解决浏览器无法连接报错
        else:
            # co = co.set_browser_path(r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe')
            pass
        if args is not None:
            if args.proxy is not None:
                co.set_proxy(args.proxy)
        # co = co.use_system_user_path()
        # co = co.set_paths(
        #     # local_port='9888',
        #     # browser_path=r'.\Chrome\chrome.exe',
        #     user_data_path=r'C:\Users\ml\AppData\Local\Google\Chrome\User Data\Default'
        #     )
        page = WebPage(chromium_options=co)
        return page

APP自动化

appium

环境: $ node -v v20.11.0 $ npm -v 10.2.4

npm i -g appium

查看全局已经安装的包

npm list -g –depth=0

手机开启调试

设置-我的设备-全部参数与信息-连续点击OS版本

设置-更多设置-开发者选项-开启开发者选项->无线调试开启

adb下载 Android SDK Platform tools :https://developer.android.com/tools/releases/platform-tools?hl=zh-cn

adb说明文档 https://android.googlesource.com/platform/packages/modules/adb/+/refs/heads/main/docs/user/adb.1.md

使用配对码配对设备

adb pair HOST[:PORT] [PAIRING CODE]

然后连接

adb connect 192.168.x.xxx:xxx  // 无线调试的IP地址及端口

查看设备列表和transport_id

adb devices -l

截个图试试(在cmd下)

adb -t 9 shell screencap /sdcard/screenshot.png

adb -t 9 pull /sdcard/screenshot.png Desktop/aa.png

要使用 adb 获取手机中的应用程序列表,可以使用以下命令:

adb shell pm list packages

获取包名和界面名

adb shell dumpsys window|findstr mCurrentFocus

PC控制手机

推荐用 QtScrcpy

scrcpy :

将安卓设备的屏幕映射到计算机上,并通过键盘和鼠标控制设备:

scrcpy -K -f -m1920 --tcpip=192.168.1.101:1111

调用camera

scrcpy --video-source=camera --no-audio --camera-facing=front -m1920 --camera-ar=16:9 --camera-fps=60 --orientation=flip90 -f --tcpip=192.168.1.101:1111

写个脚本

@REM utf-8防止乱码
chcp 65001
set /p var=请输入端口:
C:\auto_run\bin\scrcpy-win64-v2.4\scrcpy.exe -K -m1920 --window-title=malu --tcpip=192.168.1.101:%var%

快捷键

实体键盘控制    alt+k    (使用键盘时开启屏幕键盘)
最近           alt+s
返回           alt+b     alt+回退键
通知           alt+n

mDNS:

检查adb的mdns启用状态

adb mdns check
adb mdns services

Linux下开启mDNS 参考:locate-hosts-using-mdns

apt install avahi-daemon
avahi-daemon
systemctl status avahi-daemon.service

如需启用 adb 的 mDNS 发现功能,请运行以下命令:

adb mdns说明 https://developer.android.com/tools/adb#mdnsBackends

adb mdns操作步骤 https://source.android.google.cn/docs/devices/automotive/virtualization/tools

set ADB_MDNS_OPENSCREEN=1     # Windows
export ADB_MDNS_OPENSCREEN=1  # Linux

# 查看变量
echo %ADB_MDNS_OPENSCREEN%    # Windows
echo $ADB_MDNS_OPENSCREEN     # Linux

adb kill-server
adb start-server