UI自动化之Selenium 和 Playwright
Selenium
概述:
Selenium 是最广泛使用的开源 Web UI(用户界面)自动化测试套件之一。Selenium 支持的语言包括C#,Java,Perl,PHP,Python 和 Ruby。目前,Selenium Web 驱动程序最受 Python 和 C#欢迎。 Selenium 测试脚本可以使用任何支持的编程语言进行编码,并且可以直接在大多数现代 Web 浏览器中运行。在爬虫领域 selenium 同样是一把利器,能够解决大部分的网页的反爬问题
安装:
1
| pip install selenium -i -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
|
下载Driver
需要使用对应的驱动才能打开对应的浏览器
简单打开浏览器
1 2 3 4 5 6 7 8 9 10 11 12
| from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
title = driver.title
driver.implicitly_wait(0.5)
input_element = driver.find_
|
初始化等简单操作
1、初始化浏览器、刷新、最大化、后退、前进、截图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import time from selenium import webdriver from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.back()
timl.sleep(2)
driver.forward()
chr.refresh()
driver.get_screenshot_as_file("1.png")
driver.find_element(By.ID,'kw').send_keys("saa")
driver.find_element(By.ID,'su').click()
driver.find_element(By.ID,'kw').clear()
driver.close()
|
单个元素定位8大【重点】
定位用什么方法,用driver的find_element寻找元素方法
1
| def find_element(self, by=By.ID, value: Optional[str] = None) -> WebElement:
|
我们,然后在这个方法里面使用By里面的属性by=By.XXX
我们再看一下By里面的属性就知道有几种方式了
1 2 3 4 5 6 7 8 9 10 11 12
| from selenium.webdriver.common.by import By class By: """Set of supported locator strategies."""
ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"
|
以在百度首页的输入框为例元素定位
1、通过元素id定位【唯一】
id定位比较唯一,但是有id的元素少
1 2
| driver = webdriver.Chrome() driver.find_element(By.ID,'kw').send_keys("Selenium是什么")
|
2、通过元素的class
class name定位
1
| driver.find_element(By.CLASS_NAME,'s_ipt').send_keys("Selenium是什么")
|
3、通过元素的name
1
| driver.find_element(By.NAME,'wd').send_keys("Selenium是什么")
|
4、通过元素标签
1
| driver.find_element(By.TAG_NAME, "lname")
|
5、通过超链接文本–>这个是定位跳转链接
1
| driver.find_element(By.LINK_TEXT, "xxx")
|
6、通过超链接文本(模糊匹配)–>这个是定位跳转链接
1
| driver.find_element(By.PARTIAL_LINK_TEXT, "xxx")
|
7、通过xpath【万能,重点】
1
| driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys("Selenium是什么")
|
8、通过css选择器(万能,重点)
1
| driver.find_element(By.CSS_SELECTOR,'#kw').send_keys("Selenium是什么")
|
9、多个元素定位的方法
与单个元素的定位方式类似,把find_element改成find_elements即可
10、定位下拉框
可以下拉选择,也可以直接定位到对应的下拉选项,因为你的目的是为了找到这个元素
1 2 3 4 5 6 7
| select_by_index() select_by_value() select_by_visible_text() Select(driver.find_element_by_name("姓名")).select_by_index(1)
a=driver.find_element_by_name("姓名") Select(a).select_by_index(1)
|
针对浏览器的操作
控制浏览器操作:
- 获取当前页面的title标题、url信息
- 最大化、最小化浏览器
- 控制、获取浏览器的大小(页面大小)
- 前进、后退、刷新页面
- 执行JS语句
- 滚动滑动页面
- 截图保存
获取当前页面的title标题、url信息
1 2
| print(f"标签页title:{driver.title}") print(f"标签页url:{driver.current_url}")
|
最大化、最小化浏览器
1 2 3
| driver.maximize_window() driver.minimize_window() driver.fullscreen_window()
|
控制、获取浏览器的大小(页面大小)
1 2 3 4 5 6 7 8
| driver.set_window_size(1024, 768)
width = driver.get_window_size().get("width") height = driver.get_window_size().get("height")
size = driver.get_window_size() width1 = size.get("width") height1 = size.get("height")
|
前进、后退、刷新页面
1 2 3 4 5 6 7 8
| driver.forward()
driver.back()
driver.refresh()
|
屏幕截图、元素屏幕截图
1 2 3 4 5 6
| driver.save_screenshot('./image.png')
ele = driver.find_element(By.CSS_SELECTOR, 'h1')
ele.screenshot('./image.png')
|
针对元素的简单操作
常见元素操作包含:
1
| driver.find_element(By.NAME, "color_input").click()
|
1
| driver.find_element(By.NAME, "email_input").clear()
|
1
| login_btn = driver.find_element_by_class_name("login")
|
1
| a_text = driver.find_element_by_tag_name("a")
|
1
| a_attr = driver.find_element_by_class_name("mnav")
|
1 2 3 4
| ant_btn3 = driver.find_element_by_class_name("ant-btn3")
ant_btn4 = driver.find_element_by_class_name("ant-btn4")
|
鼠标操作
- 执行操作
- 左键、右键单击、双击
- 鼠标悬停到元素、偏移处
- 长按
- 拖动
Playwright–UI自动化神器【初窥】
概述
playwright是由微软开发的Web UI自动化测试工具, 支持的浏览器包括:Chromium, Firefox and WebKit,支持的编码语言包括:Node.js、Python、C# 和 Java语言。
特点:
强适应性 • 测试不再容易失效
自动等待:Playwright 能够自动等待元素达到可操作的状态,外加一系列丰富的内置时间。不用再人工定义超时—-这是测试容易失败的主要原因。
Web有限的断言。Playwright 断言专门为动态加载的web应用设计。能够在满足需要的条件前自动重试。
可追踪。通过配置重试策略,采用捕捉执行轨迹、视频、截图来解决测试容易失效的问题。
不用再权衡取舍、不再有限制。
一切并行。跨越多个tabs、多个origins和多个users的测试场景。在一个测试中能够为不同的用户创建具有不同上下文的场景,并能在你的服务器上运行,
可信事件:元素悬停(hover)、动态控件的交互、生产可信时间,Playwright 使用与真实用户一致的输入方式(pipeline)。
测试 frames,穿透 Shadow DOM****。 Playwright 的选择器能够穿透 shadowDOM 和允许无缝输入 frame。
一次登录。 保存上下文的身份验证状态并在所有测试中重用它。这绕过了每个测试中的重复登录操作,但提供了独立测试的完全隔离。
强大的工具
Codegen 。 通过记录您的操作来生成测试。将它们保存为各种语言。
实操
打开浏览器网页
1 2 3 4 5 6 7 8
| from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(channel="chrome", headless=False) page = browser.new_page() page.goto("http://www.baidu.com") print(page.title()) browser.close()
|
脚本录制:
使用命令
1
| playwright codegen --target python -o baidu_test.py -b chromium https://www.baidu.com/
|
录制结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None: browser = playwright.chromium.launch(headless=False) context = browser.new_context() page = context.new_page() page.goto("https://www.baidu.com/") page.locator("#kw").click() page.locator("#kw").fill("中国好声音") page.get_by_role("button", name="百度一下").click() with page.expect_popup() as page1_info: page.get_by_role("link", name="中国好声音 - 百度百科").click() page1 = page1_info.value with page1.expect_popup() as page2_info: page1.locator("div").filter(has_text=re.compile(r"^薛之谦$")).get_by_role("link").click() page2 = page2_info.value page2.close() page1.close() page.close()
context.close() browser.close()
with sync_playwright() as playwright: run(playwright)
|
识别元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| page.get_by_role()
page.get_by_text()
page.get_by_label()
page.get_by_placeholder()
page.get_by_title()
page.get_by_test_id()
|
playwright除了上述定位方式,还支持selenium的8种by元素定位,id、xpath、css等等,另外还有W3C标准规定的webDriver协议为5种定位方式
CSS、Link text、Partial link text、Tag name、XPath
playwright把这些定位归类成3种,分别是:css、xpath、text
判断元素状态
1 2 3 4 5 6 7 8 9 10 11
| is_checked
is_disabled
is_editable
is_enabled
is_hidden
is_visible
|
元素操控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 写相关操作:clear、fill
点击:click、dbclick
下拉选择框:select_option
文件上传:set_input_files
鼠标拖动:down、up、move、wheel
触摸屏幕:tap
键盘按键:press
截屏:screenshot
页面切换expect_popup
执行js:evaluate
|