?
如何使用代理方式打開網頁
?
在?playwright.chromium.launch()?
中傳入?proxy
?參數即可,示例代碼如下:
1、同步寫法:
from?playwright.sync_api?import?sync_playwrightproxy?=?{'server':?'http:/127.0.0.1:8080'}def?run():with?sync_playwright()?as?p:browser?=?p.chromium.launch(headless=False,?proxy=proxy)page?=?browser.new_page()page.goto('https://www.baidu.com')title?=?page.title()if?"百度"?in?title:print("打開百度成功")else:print("打開百度失敗")browser.close()run()
2、異步寫法:
from?playwright.async_api?import?async_playwright
import?asyncioproxy?=?{'server':?'http:/127.0.0.1:8080'}async?def?run():async?with?async_playwright()?as?p:browser?=?await?p.chromium.launch(headless=False,?proxy=proxy)page?=?await?browser.new_page()await?page.goto('https://www.baidu.com')title?=?await?page.title()if?"百度"?in?title:print("打開百度成功")else:print("打開百度失敗")await?browser.close()asyncio.get_event_loop().run_until_complete(run())
?
同步和異步寫法對比
1、同步的優點:
-
代碼結構簡單易懂,不需要學習
async/await
語法 -
適用于小規模或簡單任務
-
調試和理解同步代碼更簡單
2、異步的優點:
-
能更高效地利用系統資源,避免阻塞等待IO
-
對于長時間操作如網絡請求更高效
-
可以支持并發執行多個任務
-
對于大規模和復雜系統更有利
3、區別
-
對于小任務和學習用途,同步代碼結構更簡單。
-
對于需要長時間IO等待的任務(如網絡請求),使用異步可以更高效。
-
對于需要支持高并發的系統(如網站),使用異步模型可以支持更多并發連接。
-
多線程同步會帶來鎖的問題,而異步避免了鎖的使用。
-
異步的FUTURE模式也更易于擴展性好,支持動態增加回調函數。
4、總結
-
小任務用同步
-
長時間IO任務用異步
-
高并發系統用異步
-
以后的功能擴展考慮異步更靈活
一般來說對于現代化系統,異步編程模型將是主流趨勢。但同步在某些場景也同樣易用。選擇時要根據具體需求來權衡。
?
寫一個自動化測試腳本
?
1、示例腳本
算是個入門的例子,關于每句話的意思,看我注釋即可,示例代碼如下:
import?re
from?playwright.sync_api?import?Page,?expect,?sync_playwrightproxy?=?{'server':?'http://127.0.0.1:8080'}def?test_baidu():with?sync_playwright()?as?p:browser?=?p.chromium.launch(headless=False,?proxy=proxy)page?=?browser.new_page()#?跳轉到baidu頁面page.goto("https://www.baidu.com/")#?點擊輸入框page.locator("#kw").click()#?輸入框輸入seleniumpage.locator("#kw").fill("selenium")#?點擊百度一下查詢按鈕page.get_by_role("button",?name="百度一下").click()#?驗證輸入框是否輸入seleniumexpect(page.locator("#kw")).to_have_value("selenium")#?驗證頁面是否包含文本“大家還在搜”expect(page.locator("#content_left")).to_contain_text("大家還在搜")#?退出瀏覽器browser.close()
?
注意:測試類和測試方法都要用test_ 前綴命名
?
2、基本操作
這是 Playwright 常用操作列表,請注意,還有許多其他操作,請務必查看定位器 API 部分以了解更多相關信息。
操作 | 描述 |
---|---|
locator.check() | 選中輸入復選框 |
locator.click() | 點擊元素 |
locator.uncheck() | 取消選中輸入復選框 |
locator.hover() | 將鼠標懸停在元素上 |
locator.fill() | 填寫表單字段,輸入文本 |
locator.focus() | 聚焦元素 |
locator.press() | 按下單個鍵 |
locator.set_input_files() | 選擇要上傳的文件 |
locator.select_option() | 從下拉菜單中選擇選項 |
3、斷言操作
斷言 | 描述 |
---|---|
expect(locator).to_be_checked() | 復選框處于選中狀態 |
expect(locator).to_be_enabled() | 控件已啟用 |
expect(locator).to_be_visible() | 元素可見 |
expect(locator).to_contain_text() | 元素包含文本 |
expect(locator).to_have_attribute() | 元素具有屬性 |
expect(locator).to_have_count() | 元素列表已給出長度 |
expect(locator).to_have_text() | 元素匹配文本 |
expect(locator).to_have_value() | 輸入元素具有值 |
expect(page).to_have_title() | 頁面有標題 |
expect(page).to_have_url() | 頁面有 URL |
?
4、fixtures夾具的使用
示例代碼:
import?pytest
from?playwright.sync_api?import?Page,?expect,?sync_playwright@pytest.fixture(scope="function",?autouse=True)
def?before_each_after_each(page:?Page):print("before?the?test?runs")page.goto("https://www.baidu.com/")yieldprint("after?the?test?runs")def?test_main_navigation(page:?Page):page.locator("#kw").fill("萬物皆可連 博客園")page.get_by_role("button",?name="百度一下").click()expect(page.locator("#content_left")).to_contain_text("萬物皆可連?-?博客園")
代碼解釋:
-
定義了一個名為 before_each_after_each 的 fixture(夾具),它的作用域是每個測試函數,并且設置為自動應用于每個測試函數。
-
在這個 fixture 中:打印 "before the test runs",表示測試運行前執行的操作。使用 page.goto("https://www.baidu.com/") 打開百度首頁。
-
yield 關鍵字在這個 fixture 運行期間掛起,等待測試函數執行。測試函數將在 fixture 的環境下執行。
?
?