小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

不用寫一行代碼!Python最強(qiáng)自動(dòng)化神器Playwright!

 風(fēng)聲之家 2023-11-05 發(fā)布于江蘇

目錄

        一、簡(jiǎn)介+使用場(chǎng)景

        二、環(huán)境部署(準(zhǔn)備)

        三、代碼生成器(優(yōu)勢(shì))

        四、元素定位器(核心)

        五、追蹤查看器(輔助)

        六、權(quán)限控制與認(rèn)證(高級(jí))

        七、其他重要功能(進(jìn)階)

coding-real mind writing-genuine heart

作者:Maker陳    本文字?jǐn)?shù):4.5k   閱讀時(shí)長(zhǎng)≈1分鐘    

01

簡(jiǎn)介+使用場(chǎng)景                           

Playwright是什么?來自ChatGPT回答:

Playwright是跨語言支持的,支持Python、Java、Node.js、.NET

使用場(chǎng)景

  • 自動(dòng)化測(cè)試工程師,可用于Web開發(fā)中的各種自動(dòng)化測(cè)試;

  • 爬蟲工程師,當(dāng)接口中有加密參數(shù)(包括url加密參數(shù)、請(qǐng)求頭加密參數(shù)、cookie加密參數(shù))或者返回?cái)?shù)據(jù)也是經(jīng)過加密的,如果加密邏輯太過復(fù)雜暫時(shí)無法找出,我們可采用自動(dòng)化的方式獲取經(jīng)過網(wǎng)站渲染過的源碼,抓取需要的數(shù)據(jù)即可;

  • 開發(fā)工程師,可與其他項(xiàng)目結(jié)合來使用,比如docker、github/gitlab等

02

環(huán)境部署(準(zhǔn)備)                       

Playwright環(huán)境部署簡(jiǎn)單,不像Selenium那樣需要下載瀏覽器對(duì)應(yīng)版本的驅(qū)動(dòng)程序chromedriver,直接安裝即可:

pip install playwright

安裝所需的瀏覽器:

playwright install

這個(gè)命令會(huì)安裝所有playwright支持的瀏覽器,包括Chrome、Firefox、WebKit,如下圖:

如何只安裝特定的瀏覽器,比如Chrome:

playwright install chromium

Chrome和Chromium有什么關(guān)系?

可看做同一個(gè)項(xiàng)目下的兩個(gè)分支,chromium是測(cè)試開源版,所有的功能都會(huì)先在其身上測(cè)試,確定穩(wěn)定運(yùn)行后再移植到chrome上,而chrome是Google正式商業(yè)版瀏覽器,兩者由Google官方和chromium社區(qū)進(jìn)行維護(hù)

由于系統(tǒng)問題安裝失敗時(shí)怎么辦?

看一下各種瀏覽器在Windows、Linux、MacOS下的默認(rèn)安裝路徑:

以安裝Chrome瀏覽器來說,兩種解決途徑:

  • 手動(dòng)下載Chrome瀏覽器,放到上面默認(rèn)的存儲(chǔ)路徑中,下載鏈接為:

https://playwright./builds/chromium/1080/chromium-win64.zip
  • 根據(jù)上面的Chrome鏈接下載到你想要的本地目錄下(或者你之前已下載過),在創(chuàng)建browser對(duì)象時(shí)指定Chrome瀏覽器的路徑:

from playwright.sync_api import sync_playwright

browser = sync_playwright().start().chromium.launch(executable_path='C:\Users\lenovo\AppData\Local\ms-playwright\chromium_win64_special-1050\chrome-win\chrome.exe')

03

代碼生成器(優(yōu)勢(shì))                     

playwright能夠按順序自動(dòng)生成用戶與瀏覽器交互行為(包括鼠標(biāo)點(diǎn)擊、鍵盤輸入、元素拖動(dòng)、頁面跳轉(zhuǎn)、窗口切換等)的自動(dòng)化代碼,使用命令行輸入,其后跟要訪問的url:

playwright codegen https://v

你可以在瀏覽器頁面進(jìn)行各種交互行為,生成器會(huì)按順序自動(dòng)生成代碼:

代碼生成后可以直接復(fù)制在你的IDE中,節(jié)省了大量時(shí)間,提高爬蟲或自動(dòng)化效率

04

元素定位器(核心)                     

playwright支持的網(wǎng)頁元素定位器有很多:

  • 官方推薦的定位方式,這種定位方式與代碼生成器中的元素定位是一樣的

from playwright.sync_api import sync_playwright


def run() -> None:
    browser = sync_playwright().start().chromium.launch(headless=False, slow_mo=60)
    context = browser.new_context()
    page = context.new_page()
    page.goto(url)
    page.get_by_text("登錄").click()
    page.get_by_placeholder("Please enter your email").click()
    page.get_by_placeholder("Please enter your email").fill('123')
    
    context.close()
    browser.close()
    sync_playwright().stop()

run()

語法非常簡(jiǎn)潔,這種page.get_by_text("登錄").click()元素定位方式就是官方推薦的方式,這種定位方式是唯一的,不像CSS/XPath定位,一旦網(wǎng)頁DOM元素改變,定位也要跟著變,所以官方才推薦這種元素唯一的定位方式

  • CSS定位

page.locator('css=<元素定位器>')
  • XPath定位

page.locator('xpath=<元素定位器>')

CSS定位和XPath定位方法是一樣的,可以去掉前面的"css="或"xpath="前綴,playwright會(huì)自動(dòng)解析里面的定位器是那種方式

page.locator('<CSS/XPath元素定位器>')

獲取網(wǎng)頁源碼:

page.content()

playwright雖然支持對(duì)Python的同步和異步操作,但底層是由異步實(shí)現(xiàn)的,有時(shí)候?yàn)榱吮苊獠僮魉俣冗^快可能會(huì)進(jìn)行一些延時(shí)操作,這里不使用下面這種延時(shí)操作:

import time

# 延時(shí)2秒,以秒為單位
time.sleep(2)

而是使用playwright官方內(nèi)置的延時(shí)操作:

# 延時(shí)2秒,這里是以毫秒為單位
page.wait_for_timeout(2000)

05

追蹤查看器(輔助)                     

創(chuàng)建追蹤器

追蹤的目的是為了看使用playwright與瀏覽器交互時(shí)發(fā)生了什么?方便我們更加深刻的理解內(nèi)部操作邏輯,示例代碼如下:

from playwright.sync_api import sync_playwright, Playwright


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()

    context.tracing.start(snapshots=True, screenshots=True, sources=True)

    page = context.new_page()
    page.goto('https://v')
    page.screenshot(path='screenshot_test.jpg')

    context.tracing.stop(path='playwright_trace.zip')

    context.close()
    browser.close()


with sync_playwright() as playwright:
    run(playwright)

這個(gè)示例代碼是為了查看導(dǎo)航到playwright官網(wǎng)并進(jìn)行截圖操作時(shí)發(fā)生了什么?

注意,創(chuàng)建追蹤器是在context對(duì)象進(jìn)行操作,在context創(chuàng)建之后,關(guān)閉之前

其中的操作行為很簡(jiǎn)單,只是導(dǎo)航到了playwright官網(wǎng)進(jìn)行了一個(gè)截圖動(dòng)作,并設(shè)置保存的文件名及格式,結(jié)束后會(huì)在目錄生成jpg圖片和追蹤器的ZIP壓縮文件

查看追蹤器  --  兩種方式

  • 將追蹤器的ZIP壓縮文件上傳到指定鏈接

https://trace.v/

操作如下:

  • 使用命令行方式打開追蹤器:

playwright show-trace playwright_trace.zip

無論那種方式,你將看到如下圖的追蹤器結(jié)構(gòu):

正如上圖所示,示例代碼只進(jìn)行了三個(gè)動(dòng)作,即打開一個(gè)空白頁面,然后導(dǎo)航到playwright官網(wǎng),最后進(jìn)行截圖,每個(gè)動(dòng)作都包含了執(zhí)行時(shí)間

在其下面有一些屬性,其中network功能類似于開發(fā)工具中的抓包請(qǐng)求,還有日志、定位器、源碼、控制臺(tái)等屬性功能

06

權(quán)限控制與認(rèn)證(高級(jí))               

使用場(chǎng)景:當(dāng)爬蟲工程師抓取數(shù)據(jù)或自動(dòng)化工程師測(cè)試某些重要功能時(shí)需要注冊(cè)/登錄之后,才能看見我們想要抓取或測(cè)試的內(nèi)容

如果驗(yàn)證過程過于復(fù)雜或麻煩,比如滑動(dòng)驗(yàn)證碼如何識(shí)別缺口位置及拖動(dòng)

對(duì)于點(diǎn)觸驗(yàn)證碼來說,又有按順序點(diǎn)擊不同長(zhǎng)度的文字,比如bilibili,按文字說明點(diǎn)擊符合要求的圖片,比如請(qǐng)點(diǎn)擊下方含有小轎車的圖片,鏈接如下:

https://

還有行為驗(yàn)證碼,比如給你一組圖片,讓你轉(zhuǎn)動(dòng)圖片直到與給定示例圖片相同的方向才行,Twitter其中一種驗(yàn)證方式就是這樣的

國外有些網(wǎng)站的注冊(cè)/登錄驗(yàn)證有可能還需進(jìn)行郵箱驗(yàn)證碼二次驗(yàn)證,國內(nèi)的驗(yàn)證碼大多二次驗(yàn)證以短信為主

當(dāng)然,其實(shí)我們也可以使用OpenCV、深度學(xué)習(xí)、第三方打碼服務(wù)平臺(tái)(付費(fèi))、手機(jī)短信驗(yàn)證碼的自動(dòng)化處理(監(jiān)聽手機(jī)短信內(nèi)容+將短信內(nèi)容轉(zhuǎn)發(fā)到指定的位置)來解決

但是如果你臨時(shí)接到一個(gè)需求并且時(shí)間比較急,破解驗(yàn)證過程又比較復(fù)雜麻煩的話可采用手動(dòng)驗(yàn)證獲取其中的登錄憑證以json文件保存到本地,這個(gè)文件里面保存的其實(shí)就是相關(guān)的cookie和賬戶的一些信息,有兩種方式可以獲取到:

  • 命令行方式

playwright codegen https:// --save-storage=auth.json

后面的auth.json就是說我們要把相關(guān)權(quán)限保存到當(dāng)前目錄的auth.json文件里面

比如我們要獲取polygonscan的地址和標(biāo)簽數(shù)據(jù),網(wǎng)址如下:

https:///accounts/label/aave

在沒有登錄前數(shù)據(jù)是不會(huì)顯示全的,如下圖所示:

用playwright手動(dòng)獲取憑證保存到auth.json,看一看登錄過程

文件auth.json保存成功:

打開看看里面的內(nèi)容:

可以清晰的看到,auth.json里面的內(nèi)容其實(shí)就是cookies的相關(guān)信息,每個(gè)cookie字段都以字典的格式存儲(chǔ)起來

測(cè)試該auth.json里面的cookies是否有效:

playwright codegen --load-storage=auth.json https:///accounts/label/aave

再次打開不需要驗(yàn)證:

測(cè)試成功,該auth.json文件里面的cookies是有效的,賬戶早已存在并且數(shù)據(jù)顯示是全的,非常Nice!

  • 代碼方式

from playwright.sync_api import sync_playwright


def run():
    playwright = sync_playwright().start()
    browser = playwright.chromium.launch(headless=False, slow_mo=100, args=['--disable-infobars''--window-size=1366,880'])
    
    context = browser.new_context()
    page = context.new_page()
    page.set_viewport_size({'width'1366'height'880})
    page.goto('https:///accounts/label/aave')
    page.get_by_role('button', name='Close').click()
    #把憑證權(quán)限保存到當(dāng)前目錄的auth.json文件
    context.storage_state(path='auth.json')
    #延時(shí)3分鐘以保證足夠的時(shí)間完成手動(dòng)登錄
    page.wait_for_timeout(3*60*1000)

    context.close()
    browser.close()
    playwright.stop()


run()

操作方式和生成器命令行方式是一樣的,會(huì)自動(dòng)打開chrome瀏覽器,然后需要我們手動(dòng)進(jìn)行登錄驗(yàn)證

如何導(dǎo)入auth.json進(jìn)行自動(dòng)化數(shù)據(jù)抓取或測(cè)試:

from playwright.sync_api import sync_playwright


def run():
    playwright = sync_playwright().start()
    browser = playwright.chromium.launch(headless=False, slow_mo=100, args=['--disable-infobars''--window-size=1366,880'])
    """
    Generate authentication by using codegen:
    > playwright codegen https:// --save-storage=auth.json
    
    Verifing the authentication whether is alive or useful:
    > playwright codegen --load-storage=auth.json https:///accounts/label/aave
    """

    context = browser.new_context(storage_state='auth.json')
    page = context.new_page()
    page.set_viewport_size({'width'1366'height'880})
    page.goto('https:///accounts/label/aave')
    # 獲取網(wǎng)頁源碼,方便進(jìn)行元素解析及數(shù)據(jù)獲取
    response = page.content()
    # banabala-----------------------
    # 延遲2秒-----------------------
    page.wait_for_timeout(2*1000)

    context.close()
    browser.close()
    playwright.stop()


run()

我們也可以使用第三方解析庫BeautifulSoup、PyQuery、XPath等對(duì)網(wǎng)頁源碼中的數(shù)據(jù)進(jìn)行解析,有時(shí)候可能會(huì)更加方便,比如使用PyQuery

from pyquery import PyQuery as pq

doc = pq(page.content())

這一小節(jié)很重要,爬蟲工程師或自動(dòng)化測(cè)試工程師進(jìn)階必備,需重點(diǎn)掌握

07

其他重要功能(進(jìn)階)                 

模擬瀏覽器執(zhí)行JS

爬蟲逆向時(shí),我們一般需要模擬JS環(huán)境來執(zhí)行加密代碼,從而獲得最終的加密結(jié)果

但是如果我們能夠模擬瀏覽器環(huán)境,自動(dòng)執(zhí)行JS加密代碼,這樣是不是就能比較輕松的完成逆向過程呢?

而playwright能夠打開瀏覽器進(jìn)而模擬,JS加密代碼是從目標(biāo)遠(yuǎn)程服務(wù)器傳到本地客戶端執(zhí)行的

所以只要我們能夠找到執(zhí)行加密邏輯的JS文件,定位其中的加密函數(shù)或?qū)傩?,把它掛載到全局的window對(duì)象再獲取,不就很容易獲得加密結(jié)果了嗎?

我們先來看一個(gè)簡(jiǎn)單的playwright是如何執(zhí)行JS代碼的示例:

page.evaluate('array => array.length', list(range(10)))

調(diào)用page對(duì)象的evaluate函數(shù)能夠執(zhí)行JS代碼,array指代的是后面的列表

當(dāng)然目前我們是不能修改遠(yuǎn)程的JS文件的,除非尋找漏洞,利用黑客手段

現(xiàn)在我們要做的是在遠(yuǎn)程服務(wù)器將JS代碼傳到本地瀏覽器客戶端時(shí),用已經(jīng)修改好的JS文件(增加了一些內(nèi)容,比如將加密函數(shù)掛載到window對(duì)象)替換瀏覽器對(duì)應(yīng)的JS文件,讓瀏覽器執(zhí)行這個(gè)替換好的JS文件,從而獲得加密結(jié)果:

來看看本地的JS文件是怎樣override瀏覽器JS文件的:

page = browser.new_page()
page.route(
    "/static/js/chunk.js",
    lambda route: route.fulfill(path="./chunk.js")
)
page.goto(url)

page.evaluate('''function crypto() {return window.encryParams("%s")}''' % params)

調(diào)用page對(duì)象的route函數(shù),傳入瀏覽器JS文件和本地JS文件的路徑,然后我們把本地JS文件中的加密函數(shù)掛載到全局window對(duì)象的encryParams屬性上

這時(shí)encryParams也就等同于這個(gè)加密函數(shù),然后在傳入?yún)?shù)讓它自動(dòng)進(jìn)行加密,最后調(diào)用evaluate函數(shù)執(zhí)行我們構(gòu)造的JS函數(shù)就能獲取加密結(jié)果

注意:本地JS文件內(nèi)容是我們從瀏覽器的JS加密文件全部復(fù)制下來的,只不過增加了一些東西

設(shè)備仿真

這個(gè)功能可能自動(dòng)化測(cè)試工程師會(huì)用到,比如要測(cè)試博客園網(wǎng)站在iPhone 13設(shè)備上是否兼容:

from playwright.sync_api import sync_playwright


def run():
 playwright = sync_playwright().start()
 browser = playwright.chromium.launch(headless=False, slow_mo=5)
 iphone_13 = vices['iPhone 13']
 context = browser.new_context(**iphone_13, locale='de-DE', timezone_id='Europe/Berlin',
                               permissions=['notifications''geolocation']

 page = context.new_page()
 page.goto('https://cnblogs.com/makerchen')
 page.wait_for_timeout(20000)

 context.close()
 browser.close()
 playwright.stop()

run()

看一看仿真效果:

監(jiān)聽和修改網(wǎng)絡(luò)

playwright能夠追蹤、修改某個(gè)頁面的所有請(qǐng)求,包括document、XHR和fetch請(qǐng)求等

比如我們要修改document請(qǐng)求源碼中的<title>標(biāo)簽內(nèi)容,可以這樣做:

from playwright.sync_api import Route

def handle_route_response(route: Route) -> None:
    # Fetch original response.
    response = route.fetch()
    # Add a prefix to the title.
    body = response.text()
    body = body.replace("<title>""<title>My prefix:")
    route.fulfill(
        # Pass all fields from the response.
        response=response,
        # Override response body.
        body=body,
        # Force content type to be html.
        headers={**response.headers}
    )

Playwright官網(wǎng):

https://v/

THE

END

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多