百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Selenium、Playwright、Puppeteer 如何测试淘宝商城

myzbx 2025-09-29 08:31 52 浏览

做一个实战级的分析,看看 Selenium、Playwright、Puppeteer 如何测试淘宝商城(以登录、搜索、商品详情验证为例),并结合三者的特性给出详细实例与对比。


1 测试目标与挑战

目标场景

  • 打开淘宝首页
  • 登录(模拟输入账号密码或加载已保存的登录状态)
  • 搜索关键词(如“手机”)
  • 验证搜索结果页是否包含相关商品
  • 点击进入商品详情页,验证标题与价格元素存在

挑战点

  • 淘宝有登录验证码反爬虫机制(需处理滑块、二维码等)
  • 页面元素动态加载(需显式/隐式等待)
  • 跨浏览器兼容(Selenium、Playwright可多浏览器,Puppeteer偏Chromium)
  • 可能需要模拟真实用户行为(鼠标移动、滚动、延时)

2 Selenium 实例(Python)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time

# 配置浏览器
options = Options()
options.add_argument("--start-maximized")
driver = webdriver.Chrome(service=Service(), options=options)

try:
    # 打开淘宝
    driver.get("https://www.taobao.com")

    # 点击登录(这里建议使用扫码或cookie复用,避免验证码)
    driver.find_element(By.LINK_TEXT, "亲,请登录").click()
    time.sleep(10)  # 手动扫码或输入账号密码

    # 搜索商品
    search_box = driver.find_element(By.ID, "q")
    search_box.send_keys("手机")
    search_box.send_keys(Keys.ENTER)

    # 等待结果加载
    time.sleep(3)
    items = driver.find_elements(By.CSS_SELECTOR, ".item.J_MouserOnverReq")
    print(f"找到 {len(items)} 个商品")

    # 点击第一个商品
    if items:
        items[0].click()
        driver.switch_to.window(driver.window_handles[-1])
        title = driver.find_element(By.CSS_SELECTOR, ".tb-main-title").text
        print("商品标题:", title)

finally:
    driver.quit()

特点

  • 语言多样(Java、Python、C#等)
  • 需手动处理验证码或复用登录状态
  • 适合已有 Selenium 测试体系的团队

3 Playwright 实例(Python,同步 API)

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context(storage_state="auth.json")  # 复用登录状态
    page = context.new_page()

    # 打开淘宝
    page.goto("https://www.taobao.com", timeout=60000)

    # 如果未登录,可手动扫码一次并保存状态
    # page.click("text=亲,请登录")
    # page.wait_for_timeout(10000)
    # context.storage_state(path="auth.json")

    # 搜索
    page.fill("#q", "手机")
    page.keyboard.press("Enter")

    # 等待结果
    page.wait_for_selector(".item.J_MouserOnverReq")
    items = page.query_selector_all(".item.J_MouserOnverReq")
    print(f"找到 {len(items)} 个商品")

    # 点击第一个商品
    if items:
        items[0].click()
        page.wait_for_load_state("domcontentloaded")
        print("商品标题:", page.inner_text(".tb-main-title"))

    browser.close()

特点

  • 跨浏览器(Chromium、Firefox、WebKit)
  • 自动等待机制,减少 sleep
  • 支持保存/加载登录状态(绕过验证码)
  • API 现代化,调试工具丰富(Codegen、Trace Viewer)

4 Puppeteer 实例(Node.js)

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();

  // 打开淘宝
  await page.goto('https://www.taobao.com', { timeout: 60000 });

  // 点击登录(建议扫码)
  await page.click('text=亲,请登录');
  await page.waitForTimeout(10000); // 手动扫码

  // 搜索
  await page.type('#q', '手机');
  await page.keyboard.press('Enter');

  // 等待结果
  await page.waitForSelector('.item.J_MouserOnverReq');
  const items = await page.$('.item.J_MouserOnverReq');
  console.log(`找到 ${items.length} 个商品`);

  // 点击第一个商品
  if (items.length > 0) {
    await items[0].click();
    await page.waitForSelector('.tb-main-title');
    const title = await page.$eval('.tb-main-title', el => el.innerText);
    console.log('商品标题:', title);
  }

  await browser.close();
})();

特点

  • 专注 Chromium,启动快
  • API 简洁,适合前端团队
  • 对 Chrome DevTools 协议支持原生,调试方便
  • 跨浏览器能力弱(Firefox 支持实验性)

5 三者在淘宝测试的对比

维度

Selenium

Playwright

Puppeteer

浏览器支持

全主流浏览器

Chromium、Firefox、WebKit

Chromium(Firefox 实验性)

语言支持

多语言

JS/TS、Python、Java、C#

JS/TS

验证码绕过

Cookie/手动扫码

Cookie/Storage State

Cookie/手动扫码

等待机制

需显式/隐式等待

自动等待 + 显式等待

显式等待

调试工具

浏览器 DevTools

Codegen、Trace Viewer

Chrome DevTools

适合团队

传统测试团队

新项目、跨浏览器需求

前端/爬虫团队


6 淘宝测试的实战建议

  • 登录环节:淘宝验证码复杂,建议首次手动扫码,保存 Cookie 或 Storage State,后续复用
  • 元素选择器:淘宝 DOM 结构复杂且动态,建议用稳定的 CSS/XPath 或 data-* 属性
  • 反爬虫规避:模拟真实用户操作(滚动、延时、鼠标移动),避免过快执行
  • 跨浏览器测试:Playwright 更优;只测 Chrome 则 Puppeteer 更轻量
  • 集成到 CI/CD:Selenium 与 Playwright 都有较成熟的集成方案

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...