浏览器、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有三种方法:

  1. framename属性
  2. frameURL
  3. 通过其他的任何的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,甚至文本内容)来搜索元素。只需直接使用即可,可以自动探测

简写
  1. 选择器以// 或者..开头,则会默认为是xpath=selector

    • 例子:page.click('//html') 可转换为 page.click('xpath=//html')
  2. 选择器开始和结束以引号("或者'),则默认为text=selector
    • 例子:page.click(' "foo" ') 可转换为 page.click('text="foo"')
  3. 其他的默认为是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处理(一)的更多相关文章

  1. selenium webdriver python 元素定位

    总结   定位查找时,返回查找到的第一个match的元素.如果找不到,则 raise NoSuchElementException   单个元素定位: find_element_by_idfind_e ...

  2. python selenium-webdriver 定位frame中的元素 (十三)

    定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素. 处理frame时主要使用到sw ...

  3. Appium + Python -------------元素定位

    说在前面 1.https://github.com/appium/python-client/tree/master/test  里面有一些test ,可以看看,研究研究 2.学会使用 uiautom ...

  4. python+selenium遇到元素定位不到的问题,顺便记录一下自己这次的错误(报错selenium.common.exceptions.NoSuchElementException)

    今天在写selenium一个发送邮件脚本时,遇到一些没有找到页面元素的错误.经过自己反复调试,找原因百度,终于解决了.简单总结一下吧,原因有以下几点: 一:Frame控件嵌套,.Frame/Ifram ...

  5. Selenuim+Python之元素定位总结及实例说明

    网页自动化最基本的要求就是要定位到各个元素,然后才能对该元素进行各种操作(输入,点击,清除,提交等),所以笔者今天来总结下Selenuim+Python最基本的几种定位方式及实例说明,希望能帮助到大家 ...

  6. Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

         在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException ...

  7. Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载

    元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...

  8. Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)

    简介 宏哥看你骨骼惊奇,印堂发亮,必是练武之奇才! 按照上一篇的节目预告,这一篇还是继续由宏哥给小伙伴们分享元素定位,是不是按照上一篇的秘籍修炼,是不是感觉到头顶盖好像被掀开,内气从头上冒出去,顿时觉 ...

  9. Python Selenium定位元素常用解决办法

       在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException), ...

  10. python学习之——selenium元素定位

    web自动化测试按步骤拆分,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 其中定位元素尤为关键,此篇是使用webdriver通过页面各个 ...

随机推荐

  1. 微信小程序云开发-云存储-上传文件(图片/视频)到云存储 精简代码

    说明 图片/视频这类文件是从客户端会话选择文件. 一.wxml文件添加if切换显示 <!--上传文件到云存储--> <button bindtap="chooseImg&q ...

  2. Java 使用新方法打印Word文档

    前言 我曾写过一篇文章,它主要介绍了如何通过物理打印机和虚拟打印机来打印Word文档.今天这篇教程将介绍一种新的方法来实现对Word文档的打印. 此次使用到的类库仍然是Spire.Doc for Ja ...

  3. 购买二手iPhone需要注意什么?这份避坑指南请收好!

    iPhone二手机市场一直非常火热,有时甚至出现供不应求的情况.主要是因为新机的价格不便宜,没什么性价比,很多小伙伴会选择低价购买二手iPhone,价格基本只要新机的二到五折.不过二手机的水深相信大家 ...

  4. P2015

    二叉苹果树 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include< ...

  5. POJ1704 Georgia and Bob 题解

    阶梯博弈的变形.不知道的话还是一道挺神的题. 将所有的棋子两两绑在一起,对于奇数个棋子的情况,将其与起点看作一组.于是便可以将一组棋子的中间格子数看作一推石子.对靠右棋子的操作是取石子,而对左棋子的操 ...

  6. C++利用模板在Windows上快速调用DLL函数

    更新日志 --------- 2021/08/01 更新V2.2 增加 GetHmodule 函数 - 允许用户获取HMODULE以验证加载DLL是否成功. 2021/08/03 更新V2.3 增加 ...

  7. python自动化之(自动生成测试报告)

    前言:  用python执行测试脚本, 测试报告是记录我们测试过程的问题, 方便我们对整个测试过程的把控. 这里引用的是别人写好的模板, 我们拿过来用就OK, 能力强者可自行编写模板 测试报告图模板: ...

  8. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  9. 实战爬取拷背漫画-Python

    ​  一.抓包获取链接 以爬取<前科者>为例 获取搜索链接 https://api.copymanga.com/api/v3/search/comic?limit=5&q=前科者 ...

  10. 服务启动shell脚本

    #!/bin/sh JarDir=`pwd` do_start() { echo "pandora-login start ..." nohup java -jar -Xmn256 ...