Python-playwright 初步使用

說明:playwright可以用于UI自動(dòng)化測(cè)試捕传,有方便的錄制插件,錄制出來的腳本準(zhǔn)確度也比較高扩劝,也比較方便調(diào)試修改庸论。下面以直接使用者的角度介紹下playwright如何快速上手使用

一、基于python環(huán)境安裝playwright

說明:安裝playwright插件今野,注意要先安裝python環(huán)境

pip install playwright

二葡公、下載瀏覽器內(nèi)核驅(qū)動(dòng)

說明:下載瀏覽器內(nèi)核,錄制程序使用

playwright install

三条霜、啟動(dòng)錄制

playwright codegen https://baidu.con

四催什、流程說明

說明:直接把錄制生成的代碼復(fù)制到python編輯器里面就能運(yùn)行梆掸,下面我們說明下各代碼含義

再調(diào)試下錄制生成的代碼似扔,確保每個(gè)元素能正常獲取到,特別是部分元素是通過id獲取的缝驳,這種就需要手動(dòng)修改腳本


1.生成瀏覽器驅(qū)動(dòng)

browser = playwright.chromium.launch(headless=False)

說明:可支持的瀏覽器有'chromium',?'webkit'?or?'firefox'拆内,方法里面的參數(shù)支持設(shè)置是否是無頭模式旋圆、窗口大小、是否代理等等

2.生成瀏覽器上下文(context)對(duì)象

context = browser.new_context(no_viewport=True)

說明:創(chuàng)建context對(duì)象麸恍,context之間是相互隔離的灵巧,可以理解為輕量級(jí)的瀏覽器實(shí)例.如需要不同用戶登錄同一個(gè)網(wǎng)頁搀矫,不需要?jiǎng)?chuàng)建多個(gè)瀏覽器實(shí)例,只需要?jiǎng)?chuàng)建多個(gè)context即可刻肄。

3.生成瀏覽器頁面page

page = context.new_page()

說明:page就相當(dāng)于瀏覽器的選項(xiàng)卡瓤球,一般在瀏覽器context上創(chuàng)建,后續(xù)打開網(wǎng)頁 敏弃、定位元素卦羡、頁面操作都是基于page

4.打開一個(gè)指定url地址

page.goto("https://www.baidu.com")

五、相關(guān)操作方法說明

1.常用基本方法

查找元素

page.locator():元素定位器

page.get_by_text("文本內(nèi)容"):查找文本匹配的元素

page.get_by_role("button"):get_by_role是一個(gè)查找頁面元素的方法,代表要查找的元素的角色或類型

模擬點(diǎn)擊相關(guān)

# 點(diǎn)擊

page.get_by_role("button").click()

# 雙擊

page.get_by_text("Item").dblclick()

# 右擊

page.get_by_text("Item").click(button="right")

# Shift + 點(diǎn)擊

page.get_by_text("Item").click(modifiers=["Shift"])

# 鼠標(biāo)懸停在元素上

page.get_by_text("Item").hover()

# 點(diǎn)擊左上角

page.get_by_text("Item").click(position={ "x": 0, "y": 0})

模擬輸入

fill():輸入文字

type():一個(gè)字符一個(gè)字符地輸入字段麦到,就好像它是一個(gè)使用locator.type()的真實(shí)鍵盤的用戶绿饵。


獲取元素文本

inner_text():獲取元素的文本內(nèi)容


等待時(shí)間

page.wait_for_timeout(2000):強(qiáng)制等待2秒


檢查元素是否找到

disable_button is not None? ?找到標(biāo)識(shí)true,未找到為false


模擬鍵盤按鈕

# 按Enter鍵

page.get_by_text("Submit").press("Enter")

# 在鍵盤上按$符號(hào)

page.get_by_role("textbox").press("$")


文件上傳

page.set_input_files("input[type=file]", r'E:\基礎(chǔ)內(nèi)容\POC環(huán)境相關(guān)文檔\合同文檔合集\信托合同.pdf')


2.匯總

page.locator():playwright的核心功能之一瓶颠,元素定位器

query_selector():返回第一個(gè)匹配給定CSS選擇器的元素拟赊。如果找不到匹配的元素,則返回None粹淋。

query_selector_all():用于在頁面中查詢匹配指定CSS選擇器的所有元素要门,如果沒有找到匹配的元素,則返回空列表廓啊。

page.get_by_text()通過文本內(nèi)容定位。

page.get_by_label()通過關(guān)聯(lián)標(biāo)簽的文本定位表單控件封豪。

page.get_by_placeholder()按占位符定位谴轮。

page.get_by_title()通過標(biāo)題屬性定位元素。

page.get_by_role()通過顯式和隱式可訪問性屬性進(jìn)行定位吹埠。

page.get_by_alt_text()通過替代文本定位元素第步,通常是圖像。

page.get_by_test_id()根據(jù)data-testid屬性定位元素(可以配置其他屬性)缘琅。

has_text()查找子代或后代所有包含對(duì)應(yīng)文本的,相反的也有has_not_text()

inner_text():獲取元素的文本內(nèi)容

click():點(diǎn)擊事件

fill("XXX"):寫入內(nèi)容

first.click():第一個(gè)元素

nth(1).click():下標(biāo)為1的元素粘都,從0開始

page.set_input_files("input[type=file]", r'E:\基礎(chǔ)內(nèi)容\POC環(huán)境相關(guān)文檔\合同文檔合集\信托合同.pdf'):文件上傳

reload():用于重新加載當(dāng)前頁面。這個(gè)方法會(huì)發(fā)送一個(gè)瀏覽器級(jí)別的“頁面刷新”請(qǐng)求刷袍,清除并重新加載整個(gè)頁面的內(nèi)容翩隧。


六、詳細(xì)說明

1.launch

launch()方法是Playwright庫中用于啟動(dòng)瀏覽器的函數(shù)呻纹。它接受一個(gè)可選參數(shù)堆生,該參數(shù)可以是一個(gè)字典,用于配置瀏覽器的選項(xiàng)雷酪。

下面是一些常用的launch()方法的選項(xiàng):

headless: 布爾值淑仆,默認(rèn)為True。如果設(shè)置為False哥力,則會(huì)在啟動(dòng)瀏覽器時(shí)顯示瀏覽器窗口蔗怠。

slow_mo: 浮點(diǎn)數(shù),默認(rèn)為0。如果設(shè)置為大于0的值寞射,則會(huì)增加瀏覽器操作的延遲時(shí)間(單位為毫秒)渔工。

ignore_https_errors: 布爾值,默認(rèn)為False怠惶。如果設(shè)置為True涨缚,則在訪問HTTPS網(wǎng)站時(shí)不會(huì)檢查證書錯(cuò)誤。

viewport: 字典策治,用于指定瀏覽器窗口的大小和位置脓魏。例如:{'width': 800, 'height': 600}。

args: 列表通惫,用于傳遞給瀏覽器進(jìn)程的命令行參數(shù)茂翔。例如:['--disable-gpu']。

2.new_context

new_context()方法是Playwright庫中用于創(chuàng)建一個(gè)新的瀏覽器上下文的函數(shù)履腋。它接受一個(gè)可選參數(shù)珊燎,該參數(shù)可以是一個(gè)字典,用于配置瀏覽器上下文的選項(xiàng)遵湖。下面是一些常用的new_context()方法的選項(xiàng):

user_agent: 字符串悔政,默認(rèn)為當(dāng)前瀏覽器的用戶代理字符串。如果設(shè)置為其他值延旧,則會(huì)使用指定的用戶代理字符串谋国。

viewport: 字典,用于指定瀏覽器窗口的大小和位置迁沫。例如:{'width': 800, 'height': 600}芦瘾。

accept_downloads: 布爾值,默認(rèn)為False集畅。如果設(shè)置為True近弟,則會(huì)在下載文件時(shí)自動(dòng)接受下載對(duì)話框。

record_har: 字典挺智,用于錄制HTTP請(qǐng)求和響應(yīng)數(shù)據(jù)祷愉。例如:{'path': '/tmp/har.har'}。

3.new_page

new_page()方法是Playwright庫中用于創(chuàng)建新的瀏覽器頁面的函數(shù)逃贝。下面是一些常用的new_page()方法的用法:

browser.new_page()創(chuàng)建一個(gè)新的瀏覽器頁面

page.goto('https://www.baidu.com')打開一個(gè)網(wǎng)頁

page.url獲取當(dāng)前頁面的URL

page.evaluate('() => document.title')在頁面上執(zhí)行JavaScript代碼

page.screenshot(path='screenshot.png')截取頁面的屏幕截圖

4.locator

locator()方法可以根據(jù)元素的CSS選擇器來查找谣辞。您可以使用各種CSS選擇器,包括但不限于:

標(biāo)簽名:例如?page.locator('button')

類名:例如?page.locator('.my-class')

ID:例如?page.locator('#my-id')

屬性:例如?page.locator('[data-testid="my-test-id"]')

文本內(nèi)容:例如?page.locator(':text("My Text")')


locator()方法支持所有的CSS選擇器沐扳,包括:

基本選擇器:例如div,?span,?.my-class,?#my-id等泥从。

屬性選擇器:例如[href],?[class="my-class"],?[data-my-attr="value"]等。

偽類選擇器:例如:hover,?:focus,?:first-child,?:last-of-type等沪摄。

結(jié)合選擇器:例如div.my-class,?div, span,?div > p,?div + p等躯嫉。


文本選擇器

page.click('text=登錄'):沒有加引號(hào)(單引號(hào)或者雙引號(hào))纱烘,模糊匹配,對(duì)大小寫不敏感

page.click('text="登錄"'):有引號(hào)祈餐,精確匹配擂啥,對(duì)大小寫敏感

比如:<article><div >Playwright</div></article>

page.locator(':has_text("Playwright")').click()

# 也可以這樣寫,指定標(biāo)簽

page.locator('article:has_text("Playwright")').click()

# 也可以這樣

page.locator(":text('Playwright')").click()

# 還可以這樣

page.locator('article:has'text=Playwright').click()


css選擇器

page.locator('button').click() # 根據(jù)標(biāo)簽

page.locator('#nav-bar .contact-us-item').click() # 通過id +class

page.locator('[data-test=login-button]').click() # 屬性定位

page.locator("[aria-label='Sign in']").click()

#css定位前面可以加個(gè)css=帆阳,但是不加也可以程序也會(huì)自動(dòng)匹配


Xpath 定位

page.locator("xpath=//button").click()


組合定位:text哺壶、css、xpath三者可以兩組合定位

page.locator("article:has-text('Playwright')").click()

page.locator("#nav-bar :text('Contact us')").click()

css+css組合定位

page.locator(".item-description:has(.item-promo-banner)").click()

Xpath + css 組合定位

page.fill('//div[@class="SignFlow-account"] >>css=[name="username"]',"0863")

xpath+xpath組合定位

page.fill('//div[@class="SignFlowInput"] >> //input[@name="password"]',"ma160065")

5. get_by

get_by_id: 通過元素的 id 屬性來查找元素蜒谤,例如:page.get_by_id("my-id")

get_by_name: 通過元素的 name 屬性來查找元素山宾,例如:page.get_by_name("my-name")

get_by_text: 通過元素的文本內(nèi)容來查找元素,例如:page.get_by_text("Submit")

get_by_title: 通過元素的 title 屬性來查找元素鳍徽,例如:page.get_by_title("my-title")

get_by_placeholder: 通過元素的 placeholder 屬性來查找元素资锰,例如:page.get_by_placeholder("my-placeholder")

get_by_selector: 通過 CSS 選擇器來查找元素,例如:page.get_by_selector("#submit-button")

get_by_xpath: 通過 XPath 表達(dá)式來查找元素阶祭,例如:page.get_by_xpath("http://div[@class='my-class']")

get_by_label: 根據(jù)label屬性值查找元素绷杜,類似于HTML中的label標(biāo)簽和對(duì)應(yīng)的for屬性。

get_by_role: 通過角色方式定位元素濒募,例如:page.get_by_role("button", name="Submit")


6.get_by_role

元素:<li class="el-menu-item" role="menuitem" tabindex="-1">隊(duì)列管理</li>

page.get_by_role("menuitem", name="隊(duì)列管理").click()

元素:<button class="el-button el-button--primary el-button--default mr-24px mb-12px" aria-disabled="false" type="button"><span>新增隊(duì)列</span></button>

page.get_by_role("button", name="新增隊(duì)列").click()


7.set_input_files

# 上傳文件

# 選擇單個(gè)文件

page.set_input_files("input[type=file]", r'E:\基礎(chǔ)內(nèi)容\POC環(huán)境相關(guān)文檔\合同文檔合集\信托合同.pdf')

page.get_by_label("Upload file").set_input_files('myfile.pdf')

# 選擇多個(gè)文件

page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])

# 刪除所有選中文件

page.get_by_label("Upload file").set_input_files([])

# 從內(nèi)存中上傳緩沖區(qū)

page.get_by_label("Upload file").set_input_files(

? ? files=[

? ? ? ? {"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}

? ? ],

)

# 處理動(dòng)態(tài)頁面上的焦點(diǎn)事件

page.get_by_label('password').focus()

# 拖拽元素

page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at"))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞭盟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瑰剃,更是在濱河造成了極大的恐慌懊缺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件培他,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遗座,警方通過查閱死者的電腦和手機(jī)舀凛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來途蒋,“玉大人猛遍,你說我怎么就攤上這事『牌拢” “怎么了懊烤?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宽堆。 經(jīng)常有香客問我腌紧,道長(zhǎng),這世上最難降的妖魔是什么畜隶? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任壁肋,我火速辦了婚禮号胚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浸遗。我一直安慰自己猫胁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布跛锌。 她就那樣靜靜地躺著弃秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪髓帽。 梳的紋絲不亂的頭發(fā)上菠赚,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音氢卡,去河邊找鬼锈至。 笑死,一個(gè)胖子當(dāng)著我的面吹牛译秦,可吹牛的內(nèi)容都是我干的峡捡。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼筑悴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼们拙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阁吝,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤砚婆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后突勇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體装盯,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年甲馋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埂奈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡定躏,死狀恐怖账磺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痊远,我是刑警寧澤垮抗,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站碧聪,受9級(jí)特大地震影響冒版,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逞姿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一壤玫、第九天 我趴在偏房一處隱蔽的房頂上張望豁护。 院中可真熱鬧,春花似錦欲间、人聲如沸楚里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽班缎。三九已至,卻和暖如春她渴,著一層夾襖步出監(jiān)牢的瞬間达址,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工趁耗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沉唠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓苛败,卻偏偏與公主長(zhǎng)得像满葛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢屈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容