pytest+playwright 简单笔记

from playwright.sync_api import sync_playwright

p = sync_playwright().start()  #启动playwright driver进程
'''
with sync_playwright() as p:    #with as 回话管理,可以简化代码,不需要调佣.start()和p.stop()  会自动调用
    browser2 = p.chromium.launch(headless=False)
    page = browser2.new_page()
    page.goto('https://www.byhy.net/_files/stock1.html')
    print(page.title())
    page.locator('#kw').fill('通讯\n')
    page.locator('#go').click()
    lcs = page.locator(".result-item").all()
    for lc in lcs:
        print(lc.inner_text())
    browser2.close()
'''


browser = p.chromiun.launch(headless=False) #启动浏览器,返回browser 类型对象
# browser1 = p.chromium.launch(headless=False,
#     executable_path="C:\Program Files\Google\Chrome\Application\chrome.exe")   executable_path=  可指定浏览器

page = browser.new_page()  #创建新页面,返回page类型对象



page.goto('http://www.baidu.com')  #打开百度 page.goto等同于driver.get(url)
print(page.title())  #打印网页标题

page.locator('#kw').fill('通讯') 
#page.locator 等同于drive.find_element(By_)  在playwright中#代表元素的id对象。  .fill()  等同于sendkeys()
page.locator('#go').click()   #  click()点击事件

page.wait_for_timeout(1000)  # playwright 的强制等待  等同于time.sleeo()

# #playwright自动化代码助手
# playwright codegen  ,需要在playwright.exe安装的目录下启动cmd命令执行playwright codegen

# -----跟踪功能 启用跟踪功能,在执行自动化后,通过记录的跟踪数据,回看自动化过程的每个细节
# 自动化执行完后,会在当前工作目录下生成trace.zip 这个文件,可执行playwright show-trace trace.zip
# from playwright.sync_api import sync_playwright
# p = sync_playwright().start()
# browser = p.chromiun.launch(headless=False)
# context = browser.new_context()  #创建BrowserContext对象
# context.tracing.start(snapshot=True, sources=True, sreenshots=True)
# page = context.new_page()
# page.goto('http://www.baidu.com')
#     print(page.title())
#     page.locator('#kw').fill('通讯\n')
#     page.locator('#go').click()
#     lcs = page.locator(".result-item").all()
#     for lc in lcs:
#         print(lc.inner_text())
# browser.close()
# p.stop()
#------ ...

lcs = page.locator(".result-item").all()
for lc in lcs:
    print(lc.inner_text())

browser.close()  # 关闭浏览器

p.stop() #停止playwright driver进程



# 点击元素  click()
# 元素内输入文本  fill()
# 打印元素内部内容  inner_text()
#定位元素 css选择器 定位方法

page.locator("#kw").fill()  # ("#kw")  #代表元素ID属性
page.locator(".result").fill()  #(".result")  .代表元素class属性

----要选择所有tag名为div的元素,可以如下
locators = page.locator('div').all()
for one in locators:
    print(one.inner_text())
#inner_text() 需要注意的是,只有当locator匹配的是单个元素,才能正常打印,若locator匹配的是多个元素,会抛出错误
要获取所有tag名为div 的内部可见文本,也可以直接调用 all_inner_texts
texts = page.locator('div').all_inner_texts

----  一个元素也可以有多个class类型 ,例如<span class='chinses student' >张三</span>
匹配的时候可以
page.locator(".chinses") 或者 page.locator(".student")
不能这样写 page.locator(".chinses student")
如果想同时表示着两个元素可以这样写:
page.locator(".chinses.student")

---验证css选择器,打开开发者模式,在元素页面,按住ctrl+f 输入css表达式,可以验证选择式定位的元素在那

---locator表达式匹配出了多个元素,要获取所有元素对应的locator方法,使用all方法
locators = page.locator('.plant').all()

--只要得到某种表达式对应的元素数量,可以使用count方法
count = page.locator('.plant').count()

---有时,我们只需要得到某种表达式对应的第一个或者最后一个元素,可以如下:
lct = page.locator('.plant')
print(lct.first.inner_text(),lct.last.inner_text())
也可以通过nth()方法,获取指定次序的元素,参数0,代表第一个
lct = page.locator('.plant')
print(lct.bth(1).inner_text())

----内部元素定位
lct = page.locator('#bottom')
print(lct.locator('#span').all_inner_texts())
#先定位到#bottom属性代表的元素,lct.locator('#span')是在之前定位的元素下的定位包含span属性的元素

----子元素和后代元素
元素内部可以包含其他元素 --子元素
如果元素2是元素1的直接子元素,,css选择器可以这样写
元素1 > 元素2    lct = page.locator('#bottom > #span')
也可以支持多个层级选择
元素1 > 元素2 > 元素3 > 元素4
后代元素
元素2 是 元素1 的后代元素, 要查元素2   css中的语法
元素1 元素2

根据属性选择 非id和class属性,可以用[]  a标签,超链接
<a href="http://www.baidu.com">
lct = page.locator('[href="http://www.baidu.com]')
属于a阶段,可以包含
lct = page.locator('a[href*="baidu"]')   href*  *是包含
开头
lct = page.locator('a[href^="http"]')  href^  ^是开头
结尾
lct = page.locator('a[href$="com"]')    href$  $是结尾
print(lct.inner_text())

一个元素有多个属性
<div class="iss" id="33">
lct = page.locator('div[class=iss][id="33"]')

综合选择
组选择
如果我们要同时选择所有class为plant和class为animal的元素
可以这样: lct = page.locator(".plant , .animal")   这种语法不分排序,只要命中都算匹配,逗号两边是或关系

同时要选择tag名为div和id为BYHY的元素  可以写成div,#BYHY
对应的代码
elements = wd.find_element(By.CSS_SELECTOR, "div,#BYHY")
for ele in elements:
    print(ele.text)

父元素的n个子节点
可以使用nth-child   只用:nth-child(1) 代表所有父类的第一个子元素,不管元素类型
div div:nth-child(1)  (1)代表就是第一个元素,索引从1开始

父元素的倒数第N个子节点
nth-last-child(2)
写法
p:nth-last-child(2) 倒数第二个刚好是P标签的

兄弟节点
如果h3标签后紧跟的是span标签
那么就是兄弟关系
可以写成
lct = page.locator("h3 + span")
后续所有的兄弟节点选择
lct = page.locator("h3 ~ span")


根据文本内容定位
get_by_text
# from playwright.sync_api import sync_playwright
# p = sync_playwright().start()
# browser = p.chromiun.launch(headless=False)
# context = browser.new_context()  #创建BrowserContext对象
# context.tracing.start(snapshot=True, sources=True, sreenshots=True)
# page = context.new_page()
# page.goto('http://www.baidu.com')
#     print(page.title())
#     page.locator('#kw').fill('通讯\n')
#     page.locator('#go').click()
#     lcs = page.get_by_text('11').all()  #匹配页面中所有包含11的元素
#     for lc in lcs:
#         print(lc.inner_text())
# browser.close()
# p.stop()
如果你希望的内容是11结尾的
import re
element = page.get_by_text("11$").all()  #可以用正则表达式刷选
for el in element:
    print(el)


元素 role定位
比如系统完成注册,html表示
<div class="alert-message" role="alert">
您已成功注册,很快会受到一封电子邮件
</div>
根据role定位
lc = page.get_by_role("alert")
print(lc.inner_text())
html中有些特定元素(semantic elements) 这些元素本身就包含role信息,不需要在代码上加上
比如<progress value="75" max="100">75 %</progress>  隐含了role="progressbar"元素
可以直接用一下语法
lc = page.get_by_role("progressbar")
print(lc.get_attribute("value")) #打印元素属性 value的值

再比如search类型的输入框,默认就有role="searchbox"

其他视觉定位
根据placeholder定位
一般input元素,通常都有placeholder 例如<input type="text" placeholder="catcha"/>
page.get_by_placeholder("catcha",exact=True).fill('gaoxin')
参数exact为True,表示完全匹配,区分大小写,False只需包含参数字符串即可,且不区分大小写

元素关联label定位
input元素,一般都有关联label
可使用get_by_label方法
比如:
<input aria-label="Username">
<label for="password-input">password:</label>
<input id="password-input">
可以这样定位,也有exact属性
page.get_by_label("Username").fill("john")
page.get_by_label("Password").fill("secret")

根据运输title属性定位
如果元素中又title属性,可以使用get_by_tilte定位

缺省等待时间
Playwright中,定位元素后,未找到元素,Playwright不会立刻抛出错误,会缺省等待30s,30s内元素找到了,就立即操作成功返回
我们可以修改代码修改这个缺省等待时间
# print(element.inner_text(timeout=10)) #10ms内打印出来
------在Browber中修改缺省等待时间
from playwright.sync_api import sync_playwright
p = sync_playwright().start()  #启动playwright driver进程
browser = p.chromium.launch(headless=False, slow_mo=50)
context = browser.new_context()
context.set_default_timeout(10) #修改缺省等待时间为10毫秒


界面操作
# 点击元素  click()
# 元素内输入文本  fill()
# 打印元素内部内容  inner_text() 单元素文本  all_inner_texts()多元素文本

text_contents() 或者 all_text_contents()  可以获取到元素中的隐藏文本

获取元素属性
get_attribute方法

获取元素内部的Html
page.inner_html()


点击
page.locator('ss').click() #单击
page.locator('ss').dbclick() #双击

光标悬停
page.locator('ss').hover()

等待元素可见
比如动态的内容,需要等一段时间后才出现
page.locator('#source').wait_for()  #可以使用参数time_out

判断元素是否可见
page.locator('#source').is_visible()  #判断是否可见,返回Ture 或者False

输入操作
文本输入
page.locator('#source').fill()

文本框清空clear()
page.locator('#source').clear()

获取输入框里的内容input_value()
page.locator('#source').input_value()

文件输入框set_input_files()
lc = page.locator('input[type=file]')
#单选一个文件
lc.clear()('d:/1.png')
#多选文件
lc.set_input_files('d:/1.png', 'd:/2.png')

-----勾选单选框和多选
点选单选框check()
page.locator('#source').check()
取消点选框uncheck()
page.locator('#source').uncheck()
判断点选框是否选中is_checked()
page.locator('#source').is_checked()
代码
lcs = page.locator('#s_radio input[name="teacher"]:checked').all()
teachers = [lc.get_attribute('value') for lc in lcs]
print('当前选中的是',' '.join(teachers))
page.locator('#s_radio input[name="小雷"]').check()   #确保选中的是小雷


多选用法和单选是一样的
代码
lcs = page.locator('#s_radio input[name="teacher"]:checked').all()
teachers = [lc.get_attribute('value') for lc in lcs]
print('当前选中的是',' '.join(teachers))
page.locator('#s_radio input[name="小红"]').check()   #确保选中的是小红


select 元素操作
单选  可使用select对象中的select_option()   选项option元素中的value或者选项文本,要完全匹配
#根据索引选择,从0开始,但是0有点bug
page.locator("#single").select_option(index=0)
#根据value属性选择
page.locator("#single").select_option(value="小红")
#根据选项文本选中
page.locator("#single").select_option(label="小红")
#清空所有选项
page.locator("#single").select_option([])


多选
#根据value属性或者选项文本多选
page.locator("#single").select_option("小红","小雷")
#根据value属性多选
page.locator("#single").select_option(value=["小红","小雷"])
#根据文本多选
page.locator("#single").select_option(label=["小红","小雷"])
#清空所有选项
page.locator("#single").select_option([])
注意:已经选中的选项,没有出现在参数里面的,将自动被清除

获取select选中选项
page.locator("#single").select_option(label=["小红","小雷"])
lcs = page.locator("#single option:checked").all_texts()
print(lcs)


网页操作
打开网址/刷新/前进/后退
打开网址page.goto()
刷新reload()
前进go_forward()
后退go_back()

获取网页HTML
page.content()

获取网页title
page.title()

设置页面大小
page.set_viewport_size({"width":640,"height":480})   #里面用字典


frame切换
使用frame_locator方法
#产生一个FrameLocator 对象
frame = page.frame_locator("iframe=[src='sample1.thml']")
#再在内部进行定位
其中,frame_locator 方法的参数时候css或者xpath

窗口切换
代码:
from playwright.sync_api import sync_playwright
p = sync_playwright().start()
browser = p.chromiun.launch(headless=False)

#创建browsercontext对象
context = browser.new_context
#通过context,创建page
page = context.new_page()

page.goto('http://www.baidu.com')
#单击链接,打开新窗口
page.locator('#sss').click()
#等待2s
page.wait_for_timeout(2000)
#pages属性是 所有窗口对应page对象的列表
newpage = context.pages[1]
#打印新窗口标题
print(newpage.title())
#打印老窗口标题
print(page.title())

如果打开了很多窗口,可以根据标题栏定位到要操作的page
代码:
for pg in context.pages:
    # 得到该窗口的标题栏目字符串,判断是不是我们要操作的那个窗口
    if "baidu" in pg.title():
        break
print(pg.title())

设置到当前tab
page.bring_to_front() 方法

关闭当前窗口
page.close()

冻结页面
F12后再console页签下输入debugger,就可以冻结,可以先输入,点击放到元素上后按下enter
也可以用 setTimeout(function(){debugger}, 5000) #代表5秒后执行debugger

截屏
page.screenshot(path="ss1.png")  #截屏当前页面可见内容,保存到当前工作目录下的ss1.png文件中
page.screenshot(path="ss1.png" , full_page=True) #截屏完整屏幕,包括不可见部分
page.locator('#111').screeenshot(path="ss1.png")  #仅截取元素内容显示部分截屏

拖拽
page.drag_and_drop("元素1","元素2")
代码:
#选中“span#t1”元素中的文本
page.locator("#t1").select_text()
#拖拽到 输入框 [placeholder="captcha] 里面去
page.drag_and_drop("#t1",'[placeholder="captcha"]')

弹出框
系统的警告弹框
alert  警告弹框 用户看完消息后就可以点击ok(确认)关闭
from playwright.sync_api import sync_playwright
p = sync_playwright().start()
browser = p.chromiun.launch(headless=False)
context = browser.new_context()  #创建BrowserContext对象
context.tracing.start(snapshot=True, sources=True, sreenshots=True)
page = context.new_page()
page.goto('http://www.baidu.com')
def handleDlg(dialog):
    page.wait_for_timeout(1000)
    dialog.accpet() #点击确认
    print(dialog.message)

#设置弹出对话框事件回调函数
page.on("dialog", handleDlg)
#点击alert按钮
page.locator('#b1').click()  #点击可弹出警告框的按钮


注意:注册的处理函数中一定要调用accept或者dismiss方法,让对话框消失,或者当对话框弹出,后续任何代码都不会执行,并且超时报错
Playwright在界面后弹出框是,发现没有任何注册的处理函数,会自动点击取消
page.locator('#b1').click()
page.locator('#b1').click()  #点击两次,会自动消失

confirm  确认取消弹框
from playwright.sync_api import sync_playwright
p = sync_playwright().start()
browser = p.chromiun.launch(headless=False)
context = browser.new_context()  #创建BrowserContext对象
context.tracing.start(snapshot=True, sources=True, sreenshots=True)
page = context.new_page()
page.goto('http://www.baidu.com')
def handleDlg(dialog):
    page.wait_for_timeout(1000)
    dialog.dismiss() #点击取消  或者accept()确认操作


prompt  输入弹框

from playwright.sync_api import sync_playwright
p = sync_playwright().start()
browser = p.chromiun.launch(headless=False)
context = browser.new_context()  #创建BrowserContext对象
context.tracing.start(snapshot=True, sources=True, sreenshots=True)
page = context.new_page()
page.goto('http://www.baidu.com')
def handleDlg(dialog):
    page.wait_for_timeout(1000)
    dialog.accpet('你好') #可在accept()中输入参数
    print(dialog.message)

#设置弹出对话框事件回调函数
page.on("dialog", handleDlg)
#点击alert按钮
page.locator('#b1').click()  #点击可弹出警告框的按钮




































  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值