API 参考
您可以查看浏览器测试 API 的参考信息。
操作
此浏览器测试 API 函数将使用 WebDriver创建新的操作序列。 直到您在代码中调用 Actions.perform () 函数时,序列才会提交执行。
用法
$browser.actions().sendKeys("synthetic").perform();
参数
| 参数 | Type | 描述 |
|---|---|---|
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() 实现该方法,因为在本 PR 中,该方法已被 2021 年的 Selenium 删除。
示例 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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
headers |
{ [key: string]: string } |
HTTP 头 |
示例
await $browser.addHeaders({
key1: "val1",
key2: "val2",
});
addHostnamesToDenylist
此浏览器测试 API 会将主机名添加到拒绝列表。
用法
$browser.addHostnamesToDenylist(hostnameArr: string[]): Promise<void>
Instana 为 URL 过滤提供了 addHostnamesToDenylist 函数,但没有删除 addHostnamesToBlacklist 函数,以确保代码与早期版本兼容。
$browser.addHostnamesToBlacklist(hostnameArr: string[]): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostnameArr |
string[] |
用于匹配和支持通配符的主机名 |
示例
await $browser.addHostnamesToDenylist(["*.css", "*.png"]);
await $browser.addHostnamesToAllowlist(["*"]);
addHostnamesToAllowlist
此浏览器测试 API 会将主机名添加到允许列表中。
用法
$browser.addHostnamesToAllowlist(hostnameArr: string[]): Promise<void>
Instana 为 URL 过滤提供了 addHostnamesToAllowlist 函数,但没有删除 addHostnamesToWhitelist 函数,以确保代码与早期版本兼容。
$browser.addHostnamesToWhitelist(hostnameArr: string[]): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostnameArr |
string[] |
用于匹配和支持通配符的主机名。 |
示例
await $browser.addHostnamesToDenylist(["*.css", "*.png"]);
await $browser.addHostnamesToAllowlist(["*"]);
addHostnameToDenylist
此浏览器测试 API 会将主机名添加到拒绝列表。
用法
$browser.addHostnameToDenylist(hostname: string): Promise<void>
Instana 为 URL 过滤提供了 addHostnameToDenylist 函数,但没有删除 addHostnameToBlacklist 函数,以确保代码与早期版本兼容。
$browser.addHostnameToBlacklist(hostname: string): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostname |
string |
要匹配和支持通配符的主机名 |
示例
await $browser.addHostnameToDenylist(`*.css`);
await $browser.addHostnameToAllowlist(`*`);
addHostnameToAllowlist
此浏览器测试 API 将主机名添加到允许列表。
用法
$browser.addHostnameToAllowlist(hostname: string): Promise<void>
Instana 为 URL 过滤提供了 addHostnameToAllowlist 函数,但没有删除 addHostnameToWhitelist 函数,以确保代码与早期版本兼容。
$browser.addHostnameToWhitelist(hostname: string): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostname |
string |
要匹配并支持通配符的主机名。 |
示例
await $browser.addHostnameToDenylist(`*.css`);
await $browser.addHostnameToAllowlist(`*`);
clearProxy
此浏览器测试 API 将清除或除去当前代理配置。
用法
$browser.clearProxy(): Promise<void>;
deleteHeader
此浏览器测试 API 将删除用户定义的头。
用法
$browser.deleteHeader(key: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
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 为 URL 过滤提供了 deleteHostnameFromDenylist 函数,但没有删除 deleteHostnameFromBlacklist 函数,以确保代码与早期版本兼容。
$browser.deleteHostnameFromBlacklist(hostname: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostname |
string |
要匹配并支持通配符的主机名。 |
deleteHostnameFromAllowlist
此浏览器测试 API 将从允许列表中删除主机名。
用法
$browser.deleteHostnameFromAllowlist(hostname: string): Promise<void>;
该代码在 API 中添加了 deleteHostnameFromAllowlist 函数,但没有删除 deleteHostnameFromWhitelist 函数,以确保代码与早期版本兼容。
$browser.deleteHostnameFromWhitelist(hostname: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostname |
string |
要匹配并支持通配符的主机名。 |
deleteHostnamesFromDenylist
此浏览器测试 API 将从拒绝列表中删除主机名。
用法
$browser.deleteHostnamesFromDenylist(hostnameArr: string[]): Promise<void>
Instana 为 URL 过滤提供了 deleteHostnamesFromDenylist 函数,但没有删除 deleteHostnamesFromBlacklist 函数,以确保代码与早期版本兼容。
$browser.deleteHostnamesFromBlacklist(hostnameArr: string[]): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostnameArr |
string[] |
要匹配并支持通配符的主机名。 |
deleteHostnamesFromAllowlist
此浏览器测试 API 将从允许列表中删除主机名。
用法
$browser.deleteHostnamesFromAllowlist(hostnameArr: string[]): Promise<void>
Instana 为 URL 过滤提供了 deleteHostnamesFromAllowlist 函数,但没有删除 deleteHostnamesFromWhitelist 函数,以确保代码与早期版本兼容。
$browser.deleteHostnamesFromWhitelist(hostnameArr: string[]): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
返回的值是 promise。 |
hostnameArr |
string[] |
要匹配并支持通配符的主机名。 |
一元一元
$$ 命令是调用 findElements 命令以访存页面上的多个元素的快捷方式。 此命令返回具有元素结果的数组。 这些结果具有用于调用操作命令的扩展原型。
您可以将 $ 或 $$ 链接在一起以浏览 DOM 树。
有关如何选择特定元素的更多信息,请参阅 CSS 选择器。
用法
$browser.$$(selector);
参数
| 名称 | Type | 描述 |
|---|---|---|
RETURN |
Promise<WebElement[]> |
返回的值是将使用 WebElements数组解析的 promise。 |
selector |
String, Function |
用于访存特定元素的选择器或 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;
参数
| 名称 | Type | 描述 |
|---|---|---|
RETURN |
WebElementPromise |
返回值是一个WebElementPromise。 |
selector |
String, Function |
用于访存多个元素的选择器或 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> 是将使用命令结果解析的 promise。
参数
| 参数 | Type | 描述 |
|---|---|---|
command |
Command |
用于调度的命令 |
executeAsyncScript
此浏览器测试 API 在当前所选框架或窗口的上下文中运行异步 JavaScript 片段。 脚本片段作为匿名函数的主体运行。 如果脚本作为函数对象提供,那么该函数将转换为字符串以注入到目标窗口中。
如果您除了提供脚本之外还提供任何参数,那么它将作为脚本参数包含在内,并且可以使用 arguments 对象进行引用。 参数可以是布尔值、数字、字符串或 WebElement. 如果每个项都遵循所声明的类型,那么数组和对象也可用作脚本参数。
与使用executeScript 运行同步JavaScript不同,使用此函数运行的脚本必须通过启动所提供的回调来明确表示脚本已运行完毕。 此回调始终作为最后一个自变量注入到执行的函数中,因此可以使用 arguments[arguments.length - 1]进行引用。 要针对脚本回调函数的第一个自变量解析此函数的返回值,请执行以下步骤:
- 对于 HTML 元素,该值解析为 WebElement.
- 空值和未定义的返回值解析为空。
- 布尔值,数字和字符串按顺序解析。
- 函数解析为其字符串表示。
- 对于数组和对象,将根据规定的规则转换每个成员项。
用法
$browser.executeAsyncScript<T>(script: string|Function, ...var_args: any[]): Promise<T>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise.<T> |
将使用脚本的返回值解析的承诺。 |
script |
string, Function |
要运行的脚本。 |
...args |
* |
要传递到脚本的自变量。 |
示例
示例 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 并等待结果,请使用以下命令。 在此示例中,使用函数字面值指定注入脚本。 使用此格式时,函数将转换为字符串以进行注入。 因此,该函数不得引用未在被测试页面的作用域中定义的任何符号。
$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 片段。 脚本片段作为匿名函数的主体运行。 如果提供脚本作为函数对象,那么该函数将转换为字符串以注入到目标窗口中。
如果除了脚本之外还提供了任何自变量,那么它将作为脚本自变量包含在内,并且可以使用 arguments 对象进行引用。 参数可以是布尔值、数字、字符串或 WebElement. 如果每个项都遵循所声明的类型,那么数组和对象也可用作脚本参数。
该脚本可能引用可从当前窗口访问的任何变量。 此外,脚本在窗口的上下文中运行,因此可以使用 document 来引用当前文档。 在脚本完成运行后,没有可用的局部变量,但全局变量仍存在。
如果脚本具有返回值,即,如果脚本包含返回语句,那么将执行以下步骤来解析此函数的返回值:
- 对于 HTML 元素,该值解析为 WebElement.
- 空值和未定义的返回值解析为空。
- 布尔值,数字和字符串按顺序解析。
- 函数解析为其字符串表示。
- 对于数组和对象,将根据规定的规则转换每个成员项。
用法
$browser.executeScript<T>(script: string|Function, ...var_args: any[]): Promise<T>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise.<T> |
将使用脚本的返回值解析的承诺。 |
script |
string, Function |
要运行的脚本。 |
...args |
* |
要传递到脚本的自变量。 |
findElement
此浏览器测试 API 在页面上查找元素。 如果找不到该元素,那么驱动程序将返回 error.NoSuchElementError。
用法
$browser.findElement(locator: Locator): WebElementPromise;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
WebElementPromise | 可用于对找到的元素发出命令的 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 解析的承诺。 如果返回的承诺使用数组 "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[]>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<WebElement []> | 将使用 WebElements数组解析的 Promise。 |
locator |
By, function |
要使用的定位器。 |
generateTOTPToken
此浏览器测试 API 根据 TOTP 密钥生成基于时间的一次性密码 (TOTP) 令牌。 您可以使用此 API 通过双因子认证登录。
用法
$browser.generateTOTPToken(key: string, options?: TOTPOptions): string;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
string |
基于时间的一次性密码 (TOTP) 令牌 |
key |
string |
TOTP 密钥, base32 字符串 |
options |
Object,undefined |
可选: 可选设置,例如 {digits: 8, algorithm: "SHA-512", period: 60}。 缺省设置为 {digits: 6, algorithm: "SHA-1", period: 30} |
示例
示例 1: 要在浏览器脚本测试中生成 TOTP 令牌并使用双因子认证登录:
await $browser.waitForAndFindElement($driver.By.id("password"), 15000);
let totp_token = $browser.generateTOTPToken($secure.totpKey);
await $browser.findElement($driver.By.id("password")).then((element) => {
return element.clear().then(() => {
return element.sendKeys(totp_token);
});
});
示例 2: 要在 Selenium SIDE 脚本测试中生成 TOTP 令牌:
{
"id": "ec51296b-4d16-4167-ac83-ba87f89cc0c7",
"comment": "Generate a TOTP token from a TOTP key",
"command": "executeScript",
"target": "return $browser.generateTOTPToken($secure.totpKey);",
"targets": [],
"value": "totpToken"
}
获取
该浏览器测试应用程序接口指向一个 URL。
用法
$browser.get(url: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
在文档完成装入时将解决的承诺。 |
url |
string |
要打开的完全合格的 URL。 |
getAllWindowHandles
此浏览器测试 API 调度命令以检索可用窗口句柄的当前列表。
用法
$browser.getAllWindowHandles(): Promise<string[]>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string[]> |
将使用窗口句柄数组解析的承诺。 |
getCapabilities
此浏览器测试 API 可获取此实例的功能。
用法
$browser.getCapabilities(): Promise<Capabilities>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<Capabilities> |
将使用此实例的功能解决的承诺。 |
getCurrentUrl
该浏览器测试应用程序接口会调度一条命令,以检索当前页面的 URL。
用法
$browser.getCurrentUrl(): Promise<string>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string> |
将使用当前 URL 解析的承诺。 |
getHeaders
此浏览器测试 API 将获取用户定制的头。
用法
$browser.getHeaders(): Map<string, any>;
参数
| 参数 | Type | 描述 |
|---|---|---|
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);
getPageSource
此浏览器测试 API 将检索当前页面的源。 返回的源是底层 DOM 的表示。 不要期望以与从 Web 服务器发送的原始响应相同的方式对源进行格式化或转义。
用法
$browser.getPageSource(): Promise<string>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string> |
将使用当前页面源解析的承诺。 |
getProxy
此浏览器测试 API 将检索当前代理配置。
用法
$browser.getProxy(): FFProxyConfig | CProxyConfig;
还可以通过 $network 对象来调用此 API:
$network.getProxy(): FFProxyConfig | CProxyConfig;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
CProxyConfig 或 FFProxyConfig | 特定于 Chrome 或 Firefox 封装中的 代理配置对象 。 |
代理配置
/**
* 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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<Session> |
此客户会话的承诺。 |
getTitle
此浏览器测试 API 调度命令以检索当前页面的标题。
用法
$browser.getTitle(): Promise<string>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string> |
将使用当前页面的标题解决的承诺。 |
getWindowHandle
此浏览器测试 API 调度命令以检索当前窗口句柄。
用法
$browser.getWindowHandle(): Promise<string>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string> |
将使用当前窗口句柄解决的承诺。 |
管理
此浏览器测试 API 获取此实例的选项界面。
用法
$browser.manage(): Options;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Options |
此实例的选项接口。 |
选项
这些选项提供了用于管理浏览器和驱动程序状态的方法。
| Type | 描述 |
|---|---|
addCookie(spec: IWebDriverOptionsCookie): Promise<void> |
调度命令以添加 cookie。 |
deleteAllCookies(): Promise<void>; |
调度命令以删除对当前页面可见的所有 cookie。 |
deleteCookie(name: string): Promise<void>; |
调度命令以删除具有给定名称的 cookie。 如果没有给定名称对当前页面可见的 cookie ,那么此命令是 no-op。 |
getCookies(): Promise<IWebDriverCookie[]>; |
调度命令以检索对当前页面可见的所有 cookie 。 每个 cookie 都作为 JSON 对象返回,如 WebDriver 有线协议所述。 |
getCookie(name: string): Promise<IWebDriverCookie>; |
调度命令以检索具有给定名称的 cookie 。 如果没有可用的此类 cookie ,那么返回 null。 cookie 作为 JSON 对象返回,如 WebDriver 有线协议所述。 |
logs(): Logs; |
提供用于管理驱动程序日志的接口。 |
getTimeouts(): Promise<ITimeouts>; |
获取当前 超时。 |
setTimeouts(timeouts: ITimeouts): Promise<void>; |
设置当前 超时。 |
window(): Window; |
提供用于管理当前 窗口的接口。 |
超时
| 参数 | Type | 描述 |
|---|---|---|
script |
number |
指定等待已求值的脚本运行的最大时间量。 |
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;
}
用于管理当前窗口的接口。
| Type | 描述 |
|---|---|
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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时,将解析 promise。 |
authName |
string |
用于认证的用户名。 |
authPass |
string |
用于认证的用户密码。 |
示例
await $browser.setAuthentication(basicauthuser, password);
await $browser.get(`http://${httpserver}/basic/page1.html`)
.then(() => $browser.takeScreenshot());
setProxy
该浏览器测试 API 可为所有 HTTP、 HTTPS 和 FTP 请求设置代理服务器。
用法
$browser.setProxy(proxyURL: string | URL, noProxy?: string): Promise<void>;
还可以通过 $network 对象调用此 API。
$network.setProxy(proxyURL: string | URL, noProxy?: string): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时,将解析 promise。 |
proxyURL |
string, URL |
用于连接代理服务器的 URL 字符串。 URL 字符串的格式必须与节点的 url.parse ( urlString ) 方法所定义的格式一致。 例如, http://proxy_host:8888 或 https://user:pass@proxy_host:8888 |
noProxy |
string |
可选: 以逗号分隔的主机列表,用于绕过所有代理。 |
setProxyAdvanced
此浏览器测试 API 使用 Chrome 或 Firefox Extension API 支持的代理格式来设置代理配置。
用法
$browser.setProxyAdvanced(proxyConfig: CProxyConfig | FFProxyConfig, authName?: string, authPass?: string): Promise<void>;
还可以通过 $network 对象调用此 API。
$network.setProxyAdvanced(proxyConfig: CProxyConfig | FFProxyConfig, authName?: string, authPass?: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时,将解析 promise。 |
proxyConfig |
CProxyConfig 或 FFProxyConfig | 特定于 Chrome 或 Firefox 封装中的代理配置对象。 |
authName |
string |
可选: 用于认证的代理服务器的用户名。 |
authPass |
string |
可选: 用于认证的代理服务器的用户密码。 |
示例
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());
}
setProxyAuthentication
该浏览器测试 API 可更改 HTTP、 HTTPS 和 FTP 请求的代理验证设置。
用法
$browser.setProxyAuthentication(authName: string, authPass: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时,将解析 promise。 |
authName |
string |
用于认证的代理服务器的用户名。 |
authPass |
string |
用于认证的代理服务器的用户密码。 |
示例
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 可为所有 HTTP 请求设置代理服务器。
用法
$browser.setProxyForHttp(proxyURL: string | URL, noProxy?: string): Promise<void>
还可以通过 $network 对象调用此 API。
$network.setProxyForHttp(proxyURL: string | URL, noProxy?: string): Promise<void>
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时,将解析 promise。 |
proxyURL |
string, URL |
用于连接代理服务器的 URL 字符串。 URL 字符串必须采用 Node 的 url.parse ( urlString ) 方法所定义的格式。 例如, http://proxy_host:8888 或 https://user:pass@proxy_host:8888 |
noProxy |
string |
可选: 必须绕过所有代理的主机的逗号分隔列表。 |
示例
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 可为所有 HTTPS 请求设置代理服务器。
用法
$browser.setProxyForHttps(proxyURL: string | URL, noProxy?: string): Promise<void>;
还可以通过 $network 对象调用此 API。
$network.setProxyForHttps(proxyURL: string | URL, noProxy?: string): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时解析 promise |
proxyURL |
string, URL |
用于连接代理服务器的 URL 字符串。 URL 字符串的格式必须与节点的 url.parse ( urlString ) 方法所定义的格式一致。 例如, http://proxy_host:8888 或 https://user:pass@proxy_host:8888 |
noProxy |
string |
可选: 必须绕过所有代理的主机的逗号分隔列表。 |
示例
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 通过代理自动配置 (PAC) 脚本设置代理服务器。
用法
$browser.setProxyPAC(pacScriptURL: string, noProxy?: string, authMap?: Map<string, any>): Promise<void>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
应用设置时,将解析 promise。 |
pacScriptURL |
string |
PAC 脚本的 URL。 |
noProxy |
string |
可选: 必须绕过所有代理的主机的逗号分隔列表。 |
authMap |
Map |
可选: 要提供给代理服务器 (由代理服务器的 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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
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;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
TargetLocator | 此实例的 TargetLocator 接口。 |
TargetLocator
用于将驱动程序的焦点更改为另一个框架或窗口的接口。
实例方法
| Type | 描述 |
|---|---|
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>; |
调度命令以将所有未来命令的焦点切换到另一个窗口。 可以通过 "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>;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string> |
将使用屏幕快照作为 base-64 编码的 PNG 解析的 Promise。 |
等待
此浏览器测试 API 等待条件求值为 "truthy" 值。 条件可由 "条件" 指定为定制函数或任何类似 promise 的 thenable。
对于 "条件" 或 "函数" ,等待会反复评估条件,直到它返回一个真实值为止。 如果在 API 评估条件时发生任何错误,那么允许传播这些错误。 当条件返回 promise 时,轮询循环将等待其解析,并使用已解析的值来检查是否满足该条件。 始终会将 Promise 的解决时间考虑在内,以检查等待是否已超时。
如果提供的条件是WebElementCondition,则等待返回一个WebElementPromise,解析到满足条件的元素。
用法
$browser.wait(
condition: WebElementCondition,
opt_timeout?: number,
opt_message?: string): WebElementPromise;
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<string> |
将使用条件函数返回的或在条件超时时被拒绝的第一个可信值解析的承诺。 如果输入条件是 "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();
waitForAndFindElement
此浏览器测试 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);
参数
| 参数 | Type | 描述 |
|---|---|---|
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);
参数
| 参数 | Type | 描述 |
|---|---|---|
RETURN |
Promise<void> |
完成装入文档和所有子资源时将解析的承诺。 |
timeout |
number |
要等待的时间量 (以毫秒为单位)。 |