playwright-python 元素定位、frame处理(一)
浏览器、Browser contexts、frame
Playwright
可以同时启动多个浏览器(chromium、Firefox、webkit
),每个浏览器可以启动多个page
(在Playwright
上称作Browser contexts
)
浏览器
启动浏览器代码样例:
from playwright import sync_playwright
with sync_playwright() as p:
# 可以选择chromium、firefox和webkit
browser_type = p.chromium
# 运行chrome浏览器,executablePath指定本地chrome安装路径
# browser = browser_type.launch(headless=False,slowMo=50,executablePath=r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")
browser = browser_type.launch(headless=False)
page = browser.newPage()
page.goto('https://www.baidu.com/')
page.screenshot(path=f'example-{browser_type.name}.png')
browser.close()
Browser contexts
同一个浏览器启动多个page
,可以模拟多页面的场景:
from playwright import sync_playwright
with sync_playwright() as p:
browser_type = p.chromium
browser = browser_type.launch(headless=False)
context = browser.newContext()
page1 = context.newPage()
page1.goto('https://mail.163.com/')
page1.screenshot(path=f'page1-{browser_type.name}.png')
page2 = context.newPage()
page2.goto("https://www.baidu.com/")
page2.screenshot(path=f'page2-{browser_type.name}.png')
context.close()
browser.close()
Browser contexts
还可以模拟移动设备:
from playwright import sync_playwright
with sync_playwright() as p:
browser_type = p.chromium
iphone_11 = p.devices['iPhone 11 Pro']
browser = browser_type.launch(headless=False)
context = browser.newContext(**iphone_11, permissions=['geolocation'], colorScheme='dark', locale='zh-CN')
page = context.newPage()
page.goto('https://mail.163.com/')
page.screenshot(path=f'page2-{browser_type.name}.png')
context.close()
browser.close()
frame
处理frame,查找frame有三种方法:
frame
的name
属性frame
的URL
- 通过其他的任何的
selector
from playwright import sync_playwright
with sync_playwright() as p:
browser_type = p.chromium
browser = browser_type.launch(headless=False)
page = browser.newPage()
page.goto('https://mail.163.com/')
# 通过selector、name、URL
login_frame = page.querySelector("[id^='x-URS-iframe']").contentFrame()
# login_frame = page.querySelector("#loginDiv>iframe").contentFrame()
# login_frame2 = page.frame("name").contentFrame()
# login_frame3 = page.frame("URL").contentFrame()
# 查看所有的frames
print(page.frames)
login_frame.fill("input[name='email']", "test123")
login_frame.fill("input[name='password']", "1234")
login_frame.click("#dologin")
page.screenshot(path=f'example-{browser_type.name}.png')
browser.close()
元素选择器(元素查找)
语法
Playwright
可以使用CSS选择器
、XPath选择器
、HTML属性
(如id、data-test-id
,甚至文本内容
)来搜索元素。只需直接使用即可,可以自动探测
简写
- 选择器以
//
或者..
开头,则会默认为是xpath=selector
- 例子:
page.click('//html')
可转换为page.click('xpath=//html')
- 例子:
- 选择器开始和结束以引号(
"
或者'
),则默认为text=selector
- 例子:
page.click(' "foo" ')
可转换为page.click('text="foo"')
- 例子:
- 其他的默认为是
css=selector
- 例子:
page.click('div')
可转换为page.click('css=div')
- 例子:
链式选择器
选择器可以与>>
组合使用,例如selector1 >> selector2 >> selectors3
。当选择器被链接时,下一个选择器会相对于前一个选择器的结果进行查询。
例如:
page.querySelector('css=article >> css=.bar > .baz >> css=span[attr=value]')
等同于:
page.querySelector('article').querySelector('.bar > .baz').querySelector('span[attr=value]')
css=article >> text=Hello
查找文本为Hello的 article 元素;*css=article >> text=Hello
查找包含文本Hello的 article 元素
最佳实践
以下只是写出了部分用法,详情参考
使用
data-test-id
:page.click("data-test-id=login")
CSS 和 XPath
,page.click('div')
page.click('//html/body/div')
# 明确指定类型
page.click('css=div')
page.click('xpath=//html/body/div')
# 点击#free-month-promo元素内文本为“Sign Up”的元素
page.click('#free-month-promo >> text=Sign Up') page.fill('css=[placeholder="Search GitHub"]')
page.fill('[placeholder="Search GitHub"]') # 简写
通过文本子字符串查找
page.click('text="Login"')
page.click('"Login"'); # 简写
获取某元素内的所有文本
print(page.evalOnSelector('.headerLogo', """e => e.textContent"""))
print(page.querySelector('.headerLogo').textContent())
CSS
扩展: visible
# 点击第一个button
page.click('button')
# 点击第一个可视的button,如果有其他不可视的,则会忽略他们
page.click('button:visible')
CSS
扩展: text
:text("substring")
当元素的文本在某处包含"substring"时进行匹配。匹配是不区分大小写的。匹配还对空格进行规范化,例如,它将多个空格转换为一个空格,换行并忽略开头和结尾的空格:text-is("string")
当元素的文本等于"string"时进行匹配。匹配不区分大小写,并且对空格规格化button:text("Sign in")
文本选择器可以与常规CSS
相结合:text-matches("[+-]?\\d+")
根据正则表达式匹配文本。注意,像反斜杠\,引号",方括号[]和更多的特殊字符应该被转义。:text-matches("value", "i")
使用指定的标记匹配正则表达式的文本
page.click('button:text("Sign in")')
page.querySelector(':text("163网易邮箱")').textContent()
参考
playwright-python 元素定位、frame处理(一)的更多相关文章
- selenium webdriver python 元素定位
总结 定位查找时,返回查找到的第一个match的元素.如果找不到,则 raise NoSuchElementException 单个元素定位: find_element_by_idfind_e ...
- python selenium-webdriver 定位frame中的元素 (十三)
定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素. 处理frame时主要使用到sw ...
- Appium + Python -------------元素定位
说在前面 1.https://github.com/appium/python-client/tree/master/test 里面有一些test ,可以看看,研究研究 2.学会使用 uiautom ...
- python+selenium遇到元素定位不到的问题,顺便记录一下自己这次的错误(报错selenium.common.exceptions.NoSuchElementException)
今天在写selenium一个发送邮件脚本时,遇到一些没有找到页面元素的错误.经过自己反复调试,找原因百度,终于解决了.简单总结一下吧,原因有以下几点: 一:Frame控件嵌套,.Frame/Ifram ...
- Selenuim+Python之元素定位总结及实例说明
网页自动化最基本的要求就是要定位到各个元素,然后才能对该元素进行各种操作(输入,点击,清除,提交等),所以笔者今天来总结下Selenuim+Python最基本的几种定位方式及实例说明,希望能帮助到大家 ...
- Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)
在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException ...
- Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载
元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...
- Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)
简介 宏哥看你骨骼惊奇,印堂发亮,必是练武之奇才! 按照上一篇的节目预告,这一篇还是继续由宏哥给小伙伴们分享元素定位,是不是按照上一篇的秘籍修炼,是不是感觉到头顶盖好像被掀开,内气从头上冒出去,顿时觉 ...
- Python Selenium定位元素常用解决办法
在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException), ...
- python学习之——selenium元素定位
web自动化测试按步骤拆分,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 其中定位元素尤为关键,此篇是使用webdriver通过页面各个 ...
随机推荐
- 查看JVM默认参数及微调JVM启动参数
目录 查看某个JVM进程堆内存信息 微调JVM启动参数 查看JVM的一些默认参数 参考廖雪峰老师的这篇 JVM调优的正确姿势: https://www.liaoxuefeng.com/article/ ...
- JAVA基础(代码)练习题61~90
JAVA基础 61.设计一个方法打印数组{'a','r','g','s','e','r'}中下标为1和3的的元素 package Homework_90; /** * 设计一个方法打印数组{'a',' ...
- 测试龙芯 LoongArch .NET之 使用 FastTunnel 做内网穿透远程计算机
龙芯3A5000 已经上市,与龙芯3A5000配套的三大编译器GCC.LLVM.GoLang和三大虚拟机Java.JavaScript..NET均已完成开发,从老伙计哪里搞来一台3A5000 机器,安 ...
- BigDecimal之除不尽报错
当bigdecimal除不尽(循环小数)后会报错,下面的是BigDecimal ,divide方法提供的精确小数方法(推荐使用) BigDecimal avgCapital = loanAmount. ...
- 爬取房价信息并制作成柱状图XPath,pyecharts
以长沙楼盘为例,看一下它的房价情况如何url = https://cs.newhouse.fang.com/house/s/b91/ 一.页面 二.分析页面源代码 我们要获得的数据就是名字和价格,先来 ...
- 在LinuxMint 17 MATE中安装NVIDIA显卡驱动
第一步:在Linux系统中安装Nvidia显卡驱动需要关闭X Server. 打开终端,进入ROOT权限,执行以下命令 $ sudo service mdm stop 此时将会把X Server关闭, ...
- 用postman进行web端自动化测试
概括说一下,web接口自动化测试就是模拟人的操作来进行功能自动化,主要用来跑通业务流程. 主要有两种请求方式:post和get,get请求一般用来查看网页信息:post请求一般用来更改请求参数,查看结 ...
- SQL_之 递归_START WITH id ='102' CONNECT BY PRIOR pid=id
oracle 递归用法 SELECT * FROM menu START WITH id ='102' CONNECT BY PRIOR pid=id 一种应用 SELECT * FROM menu ...
- vscode源代码管理(vscode报错 未找到Git,请安装Git,或在"git.path" 设置中配置)
vscode源代码管理(vscode报错 未找到Git,请安装Git,或在"git.path" 设置中配置) 直接上图,电脑上已经安装git,由于vscode没有找到git,所以v ...
- 使用分区助手转移windows 10系统出现黑屏boot manager报错问题。
问题原因: 在使用分区助手迁移windows 10到ssd中,设置完boot管理器后,出现黑屏问题, 经过长时间的搜索,发现在迁移系统的时候,只迁移了C盘的系统,没有连同msr引导 文件一同传过去,会 ...