在 Playwright 中,JSHandle
?是一個表示瀏覽器中 JavaScript 對象的類。它提供了與網頁中的 JavaScript 對象進行交互和操作的方法。
可以通過調用 Playwright中的?evaluateHandle
?或?evaluate
?方法來獲取?JSHandle
from playwright.sync_api import sync_playwrightwith sync_playwright() as playwright:# 啟動瀏覽器browser = playwright.chromium.launch()# 創建一個新的上下文context = browser.new_context()# 在上下文中創建一個新的頁面page = context.new_page()# 跳轉到頁面page.goto('https://www.baidu.com')# 獲取網頁標題的 JSHandletitle_handle = page.evaluate_handle("document.title")# 獲取標題的文本值title_value = title_handle.json_value()print(f"頁面標題為:{title_value}")# 關閉瀏覽器browser.close()
?使用?evaluate_handle
?方法在頁面上下文中執行 JavaScript 代碼,并將結果返回一個?JSHandle
?對象。最后,通過?json_value
?方法獲取?JSHandle
?對象的文本值
方法
dispose
使用?JSHandle.dispose()
?方法來釋放?JSHandle
?對象占用的資源。這個方法可以在不再需要?JSHandle
?對象時手動調用,以確保資源能夠被及時釋放。
js_handle.dispose()
?evaluate
JSHandle.evaluate()
?方法允許執行一個函數或 JavaScript 表達式,并將結果返回到 Node.js 環境中。這使得可以在 Node.js 端對瀏覽器中的 JavaScript 對象進行操作和獲取信息。
?# 使用 evaluate 方法執行 JavaScript 代碼并獲取返回值
? ? value = title_handle.evaluate("element => element.toLowerCase()")
? ? print(f"頁面標題的小寫形式為:{value}")
?evaluate_handle
返回JSHandle
js_handle.evaluate_handle(expression)
js_handle.evaluate_handle(expression, **kwargs)
在 Playwright 中,`JSHandle.evaluate_handle()` 方法允許執行一個函數或 JavaScript 表達式,并以 `JSHandle` 對象的形式返回結果。這意味著可以對瀏覽器中的 JavaScript 對象進行進一步的操作和檢索。
以下是一個示例,演示如何使用 `evaluate_handle()` 方法執行 JavaScript 代碼并獲取返回的 `JSHandle` 對象:
```python
from playwright.sync_api import sync_playwrightwith sync_playwright() as playwright:# 啟動瀏覽器browser = playwright.chromium.launch()# 創建一個新的上下文context = browser.new_context()# 在上下文中創建一個新的頁面page = context.new_page()# 跳轉到頁面page.goto('https://example.com')# 使用 evaluate_handle 方法執行 JavaScript 代碼并獲取返回的 JSHandle 對象element_handle = page.evaluate_handle("document.querySelector('h1')")# 使用返回的 JSHandle 進一步操作元素text_handle = element_handle.evaluate_handle("element => element.textContent")value = text_handle.json_value()print(f"頁面標題為:{value}")# 釋放 JSHandle 對象text_handle.dispose()element_handle.dispose()# 關閉瀏覽器browser.close()
```
在上述示例中,我們首先使用 `evaluate_handle()` 方法執行 JavaScript 代碼,并將返回的 `JSHandle` 對象賦給 `element_handle` 變量。然后,我們可以繼續使用該 `element_handle` 對象來執行更多的 JavaScript 操作,例如獲取元素的文本內容。在本例中,我們使用 `evaluate_handle()` 方法和箭頭函數來獲取 `h1` 元素的文本內容,并將返回的 `JSHandle` 對象賦給 `text_handle`。最后,我們通過 `json_value()` 方法獲取文本內容,并將其輸出。
同樣要注意,在不需要使用 `JSHandle` 對象時,應該調用 `dispose()` 方法手動釋放資源。
get_properties
在 Playwright 中,可以使用 `JSHandle.get_properties()` 方法獲取 JavaScript 對象的屬性列表。這個方法返回一個字典,其中鍵是屬性名稱,值是表示該屬性的 `JSHandle` 對象。
以下是一個示例,演示如何使用 `get_properties()` 方法獲取并遍歷 JavaScript 對象的屬性:
```python
from playwright.sync_api import sync_playwrightwith sync_playwright() as playwright:# 啟動瀏覽器browser = playwright.chromium.launch()# 創建一個新的上下文context = browser.new_context()# 在上下文中創建一個新的頁面page = context.new_page()# 跳轉到頁面page.goto('https://example.com')# 使用 evaluate_handle 方法獲取 window 對象的 JSHandlewindow_handle = page.evaluate_handle("window")# 獲取 window 對象的屬性列表properties = window_handle.get_properties()# 遍歷屬性列表,打印屬性名和屬性值for name, value_handle in properties.items():value = value_handle.json_value()print(f"{name}: {value}")# 釋放 JSHandle 對象window_handle.dispose()# 關閉瀏覽器browser.close()
```
在上述示例中,我們使用 `evaluate_handle()` 方法獲取了 `window` 對象的 `JSHandle`。然后,我們使用 `get_properties()` 方法獲取了 `window` 對象的屬性列表,存儲在 `properties` 字典中。最后,我們遍歷該字典,并使用 `json_value()` 方法獲取屬性值,并將其打印輸出。
請注意,`get_properties()` 方法只返回直接在 JavaScript 對象上定義的屬性,不包含繼承的屬性。而且,只有可枚舉屬性才會被返回。
同樣要注意,在不需要使用 `JSHandle` 對象時,應該調用 `dispose()` 方法手動釋放資源。
get_property
返回單個屬性值
js_handle.get_property(property_name)
?json_value
js_handle.json_value()
屬性
as_element?
js_handle.as_element()
作用
在 UI 自動化中,`JSHandle` 在 Playwright 中起著重要的作用。它代表了瀏覽器中執行的 JavaScript 對象,并提供了訪問和操作這些對象的方法。
以下是 `JSHandle` 在 UI 自動化中的幾個常見用途:
1. **執行和評估 JavaScript 代碼**:通過 `JSHandle.evaluate()` 或 `JSHandle.evaluate_handle()` 方法,可以在瀏覽器環境中執行 JavaScript 代碼,并獲得執行結果。
2. **操作和檢索 DOM 元素**:使用 `JSHandle`,可以獲取頁面中的元素并對其進行操作,例如修改元素屬性、調用元素方法、獲取元素的文本內容等。
3. **處理頁面中的 JavaScript 對象**:通過 `JSHandle`,可以直接訪問和操作頁面中的 JavaScript 對象,例如全局對象、變量、函數等。
4. **獲取頁面中的屬性值和屬性列表**:通過 `JSHandle.get_property()` 或 `JSHandle.get_properties()` 方法,可以獲取 JavaScript 對象的屬性值或屬性列表。
5. **釋放資源**:在長時間運行的自動化腳本中,為了避免內存泄漏和資源浪費,應該及時調用 `JSHandle.dispose()` 方法釋放 `JSHandle` 對象占用的資源。
總的來說,`JSHandle` 提供了與瀏覽器中的 JavaScript 對象進行交互的能力,為 UI 自動化提供了更大的靈活性和控制能力。可以使用 `JSHandle` 來執行自定義的 JavaScript 邏輯,獲取和操作頁面元素,以及與頁面的 JavaScript 環境進行交互。