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() #点击可弹出警告框的按钮
pytest+playwright 简单笔记
最新推荐文章于 2024-07-13 22:27:25 发布