Playwright和Selenium都是用于Web UI自动化测试的工具,但是它们有一些不同的特点和功能。
- Playwright是由微软开发的一个较新的框架,它使用websockt协议来操作浏览器内核,可以实时获取页面状态,也可以和浏览器双向沟通。它支持多种语言(TypeScript、JavaScript、Python、.NET、Java),多种浏览器(Chromium、WebKit和Firefox),并且可以在Windows、Linux和Mac上运行。它不需要下载浏览器驱动,可以通过命令行安装浏览器,并且启动速度很快。它还提供了一些高级的功能,比如context环境隔离、headless无头模式、无痕模式、wait_for_load_state精准等待、多种内置定位器、元素状态智能判断、iframe对象操作、alert异步监听、文件上传下载处理、多窗口标签监听、事件监听、捕获ajax请求、mock功能、expect断言、录制视频、trace追踪、断点调试等。它还可以生成pytest用例,也可以进行接口测试。总之,Playwright是一个简单方便、功能强大、稳定性高的工具。
- Selenium是一个出现较早的工具,它使用http协议来自动化Web浏览器,允许开发人员编写与网页和元素交互的测试。它支持更多的语言(C#,Java,Perl,PHP,Python 和Ruby),更多的浏览器(IE(7, 8, 9, 10, 11),Firefox,Safari,Google Chrome,Opera,Edge等),并且也可以在Windows,Linux,Mac上运行。但是它需要下载对应版本的浏览器驱动,并且启动速度较慢。它没有提供像Playwright那样的高级功能,而是需要开发人员自己封装或者导入其他模块来实现。比如元素等待、点击元素等操作、定位报错、元素不在当前屏幕、iframe切换、alert处理、文件上传下载处理、多窗口标签切换、执行JavaScript等。它也没有提供录制视频、trace追踪、断点调试等功能。它只能获取当时的页面状态,不能实时监听或者模拟接口数据。总之,Selenium是一个灵活性高、用户群体大、学习资料多的工具。
根据以上的介绍,我们可以看出Playwright和Selenium各有优缺点。
- Playwright的优点是简单方便、功能强大、稳定性高,缺点是相对新,用户群体少,学习资料少。
- Selenium的优点是灵活性高、用户群体大、学习资料多,缺点是需要自己封装或者导入其他模块来实现一些功能,启动速度慢,稳定性差。
所以,在选择使用哪个工具的时候,需要根据自己的需求和情况来决定。如果你想要快速上手一个简单方便且功能强大的工具,那么Playwright可能更适合你。下面以python使用Playwright采集航班信息https://www.luckyair.net为示例:
# 使用playwright.chromiumfromplaywright.sync_apiimportsync_playwright# 设置亿牛云(动态转发隧道代理)爬虫代理加强版 代理IP的用户名和密码proxy_username="16IP"proxy_password="16YUN"withsync_playwright() asp: # 启动chromium浏览器,并设置代理browser=p.chromium.launch(proxy={"server": f"http://{proxy_username}:{proxy_password}@your_proxy_ip:your_proxy_port"}) # 启动 Chromiumbrowser=p.chromium.launch() # 设置亿牛云(动态转发隧道代理)爬虫代理加强版 代理IP的服务器context=browser.new_context(proxy={ "server": "http://www.16yun.cn:31000", "username": proxy_username, "password": proxy_password }) # 创建一个新页面page=context.new_page() # 访问网站 https://www.luckyair.netpage.goto("https://www.luckyair.net") # 等待页面加载完成page.wait_for_load_state("networkidle") # 获取特价机票信息的元素列表tickets=page.query_selector_all(".special-ticket-item") # 创建一个空列表,用于存储特价机票信息data= [] # 遍历每个元素,获取相关信息forticketintickets: # 获取出发地、目的地、价格、日期等信息departure=ticket.query_selector(".departure").inner_text() destination=ticket.query_selector(".destination").inner_text() price=ticket.query_selector(".price").inner_text() date=ticket.query_selector(".date").inner_text() # 将信息存入字典中info= { "departure": departure, "destination": destination, "price": price, "date": date } # 将字典添加到列表中data.append(info) # 关闭浏览器browser.close() # 进行整理统计# 导入pandas模块,用于数据分析importpandasaspd# 将列表转换为DataFrame对象df=pd.DataFrame(data) # 打印DataFrame对象print(df) # 按照价格升序排序df.sort_values(by="price", inplace=True) # 打印排序后的DataFrame对象print(df) # 统计每个出发地的特价机票数量count=df.groupby("departure").size() # 打印统计结果print(count)