API 參考資料
您可以檢視瀏覽器測試 API 的參照資訊。
- 動作
- addHeader
- addHeaders
- addHostnamesToDenylist
- addHostnamesToAllowlist
- addHostnameToDenylist
- addHostnameToAllowlist
- clearProxy
- deleteHeader
- deleteHeaders
- deleteHostnameFromDenylist
- deleteHostnameFromAllowlist
- deleteHostnamesFromDenylist
- deleteHostnamesFromAllowlist
- 美元-美元
- 元
- 執行
- executeAsyncScript
- executeScript
- findElement
- findElements
- GET
- getAllWindowHandles
- getCapabilities
- getCurrentURL
- getHeaders
- getPage來源
- getProxy
- getSession
- getTitle
- getWindow控點
- 管理
- 導覽
- setAuthentication
- setProxy
- setProxy進階
- setProxy鑑別
- setProxyForHttp
- setProxyForHttps
- setProxyPAC
- sleep
- switchTo
- takeScreenshot
- 等待
- waitForAndFind元素
- waitForPendingRequests
動作
這個瀏覽器測試 API 函數會使用 WebDriver來建立新的動作序列。 除非您在程式碼中呼叫 Actions.perform() 函數,否則不會提交序列來執行。
使用情形
$browser.actions().sendKeys("synthetic").perform();
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Actions |
此實例的新動作順序。 |
options |
Object |
動作序列的配置選項 (請參閱 動作)。 |
範例
範例 1: 若要按一下,請使用下列程式碼:
const element = await $browser.waitForAndFindElement(by, timeout);
$browser.actions().move({origin: element}).press().release().perform();
範例 2: 若要將滑鼠移至瀏覽器元素上,請使用下列程式碼:
const element = await $browser.waitForAndFindElement(by, timeout);
$browser.actions().move({origin: element, duration: 2000}).perform();
若要與舊 mouseMove 函數相容,請使用下列指令:
$browser.actions().mouseMove(element).perform();
附註: 基於與舊版的相容性,瀏覽器測試 API 支援 $browser.actions().mouseMove() 方法,並實作方法與 $browser.actions().move() ,因為 Selenium 已於 2021 年在此 PR中移除該方法。
範例 3: 若要傳送金鑰,請執行下列程式碼:
await $browser.get("http://www.bing.com");
await $browser.actions().sendKeys("synthetic").perform();
addHeader
此瀏覽器測試 API 會修改 HTTP 要求的標頭。
使用情形
$browser.addHeader(key: string, val: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
key |
string |
HTTP 標頭名稱。 |
val |
string |
HTTP 標頭值。 |
範例
await $browser.addHeader(
"User-Agent",
"Mozilla/5.0 (iPhone; CPU OS 10_15_5 (Ergänzendes Update) like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15"
);
await $browser.get("https://www.yahoo.com/");
await $browser.takeScreenshot();
await $browser.addHeader(
"User-Agent",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:86.0) Gecko/20100101 Firefox/86.0"
);
await $browser.get("https://www.yahoo.com/");
await $browser.takeScreenshot();
addHeaders
此瀏覽器測試 API 會修改 HTTP 要求的標頭。
使用情形
$browser.addHeaders(headers: { [key: string]: string }): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
headers |
{ [key: string]: string } |
HTTP 標頭 |
範例
await $browser.addHeaders({
key1: "val1",
key2: "val2",
});
addHostnamesToDenylist
此瀏覽器測試 API 會將主機名稱新增至拒絕清單。
使用情形
$browser.addHostnamesToDenylist(hostnameArr: string[]): Promise<void>
附註: Instana 提供 addHostnamesToDenylist 功能來進行 URL 過濾,但不會移除 addHostnamesToBlacklist 函數,以確保程式碼與舊版相容。
$browser.addHostnamesToBlacklist(hostnameArr: string[]): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostnameArr |
string[] |
要比對並支援萬用字元的主機名稱 |
範例
await $browser.addHostnamesToDenylist(["*.css", "*.png"]);
await $browser.addHostnamesToAllowlist(["*"]);
addHostnamesToAllowlist
此瀏覽器測試 API 會將主機名稱新增至容許清單。
使用情形
$browser.addHostnamesToAllowlist(hostnameArr: string[]): Promise<void>
附註: Instana 提供 addHostnamesToAllowlist 函數來進行 URL 過濾,但不會移除 addHostnamesToWhitelist 函數,以確保程式碼與舊版相容。
$browser.addHostnamesToWhitelist(hostnameArr: string[]): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostnameArr |
string[] |
要比對並支援萬用字元的主機名稱。 |
範例
await $browser.addHostnamesToDenylist(["*.css", "*.png"]);
await $browser.addHostnamesToAllowlist(["*"]);
addHostnameToDenylist
此瀏覽器測試 API 會將主機名稱新增至拒絕清單。
使用情形
$browser.addHostnameToDenylist(hostname: string): Promise<void>
附註: Instana 提供 addHostnameToDenylist 函數來進行 URL 過濾,但不會移除 addHostnameToBlacklist 函數,以確保程式碼與舊版相容。
$browser.addHostnameToBlacklist(hostname: string): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostname |
string |
要比對並支援萬用字元的主機名稱 |
範例
await $browser.addHostnameToDenylist(`*.css`);
await $browser.addHostnameToAllowlist(`*`);
addHostnameToAllowlist
此瀏覽器測試 API 會將主機名稱新增至您的容許清單。
使用情形
$browser.addHostnameToAllowlist(hostname: string): Promise<void>
附註: Instana 提供 addHostnameToAllowlist 功能來進行 URL 過濾,但不會移除 addHostnameToWhitelist 函數,以確保程式碼與舊版相容。
$browser.addHostnameToWhitelist(hostname: string): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostname |
string |
符合並支援萬用字元的主機名稱。 |
範例
await $browser.addHostnameToDenylist(`*.css`);
await $browser.addHostnameToAllowlist(`*`);
clearProxy
此瀏覽器測試 API 會清除或移除現行 Proxy 配置。
使用情形
$browser.clearProxy(): Promise<void>;
deleteHeader
此瀏覽器測試 API 會刪除使用者定義的標頭。
使用情形
$browser.deleteHeader(key: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
此指令完成時將解決的承諾。 |
key |
string |
HTTP 標頭名稱。 |
範例
await $browser.addHeader('header1-xxx', 'abcd');
await $browser.addHeaders({
key1: 'val1',
key2: 'val2',
});
await $browser.deleteHeaders(['key1']);
await $browser.get(`http://localhost:${devport}/header-test`);
let userHeaders: Map<string, any> = $browser.getHeaders();
console.log("User customized headers: ", [...userHeaders]);
expect(userHeaders.size).toEqual(2);
deleteHeaders
此瀏覽器測試 API 會刪除使用者定義的標頭。
使用情形
$browser.deleteHeaders: (header: string[]) => Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
此指令完成時將解決的承諾。 |
header |
string[] |
HTTP 標頭名稱。 |
範例
await $browser.addHeader('header1-xxx', 'abcd');
await $browser.addHeaders({
key1: 'val1',
key2: 'val2',
});
await $browser.deleteHeaders(['key1']);
await $browser.get(`http://localhost:${devport}/header-test`);
let userHeaders: Map<string, any> = $browser.getHeaders();
console.log("User customized headers: ", [...userHeaders]);
expect(userHeaders.size).toEqual(2);
deleteHostnameFromDenylist
此瀏覽器測試 API 會從拒絕清單中刪除主機名稱。
使用情形
$browser.deleteHostnameFromDenylist(hostname: string): Promise<void>;
附註: Instana 提供 deleteHostnameFromDenylist 函數來進行 URL 過濾,但不會移除 deleteHostnameFromBlacklist 函數,以確保程式碼與舊版相容。
$browser.deleteHostnameFromBlacklist(hostname: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostname |
string |
符合並支援萬用字元的主機名稱。 |
deleteHostnameFromAllowlist
此瀏覽器測試 API 會從容許清單中刪除主機名稱。
使用情形
$browser.deleteHostnameFromAllowlist(hostname: string): Promise<void>;
附註: 程式碼會將 deleteHostnameFromAllowlist 函數新增至 API ,但不會移除 deleteHostnameFromWhitelist 函數,以確保程式碼與舊版相容。
$browser.deleteHostnameFromWhitelist(hostname: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostname |
string |
符合並支援萬用字元的主機名稱。 |
deleteHostnamesFromDenylist
此瀏覽器測試 API 會從拒絕清單中刪除主機名稱。
使用情形
$browser.deleteHostnamesFromDenylist(hostnameArr: string[]): Promise<void>
附註: Instana 提供 deleteHostnamesFromDenylist 函數來進行 URL 過濾,但不會移除 deleteHostnamesFromBlacklist 函數,以確保程式碼與舊版相容。
$browser.deleteHostnamesFromBlacklist(hostnameArr: string[]): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostnameArr |
string[] |
符合並支援萬用字元的主機名稱。 |
deleteHostnamesFromAllowlist
此瀏覽器測試 API 會從容許清單中刪除主機名稱。
使用情形
$browser.deleteHostnamesFromAllowlist(hostnameArr: string[]): Promise<void>
附註: Instana 提供 deleteHostnamesFromAllowlist 函數來進行 URL 過濾,但不會移除 deleteHostnamesFromWhitelist 函數,以確保程式碼與舊版相容。
$browser.deleteHostnamesFromWhitelist(hostnameArr: string[]): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
回覆值是承諾。 |
hostnameArr |
string[] |
符合並支援萬用字元的主機名稱。 |
美元-美元
$$ 指令是呼叫 findElements 指令以提取頁面上多個元素的捷徑。 指令會傳回含有元素結果的陣列。 這些結果具有延伸原型來呼叫動作指令。
您可以將 $ 或 $$ 鏈結在一起,以導覽 DOM 樹狀結構。
如需如何選取特定元素的相關資訊,請參閱 CSS 選取器。
使用情形
$browser.$$(selector);
參數
| 名稱 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<WebElement[]> |
回覆值是將以 WebElements陣列解析的承諾。 |
selector |
String, Function |
用來提取特定元素的 Selector 或 JavaScript 函數。 |
範例
index.html 檔案如下:
<ul id="menu">
<li><a href="/">Home</a></li>
<li><a href="/">Developer Guide</a></li>
<li><a href="/">API</a></li>
<li><a href="/">Contribute</a></li>
</ul>
使用 $$ 來尋找元素,如下所示:
test("should get text a menu link", async () => {
const menu = (await $browser.$$("#menu"))[0];
const li = await menu.$$("li");
console.log(await li[2].$("a").getText()); // outputs: "API"
});
test("should get text a menu link - JS Function", async () => {
const text = (
await $browser.$$(function () {
// Arrow function is not allowed here.
return document.querySelectorAll("#menu"); // Element[]
})
)[0];
const li3Text = await (await text.$$("li"))[2].$("a").getText();
console.log(li3Text); // outputs: "API"
});
美元
$ 指令是呼叫 findElement 指令以提取頁面上單一元素的捷徑。 指令會傳回物件。 物件具有延伸原型來呼叫動作指令。
您可以將 $ 或 $$ 鏈結在一起,以導覽 DOM 樹狀結構。
如需如何選取特定元素的相關資訊,請參閱 CSS 選取器。
使用情形
$browser.$(selector): WebElementPromise;
參數
| 名稱 | 類型 | 說明 |
|---|---|---|
RETURN |
WebElementPromise |
回覆值是 WebElementPromise。 |
selector |
String, Function |
Selector 或 JavaScript 函數,用來提取多個元素。 |
範例
index.html 檔案如下:
<ul id="menu">
<li><a href="/">Home</a></li>
<li><a href="/">Developer Guide</a></li>
<li><a href="/">API</a></li>
<li><a href="/">Contribute</a></li>
</ul>
使用 $來尋找元素,如下所示:
test("should get text a menu link", async () => {
const text = await $browser.$("#menu").$$("li");
console.log(await text[2].$("a").getText()); // outputs: "API"
});
test("should get text a menu link - JS Function", async () => {
const text = await $browser.$(function () {
// Arrow function is not allowed here.
return document.querySelector("#menu"); // Element
}).$$("li");
console.log(text.$$("li")[2].$("a").getText()); // outputs: "API"
});
執行
此瀏覽器測試 API 會使用 WebDriver的 command.Executor 來執行所提供的 Command 。
使用情形
$browser.execute(command) => Promise<T>
Promise<T> 是將隨指令結果一起解析的承諾。
參數
| 參數 | 類型 | 說明 |
|---|---|---|
command |
Command |
要排程的指令 |
executeAsyncScript
此瀏覽器測試 API 會在目前所選頁框或視窗的環境定義中執行非同步 JavaScript 的 Snippet。 Script 片段會作為匿名函數的主體來執行。 如果提供 Script 作為函數物件,則會將該函數轉換為字串,以注入目標視窗中。
如果您除了 Script 之外還提供任何引數,則它會併入作為 Script 引數,並且可以使用 arguments 物件來參照。 引數可以是布林、數字、字串或 WebElement。 如果每一個項目遵循指定的類型,也可以使用陣列和物件作為 Script 引數。
與使用 executeScript執行同步 JavaScript 不同,使用此函數執行的 Script 必須透過啟動所提供的回呼來明確表示它們已完成。 此回呼一律注入執行的函數中作為最後一個引數,因此可以使用 arguments[arguments.length - 1]來參照。 針對 Script 回呼函數的第一個引數,會採取下列步驟來解析此函數的回覆值:
- 若為 HTML 元素,該值會解析為
WebElement。 - 空值和未定義的回覆值會解析成空值。
- Booleans、numbers 和 strings 會依現狀解析。
- 函數會解析為其字串表示法。
- 對於陣列和物件,會根據所述的規則來轉換每一個成員項目。
使用情形
$browser.executeAsyncScript<T>(script: string|Function, ...var_args: any[]): Promise<T>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise.<T> |
將以 Script 回覆值解析的承諾。 |
script |
string, Function |
要執行的 Script。 |
...args |
* |
要傳遞至 Script 的引數。 |
範例
範例 1: 若要執行與目前選取的視窗同步的休眠,請使用下列範例中所示的指令:
const start = new Date().getTime();
$browser.executeAsyncScript(
"window.setTimeout(arguments[arguments.length - 1], 500);"
).then(function () {
console.log("Elapsed time: " + (new Date().getTime() - start) + " ms");
});
範例 2: 如果要將測試與 Ajax 應用程式同步化,請使用下列範例所示的指令:
const button = $browser.$("#compose-button");
button.click();
$browser.executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"mailClient.getComposeWindowWidget().onload(callback);"
);
$browser.switchTo().frame("composeWidget");
$browser.$("#to").sendKeys("dog@example.com");
範例 3: 若要注入 XMLHttpRequest 並等待結果,請使用下列指令。 在此範例中,使用函數文字指定 inject Script。 當您使用此格式時,會將函數轉換為字串以進行注入。 因此,函數不得參照未定義在受測試頁面範圍中的任何符號。
$browser.executeAsyncScript(function () {
var callback = arguments[arguments.length - 1];
var xhr = new XMLHttpRequest();
xhr.open("GET", "/resource/data.json", true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
callback(xhr.responseText);
}
};
xhr.send("");
}).then(function (str) {
console.log(JSON.parse(str)["food"]);
});
executeScript
此瀏覽器測試 API 會在目前所選頁框或視窗的環境定義中執行 JavaScript Snippet。 Script 片段會作為匿名函數的主體來執行。 如果您提供 Script 作為函數物件,則該函數會轉換成字串,以注入至目標視窗。
如果您除了 Script 之外還提供任何引數,則它會併入作為 Script 引數,並且可以使用 arguments 物件來參照。 引數可以是布林、數字、字串或 WebElement。 如果每一個項目遵循指定的類型,也可以使用陣列和物件作為 Script 引數。
Script 可能參照可從現行視窗存取的任何變數。 此外, Script 在視窗的環境定義中執行,因此可以使用 document 來參照現行文件。 雖然廣域變數持續存在,但在 Script 完成執行之後沒有可用的區域變數。
如果 Script 具有回覆值 (亦即,如果 Script 包含 return 陳述式) ,則會採取下列步驟來解析此函數的回覆值:
- 對於 HTML 元素,此值會解析為 WebElement。
- 空值和未定義的回覆值會解析成空值。
- Booleans、numbers 和 strings 會依現狀解析。
- 函數會解析為其字串表示法。
- 對於陣列和物件,會根據所述的規則來轉換每一個成員項目。
使用情形
$browser.executeScript<T>(script: string|Function, ...var_args: any[]): Promise<T>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise.<T> |
將以 Script 回覆值解析的承諾。 |
script |
string, Function |
要執行的 Script。 |
...args |
* |
要傳遞至 Script 的引數。 |
findElement
此瀏覽器測試 API 會在頁面上尋找元素。 如果找不到元素,驅動程式會傳回 error.NoSuchElementError。
使用情形
$browser.findElement(locator: Locator): WebElementPromise;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
WebElement承諾 | 可用來對找到的元素發出指令的 WebElement 。 如果找不到元素,則會使元素失效,並停止所有排定的指令。 |
locator |
By, function |
要使用的定位器。 |
範例
您不得使用此功能來測試頁面上是否存在元素。 您必須改用 findElements:
$browser.findElements($driver.By.id("foo"))
.then((found) => console.log("Element found? %s", !!found.length));
您可以使用 webdriver.By 名稱空間或作為速成 webdriver.By.Hash 物件。 例如,下列兩個陳述式相等:
var e1 = $browser.findElement($driver.By.id("foo"));
var e2 = $browser.findElement({ id: "foo" });
您也可以提供自訂定位器函數,以作為此實例的輸入,並傳回 WebElement或將以 WebElement解析的承諾。 如果傳回的 promise 解析為 WebElements的陣列, WebDriver 會使用第一個元素。 例如,若要在頁面上尋找第一個可見的鏈結,您可以使用下列指令:
var link = $browser.findElement(firstVisibleLink);
function firstVisibleLink(driver) {
var links = driver.findElements(By.tagName("a"));
return promise.filter(links, function (link) {
return link.isDisplayed();
});
}
findElements
此瀏覽器測試 API 會在頁面上搜尋多個元素。 如需元素定位器策略的相關資訊,請參閱 findElement。
使用情形
$browser.findElements(locator: Locator): Promise<WebElement[]>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
承諾<WebElement[]> | 將以 WebElements陣列解析的承諾。 |
locator |
By, function |
要使用的定位器。 |
取得
此瀏覽器測試 API 會移至特定 URL。
使用情形
$browser.get(url: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
當文件完成載入時將解決的承諾。 |
url |
string |
要開啟的完整 URL。 |
getAllWindowHandles
此瀏覽器測試 API 會排定指令來擷取可用視窗控點的現行清單。
使用情形
$browser.getAllWindowHandles(): Promise<string[]>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string[]> |
將使用視窗控點陣列來解析的承諾。 |
getCapabilities
此瀏覽器測試 API 會取得此實例的 功能。
使用情形
$browser.getCapabilities(): Promise<Capabilities>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<Capabilities> |
將使用此實例的功能來解決的承諾。 |
getCurrentURL
這個瀏覽器測試 API 會排定指令來擷取現行頁面的 URL。
使用情形
$browser.getCurrentUrl(): Promise<string>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string> |
將以現行 URL 解析的承諾。 |
getHeaders
此瀏覽器測試 API 會取得使用者自訂的標頭。
使用情形
$browser.getHeaders(): Map<string, any>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Map<string, any> |
使用者定義的標頭 |
範例
await $browser.addHeader('header1-xxx', 'abcd');
await $browser.addHeaders({
key1: 'val1',
key2: 'val2',
});
await $browser.deleteHeaders(['key1']);
await $browser.get(`http://localhost:${devport}/header-test`);
let userHeaders: Map<string, any> = $browser.getHeaders();
console.log("User customized headers: ", [...userHeaders]);
expect(userHeaders.size).toEqual(2);
getPage來源
此瀏覽器測試 API 會擷取現行頁面的來源。 傳回的來源是基礎 DOM 的表示法。 請勿預期以與從 Web 伺服器傳送的原始回應相同的方式來格式化或跳出來源。
使用情形
$browser.getPageSource(): Promise<string>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string> |
將以現行頁面來源解析的承諾。 |
getProxy
此瀏覽器測試 API 會擷取現行 Proxy 配置。
使用情形
$browser.getProxy(): FFProxyConfig | CProxyConfig;
也可以透過 $network 物件來呼叫此 API:
$network.getProxy(): FFProxyConfig | CProxyConfig;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
CProxyConfig 或 FFProxyConfig | Chrome 或 Firefox 特定封裝中的 Proxy 配置物件 。 |
Proxy 配置
/**
* Firefox extension - An object encapsulating a complete proxy configuration
* https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/proxy/settings
*/
export interface FFProxyConfig {
proxyType?: FFProxyType,
http?: string;
ssl?: string,
ftp?: string;
autoConfigUrl?: string,
autoLogin?: boolean,
httpProxyAll?: boolean,
passthrough?: string,
proxyDNS?: boolean,
socks?: string,
socksVersion?: number,
}
/**
* Chrome extension - An object encapsulating a complete proxy configuration
* https://developer.chrome.com/docs/extensions/reference/proxy/#type-ProxyConfig
*/
export interface CProxyConfig {
mode: CProxyType,
rules?: {
bypassList?: string[],
fallbackProxy?: ProxyServer,
proxyForFtp?: ProxyServer,
proxyForHttp?: ProxyServer,
proxyForHttps?: ProxyServer,
singleProxy?: ProxyServer,
},
pacScript?: {
data?: string,
mandatory?: boolean,
url?: string,
},
};
getSession
此瀏覽器測試 API 會擷取此用戶端的 階段作業。
使用情形
$browser.getSession(): Promise<Session>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<Session> |
此用戶端階段作業的承諾。 |
getTitle
此瀏覽器測試 API 會排定指令來擷取現行頁面的標題。
使用情形
$browser.getTitle(): Promise<string>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string> |
將以現行頁面標題解析的承諾。 |
getWindow控點
此瀏覽器測試 API 會排定指令來擷取現行視窗控點。
使用情形
$browser.getWindowHandle(): Promise<string>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string> |
將以現行視窗控點解決的承諾。 |
管理
此瀏覽器測試 API 會取得此實例的選項介面。
使用情形
$browser.manage(): Options;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Options |
此實例的選項介面。 |
選項
這些選項提供用來管理瀏覽器及驅動程式狀態的方法。
| 類型 | 說明 |
|---|---|
addCookie(spec: IWebDriverOptionsCookie): Promise<void> |
排定指令以新增 Cookie。 |
deleteAllCookies(): Promise<void>; |
排定指令以刪除現行頁面可見的所有 Cookie。 |
deleteCookie(name: string): Promise<void>; |
排定指令以刪除具有給定名稱的 Cookie。 如果現行頁面看不到具有給定名稱的 Cookie ,則此指令是無作業。 |
getCookies(): Promise<IWebDriverCookie[]>; |
排定指令以擷取現行頁面可見的所有 Cookie 。 每個 Cookie 都會以 JSON 物件形式傳回,如 WebDriver 佈線通訊協定所述。 |
getCookie(name: string): Promise<IWebDriverCookie>; |
排定指令以擷取具有給定名稱的 Cookie 。 如果沒有這類 Cookie 可用,則傳回空值。 Cookie 會以 JSON 物件形式傳回,如 WebDriver 佈線通訊協定所說明。 |
logs(): Logs; |
提供用來管理驅動程式日誌的介面。 |
getTimeouts(): Promise<ITimeouts>; |
取得現行 逾時。 |
setTimeouts(timeouts: ITimeouts): Promise<void>; |
設定現行 逾時。 |
window(): Window; |
提供用來管理現行 視窗的介面。 |
逾時
| 參數 | 類型 | 說明 |
|---|---|---|
script |
number |
指定等待已評估 Script 執行的時間量上限。 |
pageLoad |
number |
指定等待頁面完成載入的時間量上限。 預設為 300000 毫秒。 |
implicit |
number |
指定在頁面上尋找元素時,等待元素定位器成功的時間量上限。 預設為 0 毫秒。 |
視窗
export interface ILocation {
x: number;
y: number;
}
export interface ISize {
width: number;
height: number;
}
export interface IRectangle {
x: number;
y: number;
width: number;
height: number;
}
用於管理現行視窗的介面。
| 類型 | 說明 |
|---|---|
getPosition(): Promise<ILocation>; |
擷取相對於畫面左上方的視窗現行位置。 |
setPosition(x: number, y: number): Promise<void>; |
重新定位現行視窗。 |
getSize(): Promise<ISize>; |
擷取視窗的現行大小。 |
setSize(width: number, height: number): Promise<void>; |
調整現行視窗的大小。 |
getRect(): Promise<IRectangle>; |
傳回現行最上層視窗的大小及位置。 |
setRect({x, y, width, height}: Partial<IRectangle>): Promise<IRectangle>; |
設定現行最上層視窗的大小及位置。 您可以省略 x 和 y 來更新大小,或只省略 width 和 height 選項來更新位置。 |
maximize(): Promise<void>; |
將現行視窗最大化。 |
範例
let tm = await $browser.manage().getTimeouts();
console.log('current timeout', tm.implicit, tm.pageLoad, tm.script);
await $browser.manage().timeouts().pageLoadTimeout(119);
tm = await $browser.manage().getTimeouts();
expect(tm.pageLoad).toBe(119);
console.log('current timeout', tm.implicit, tm.pageLoad, tm.script);
await $browser.manage().timeouts().pageLoadTimeout(89);
tm = await $browser.manage().getTimeouts();
expect(tm.pageLoad).toBe(89);
console.log('current timeout', tm.implicit, tm.pageLoad, tm.script);
setAuthentication
此瀏覽器測試 API 會變更未來 HTTP 要求的鑑別設定。
使用情形
$browser.setAuthentication(authName: string, authPass: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時會解決承諾。 |
authName |
string |
用於鑑別的使用者名稱。 |
authPass |
string |
用於鑑別的使用者密碼。 |
範例
await $browser.setAuthentication(basicauthuser, password);
await $browser.get(`http://${httpserver}/basic/page1.html`)
.then(() => $browser.takeScreenshot());
setProxy
此瀏覽器測試 API 會設定 Proxy 伺服器,以用於所有 HTTP、HTTP 及 FTP 要求。
使用情形
$browser.setProxy(proxyURL: string | URL, noProxy?: string): Promise<void>;
也可以透過 $network 物件來呼叫此 API。
$network.setProxy(proxyURL: string | URL, noProxy?: string): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時會解決承諾。 |
proxyURL |
string, URL |
用來連接 Proxy 伺服器的 URL 字串。 URL 字串必須採用 Node 的 url.parse(urlString) 方法中定義的格式。 例如, http://proxy_host:8888 或 https://user:pass@proxy_host:8888 |
noProxy |
string |
選用: 略過所有 Proxy 的主機清單 (以逗點區隔)。 |
setProxy進階
此瀏覽器測試 API 會使用 Chrome 或 Firefox Extension API 支援的 Proxy 處理格式來設定 Proxy 配置。
使用情形
$browser.setProxyAdvanced(proxyConfig: CProxyConfig | FFProxyConfig, authName?: string, authPass?: string): Promise<void>;
也可以透過 $network 物件來呼叫此 API。
$network.setProxyAdvanced(proxyConfig: CProxyConfig | FFProxyConfig, authName?: string, authPass?: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時會解決承諾。 |
proxyConfig |
CProxyConfig 或 FFProxyConfig | Chrome 或 Firefox 特定封裝中的 Proxy 配置物件。 |
authName |
string |
選用: 用於鑑別之 Proxy 伺服器的使用者名稱。 |
authPass |
string |
選用: 用於鑑別之 Proxy 伺服器的使用者密碼。 |
範例
async function testProxyAdvanced() {
await $browser.clearProxy();
var ffconfig = {
proxyType: "manual",
//proxyType: "autoConfig",
http: proxy_4,
ssl: proxy_4,
ftp: proxy_4,
autoConfigUrl: pacfile,
passthrough: noproxy,
autoLogin: true,
}
var pxyserver = {
host: httpserver,
port: 8088,
scheme: "http",
}
var cconfig = {
mode: "fixed_servers",
rules: {
bypassList: noproxy.split(','),
fallbackProxy: {
host: "my-proxy-server.us.ibm.com",
port: 8080,
},
proxyForFtp: pxyserver,
proxyForHttp: pxyserver,
proxyForHttps: pxyserver,
},
pacScript: {
url: pacfile,
},
}
var bname = null;
await $browser.getCapabilities().then(cap=> {
bname = cap.getBrowserName();
});
var config = (bname == 'chrome') ? cconfig : ffconfig;
await $browser.setProxyAdvanced(config, proxyuser, password);
await $browser.get(`http://${httpserver}/demo/page2.html`)
.then(() => $browser.takeScreenshot());
}
setProxy鑑別
此瀏覽器測試 API 會變更來自 HTTP、HTTP 及 FTP 要求的 Proxy 鑑別設定。
使用情形
$browser.setProxyAuthentication(authName: string, authPass: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時會解決承諾。 |
authName |
string |
用於鑑別之 Proxy 伺服器的使用者名稱。 |
authPass |
string |
Proxy 伺服器用於鑑別的使用者密碼。 |
範例
async function testProxyAuthentication() {
await $browser.clearProxy();
await $browser.setProxy(proxy_3, noproxy);
await $browser.setProxyAuthentication(proxyuser, password);
await $browser.get(`http://${httpserver}/demo/page2.html`)
.then(() => $browser.takeScreenshot());
}
setProxyForHttp
此瀏覽器測試 API 會設定 Proxy 伺服器,以用於所有 HTTP 要求。
使用情形
$browser.setProxyForHttp(proxyURL: string | URL, noProxy?: string): Promise<void>
也可以透過 $network 物件來呼叫此 API。
$network.setProxyForHttp(proxyURL: string | URL, noProxy?: string): Promise<void>
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時會解決承諾。 |
proxyURL |
string, URL |
用來連接 Proxy 伺服器的 URL 字串。 URL 字串必須採用 Node 的 url.parse(urlString) 方法中定義的格式。 例如, http://proxy_host:8888 或 https://user:pass@proxy_host:8888 |
noProxy |
string |
選用: 必須略過所有 Proxy 的主機清單 (以逗點區隔)。 |
範例
let website;
let proxyServer = "proxyHost:proxyPort";
console.log(">>>>>>>>>>>>>>>>>>>", "Clear proxy configuration");
await $network.clearProxy();
console.log(">>>>>>>>>>>>>>>>>>>", "Set proxy configuration for HTTP request");
await $network.setProxyForHttp(proxyServer);
website = await accessWebSite();
checkHostname("www.google.com.hk", website)
setProxyForHttps
此瀏覽器測試 API 會設定 Proxy 伺服器,以用於所有 HTTP 要求。
使用情形
$browser.setProxyForHttps(proxyURL: string | URL, noProxy?: string): Promise<void>;
也可以透過 $network 物件來呼叫此 API。
$network.setProxyForHttps(proxyURL: string | URL, noProxy?: string): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時解決承諾 |
proxyURL |
string, URL |
用來連接 Proxy 伺服器的 URL 字串。 URL 字串必須採用 Node 的 url.parse(urlString) 方法中定義的格式。 例如, http://proxy_host:8888 或 https://user:pass@proxy_host:8888 |
noProxy |
string |
選用: 必須略過所有 Proxy 的主機清單 (以逗點區隔)。 |
範例
let website;
let sslProxyServer = "username:password@proxyHost:proxyPort";
console.log(">>>>>>>>>>>>>>>>>>>", "Clear proxy configuration");
await $network.clearProxy();
console.log(">>>>>>>>>>>>>>>>>>>", "Set proxy configuration for HTTPS request");
let testURL = new URL("http://" + sslProxyServer);
await $network.setProxyForHttps(testURL);
website = await accessWebSite();
checkHostname("www.google.com", website);
setProxyPAC
這個瀏覽器測試 API 會透過 Proxy 自動配置 (PAC) Script 來設定 Proxy 伺服器。
使用情形
$browser.setProxyPAC(pacScriptURL: string, noProxy?: string, authMap?: Map<string, any>): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
套用設定時會解決承諾。 |
pacScriptURL |
string |
PAC Script 的 URL。 |
noProxy |
string |
選用: 必須略過所有 Proxy 的主機清單 (以逗點區隔)。 |
authMap |
Map |
選用: 要提供給 Proxy 伺服器的鑑別認證對映,由 Proxy 伺服器的 Hostname 所輸入。 此對映的值必須以 {username: "authUsername", password: "authPassword"}格式定義。 |
範例
const httpserver = '<DemoServerIP>';
const noproxy = "localhost,google.com,192.168.1.0/24";
const pacfile = `http://${httpserver}/pacfile`;
const authmap = new Map([
[ httpserver, {username: "proxyuser", password: "passw0rd"} ],
[ "httpserver2", {username: "user1", password: "passw0rd"} ],
])
async function testProxyPAC() {
await $browser.clearProxy();
await $browser.setProxyPAC(pacfile, noproxy, authmap);
await $browser
.get(`http://${httpserver}/demo/page2.html`)
.then(() => $browser.takeScreenshot());
}
休眠
此瀏覽器測試 API 會排定指令,讓驅動程式休眠特定時間量。
使用情形
$browser.sleep(ms: number): Promise<void>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
將在休眠完成時解決的承諾。 |
ms |
number |
休眠的時間量 (毫秒)。 |
範例
await $browser.get("https://www.yahoo.com/");
await $browser.sleep(3 * 1000);
await $browser.takeScreenshot();
switchTo
此瀏覽器測試 API 會取得一個介面,用於將驅動程式的焦點變更為另一個頁框或視窗。
使用情形
$browser.switchTo(): TargetLocator;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
TargetLocator | 此實例的 TargetLocator 介面。 |
TargetLocator
用於將驅動程式焦點變更為另一個頁框或視窗的介面。
實例方法
| 類型 | 說明 |
|---|---|
activeElement(): WebElementPromise; |
排定指令擷取現行文件上的 document.activeElement 元素,或 document.body (如果 activeElement 無法使用的話)。 |
defaultContent(): Promise<void>; |
排程指令以將所有未來指令的焦點切換至頁面上的第一個頁框。 目標頁框可以指定為下列其中一個值: -一個數字,將 (從零開始) 索引指定至 window.frames。 - WebElement 參照,對應於 frame 或 iframe DOM 元素。 - null 值,用來選取頁面上最上層的頁框。 傳遞 null 與呼叫 defaultContent相同。 |
frame(id: Number |WebElement| null): Promise<void>; |
將所有未來指令的焦點變更為頁面上的另一個頁框。 |
parentFrame(): Promise<void>; |
將所有未來指令的焦點變更為目前所選取頁框的母頁框。 如果驅動程式已聚焦在最上層瀏覽環境定義上,則此指令沒有作用。 |
window(nameOrHandle: string): Promise<void>; |
排定指令以將所有未來指令的焦點切換至另一個視窗。 Windows 可以由其 window.name 屬性或其控點指定 (如 getWindowHandle所傳回)。 |
newWindow(typeHint: string): Promise<void>; |
建立瀏覽器視窗,並將此驅動程式未來指令的焦點切換至新視窗。 typeHint 'window' 或 'tab'。 建立的視窗不保證為所要求的類型。 如果驅動程式不支援所要求的類型,則會建立驅動程式所支援之任何類型的新瀏覽器視窗。 當驅動程式將焦點變更為新視窗時,會解決傳回的承諾。 |
alert(): AlertPromise; |
排程指令以將焦點變更為作用中限制模式的對話框,例如由 window.alert()、 window.confirm()及 window.prompt()開啟的對話框。 如果沒有可用的開啟警示,則會以 error.NoSuchAlertError 拒絕所傳回的承諾。 |
範例
/**
* samples of getting current window handle
* switch to a new window
* open new page in new tab
*/
console.log("Windows handle: ", await $browser.getWindowHandle(), "Current url: ", await $browser.getCurrentUrl());
console.log("switch to calendar tab");
let originalWindow = await $browser.getWindowHandle();
await $browser.switchTo().newWindow();
/**
* navigate to www.timeanddate.com
* assert page title by getTitle() api
* assert page title by getPageSource() api
*/
console.log("Access time and date page");
await $browser.get("http://www.timeanddate.com");
let page = await $browser.getPageSource();
assert.isTrue(page.includes("<title>timeanddate.com</title>"));
console.log("Page title: ", await $browser.getTitle());
/**
* switch back to original window
* take screenshot
*/
await $browser.switchTo().window(originalWindow);
await $browser.takeScreenshot();
takeScreenshot
這個瀏覽器測試 API 會排定指令來取得擷取畫面。 驅動程式會依照喜好設定的順序,嘗試傳回下列元素的擷取畫面:
- 整個頁面
- 現行視窗
- 現行頁框的可見部分
- 包含瀏覽器的整個顯示畫面
使用情形
$browser.takeScreenshot(): Promise<string>;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string> |
將使用擷取畫面作為 base-64 編碼 PNG 來解析的承諾。 |
等待
此瀏覽器測試 API 會等待條件評估為 "truthy" 值。 條件可以由 條件指定為自訂函數,或指定為任何類似 promise 的 thenable。
對於 條件 或函數,等待會反覆地評估條件,直到它傳回 truthy 值為止。 如果在 API 評估條件時發生任何錯誤,則容許錯誤傳播。 當條件傳回承諾時,輪詢迴圈會等待它解決,並使用已解決的值來檢查是否滿足條件。 承諾的解決時間一律會納入因素,以檢查等待是否逾時。
如果提供的條件是 WebElement條件,則等待會傳回 WebElementPromise ,解析為滿足條件的元素。
使用情形
$browser.wait(
condition: WebElementCondition,
opt_timeout?: number,
opt_message?: string): WebElementPromise;
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<string> |
將以條件函數所傳回的第一個 truthy 值解析的承諾,或在條件逾時時時遭到拒絕。 如果輸入條件是 WebElementCondition的實例,則回覆值是 WebElementPromise。 |
condition |
IThenable<(T|null)> 或 Condition<(T|null)> 或 function(WebDriver): (T|null) |
要等待的條件,定義為 promise、condition 物件或要評估為條件的函數。 |
opt_timeout |
number |
等待條件為 true 的持續時間 (毫秒)。 |
opt_message |
string 或 function |
等待逾時時時要使用的選用訊息。 |
範例
範例 1: 若要等待最多 10 秒,讓元素出現在頁面上,請使用下列範例中所示的指令:
async function example() {
let button = await $browser.wait(
$driver.until.elementLocated($driver.By.id("foo")),
10000
);
await button.click();
}
範例 2: 若要等待元素並按一下,請使用指令,如下列範例所示:
await $browser.wait(until.elementLocated(by), timeout);
const element = await $browser.findElement(by, timeout);
await $browser.wait(until.elementIsVisible(element), timeout, `${by} not visible`);
await $browser.wait(until.elementIsEnabled(element), timeout, `${by} not enabled`);
await element.click();
waitForAndFind元素
此瀏覽器測試 API 會等待並尋找頁面上的元素,並等待其可見。 如果找不到,虛構監視會傳回錯誤。 逾時值是選用的。 它會個別套用至尋找元素及等待其可見性的兩項作業。 因此,在最差的情況下,這個方法最多可能需要兩倍所提供的逾時值。 預設逾時值是 1000 毫秒 (1 秒)。
如果找到具有參數中給定定位器的元素,且該元素變成可見,或在指定 timeout內未滿足所述條件時,則會傳回 WebElementPromise 。
使用情形
$browser.waitForAndFindElement(locator: Locator, timeout?: number) : WebElementPromise;
此函數類似如下:
const element = await $browser.wait(until.elementLocated(locator), timeout);
await $browser.wait(until.elementIsVisible(element), timeout);
return await $browser.findElement(locator);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
WebElementPromise |
可用來對找到的元素發出指令的 WebElement 。 如果找不到元素,則會使元素失效,並停止所有排定的指令。 |
locator |
by.By | function |
要使用的定位器。 |
timeout |
number |
選用: 等待的時間量 (毫秒)。 |
範例
$browser.waitForAndFindElement($driver.By.id("username"), 10000);
waitForPendingRequests
此功能適用於與舊版的相容性。
使用情形
$browser.waitForPendingRequests(timeout?: number): Promise<void>;
此函數類似於
let script = "return document.readyState === 'complete'";
await $browser.wait(() => {
return $browser.executeScript(script);
}, timeout);
參數
| 參數 | 類型 | 說明 |
|---|---|---|
RETURN |
Promise<void> |
完成載入文件及所有子資源時將解決的承諾。 |
timeout |
number |
等待的時間量 (毫秒)。 |