$
Обзор
Используйте команду $
вместо findElement как более краткую команду, чтобы получить один элемент на странице.
Команда $
возвращает объект, описывающий элемент, на котором можно вызывать команды действия без передачи селектора. Однако, если вы все же передадите селектор, то сначала будет найден соответствующий элемент, а затем вызвано действие для этого элемента. Вы также можете передать объект в качестве селектора, где объект содержит свойство element-6066-11e4-a52e-4f735466cecf
со значением ссылки на элемент. Затем команда преобразует ссылку в расширенный элемент WebdriverIO. Примечание: используйте эти объекты элементов только в том случае, если вы уверены, что о ни существуют на странице. Последнее можно проверить, например, используя команду isExisting.
Вы можете связать $
или $$
вместе, чтобы спуститься по дереву DOM. Но имейте в виду, что объединение команд $
и $$
в цепочки имеет смысл только при использовании стратегий с множественными селекторами. Иначе вы будете делать ненужные запросы, которые замедлят тест (например, $('body').$('div')
создаст два запроса, тогда как $('body div')
сделает то же самое за один запрос).
Подробнее о том, как выбрать определенные элементы, читайте в рецепте «Как использовать селекторы».
Использование
await browser.$(selector);
Параметры команды
Имя | Тип | Описание |
selector | String или Function или Matcher | Селектор, или JS-функция, или объект Matcher для получения конкретного элемента. |
Примеры использования
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>
it("should get text of a menu link - JS Function", async ({ browser }) => {
const text = await browser.$("#menu");
console.log(
await text
.$$("li")[2]
.$(function () {
// Использовать здесь стрелочную функцию нельзя.
// Это Element – https://developer.mozilla.org/en-US/docs/Web/API/Element
// в этом конкретном примере – это HTMLLIElement
//
// TypeScript-пользователи могут сделать что-нибудь вроде:
// return (this as Element).querySelector('a')
return this.querySelector("a"); // Element
})
.getText(),
); // выведет: "API"
});
it("should get text a menu link", async ({ browser }) => {
const text = await browser.$("#menu");
console.log(await text.$$("li")[2].$("a").getText()); // выведет: "API"
});
it("should allow to convert protocol result of an element into a WebdriverIO element", async ({
browser,
}) => {
const activeElement = await browser.getActiveElement();
console.log(await browser.$(activeElement).getTagName()); // выведет активный элемент
});
it("should use Androids DataMatcher or ViewMatcher selector", async ({ browser }) => {
const menuItem = await browser.$({
name: "hasEntry",
args: ["title", "ViewTitle"],
class: "androidx.test.espresso.matcher.ViewMatchers",
});
await menuItem.click();
const menuItem = await browser.$({
name: "hasEntry",
args: ["title", "ViewTitle"],
});
await menuItem.click();
});