浏览器、Browser contextsframe

Playwright 可以同时启动多个浏览器(chromium、Firefox、webkit),每个浏览器可以启动多个page(在Playwright上称作Browser contexts

浏览器

启动浏览器代码样例:

from playwright import sync_playwrightwith sync_playwright() as p:# 可以选择chromium、firefox和webkitbrowser_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_playwrightwith sync_playwright() as p:browser_type = p.chromiumbrowser = 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_playwrightwith sync_playwright() as p:browser_type = p.chromiumiphone_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_playwrightwith sync_playwright() as p:browser_type = p.chromiumbrowser = browser_type.launch(headless=False)page = browser.newPage()page.goto('https://mail.163.com/')# 通过selector、name、URLlogin_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()# 查看所有的framesprint(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()
    

参考

  • https://github.com/microsoft/playwright-python
  • https://playwright.dev/docs/why-playwright

playwright-python 元素定位、frame处理(一)相关推荐

  1. python元素定位input button_python+selenium 定位到元素,无法点击的解决方法

    报错 selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (234.75 ...

  2. python元素定位8大方法

    find_element() 8中元素定位方法: 1.id定位:使用元素的id属性定位 2.name定位:使用元素的name属性定位 3.class定位: 使用元素的class属性定位 class属性 ...

  3. python元素定位input button_selenium+python 定位元素方法

    元素定位主要方法: id定位:find_element_by_id(' ') name定位:find_element_by_name(' ') class定位:find_element_by_clas ...

  4. python元素定位方法之CSS定位

    前言 一些人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css的 ...

  5. python元素定位的八种方法_selenium webdriver基于Python系列之八种元素定位方法

    1.id.name.class name.tag name.link text.partial link text.xpath.css selector在 Python 语言中对应的定位方法如下: f ...

  6. python元素定位id和name_Python+Selenium自动化软件测试实战:Xpath,class,id,name定位和Iframe框架跳转...

    web自动化的前提:环境要求:python和pycharm 2.安装好环境需要后还需要cmd 输入pip install selenium 引入selenium web自动化测试库 3.google浏 ...

  7. python元素定位id和name_Python Selenium定位html元素|find_element_by_class-name-id-tag-css-xpath-text...

    Selenium官方给了八种定位方法 1.find_element_by_class_name通过class name定位元素 我们拿Pythonfree网站来举例,点击右上角的搜索框. 鼠标右击搜索 ...

  8. python元素定位id和name_python中通过selenium简单操作及元素定位知识点总结

    浏览器的简单操作 # 导入webdriver模块 # 创建driver对象,指定Chrome浏览器 driver = webdriver.Chrome() # 窗口最大化 driver.maximiz ...

  9. python selenium定位元素方法,python + selenium 练习篇 - 定位元素的方法

    1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...

  10. python selenium 元素定位和页面操作

    目录 一.浏览器操作 二.简单对象的定位 三.操作测试对象 四.鼠标事件 五.键盘事件 六.获取页面的title和url 七.设置等待时间 八.定位一组对象 九.层级定位 十.多表单切换 十一.多窗口 ...

最新文章

  1. anaconda切换盘符以及手动安装包
  2. 【机器学习入门笔记8:TensorFlow运算实质】20190216
  3. 2018 Multi-University Training Contest 10 - CSGO
  4. 小程序引用其他页面js_来聊聊小程序页面之间如何通信
  5. 又论社区风气, 与程序员是干嘛地的.
  6. 前端学习(2004)vue之电商管理系统电商系统之阻止页签切换
  7. 【MongoDB for Java】Java操作MongoDB
  8. Java新手学习路线
  9. SplObserver观察者模式
  10. WAPI在校园网应用中的证书安装
  11. 360浏览器是ie浏览器吗?有什么区别
  12. 1990年的图灵奖获得者-Fernando Jose Corbato
  13. windows录屏_录制视频的软件有哪些?三款软件轻松应对录屏_
  14. UI自动化的po模型
  15. Feng Shui POJ - 3384
  16. JavaBeans分类
  17. 计算机科学期刊是ISTP吗,ISTP期刊是核心期刊吗
  18. DevOps Master教练十二条原则
  19. pdf转换成jpg在线
  20. 给自己最近定一个小目标

热门文章

  1. C#代码实现上传文件到SharePoint文档库
  2. .then()方法的意思和用法
  3. 第24集丨人生的智慧:做人之道“成色”比“斤两”更重要
  4. 13 MATLAB 三维图形绘制
  5. el-transfer 用法
  6. Python-property
  7. windows下、Linux下最好用markdown查看器:Typora(查看.md文件)
  8. jenkins发送邮件添加附件
  9. 如何将邮箱里一封邮件添加到附件中进行发送
  10. 李山甫 鳴谷 跌足折齒