跳至主要內容

元素物件

元素物件 (Element Object) 是一個代表遠端使用者代理程式上元素的物件,例如在瀏覽器中執行工作階段時的 DOM 節點,或是行動裝置的 行動元素。它可以透過許多元素查詢命令接收,例如 $custom$react$shadow$

屬性

元素物件具有以下屬性

名稱類型詳細資訊
sessionId字串從遠端伺服器分配的工作階段 ID。
elementId字串可以透過協定層級與元素互動的關聯 網頁元素參考
selector字串用於查詢元素的選取器
parent物件當元素從它擷取時,會是 瀏覽器物件 (例如,const elem = browser.$('selector')),或者當元素從元素範圍擷取時,則會是 元素物件 (例如,elem.$('selector'))。
options物件根據如何建立瀏覽器物件的 WebdriverIO 選項。 請參閱更多設定類型

方法

元素物件提供協定區段中的所有方法,例如 WebDriver 協定以及元素區段中列出的命令。可用的協定命令取決於工作階段的類型。如果您執行自動化瀏覽器工作階段,則不會有任何 Appium 命令可用,反之亦然。

此外,還可以使用下列命令

名稱參數詳細資訊
addCommand- commandName (類型:String)
- fn (類型:Function)
允許定義可以從瀏覽器物件呼叫以進行組成的自訂命令。 請參閱自訂命令指南中的詳細資訊。
overwriteCommand- commandName (類型:String)
- fn (類型:Function)
允許使用自訂功能覆寫任何瀏覽器命令。 請謹慎使用,因為這可能會讓框架使用者感到困惑。 請參閱自訂命令指南中的詳細資訊。

備註

元素鏈

當使用元素時,WebdriverIO 提供特殊語法來簡化查詢元素並組合複雜的巢狀元素查詢。由於元素物件允許您使用常見的查詢方法在其樹狀分支中尋找元素,因此使用者可以如下擷取巢狀元素

const header = await $('#header')
const headline = await header.$('#headline')
console.log(await headline.getText()) // outputs "I am a headline"

對於深度巢狀的結構,將任何巢狀元素指定到陣列,然後再使用它可能會相當冗長。因此,WebdriverIO 有鏈式元素查詢的概念,允許擷取巢狀元素,如下所示

console.log(await $('#header').$('#headline').getText())

當擷取一組元素時,此功能也適用,例如

// get the text of the 3rd headline within the 2nd header
console.log(await $$('#header')[1].$$('#headline')[2].getText())

當使用一組元素時,當嘗試與它們互動時,這特別有用,因此可以不必執行

const elems = await $$('div')
const locations = await Promise.all(
elems.map((el) => el.getLocation())
)

您可以直接在元素鏈上呼叫陣列方法,例如

const location = await $$('div').map((el) => el.getLocation())

const divs = await $$('div')
const location = await divs.map((el) => el.getLocation())

WebdriverIO 使用自訂實作,在底層支援非同步迭代器,因此其 API 中的所有命令也支援這些用例。

注意:即使您的回呼未傳回 promise,所有非同步迭代器也會傳回 promise,例如

const divs = await $$('div')
console.log(divs.map((div) => div.selector)) // ❌ returns "Promise<string>[]"
console.log(await divs.map((div) => div.selector)) // ✅ returns "string[]"

自訂命令

您可以在瀏覽器範圍設定自訂命令,以抽象化常用的工作流程。 請查看我們的自訂命令指南以取得更多資訊。

歡迎!我能如何協助您?

WebdriverIO AI Copilot