# Локаторы

Локаторы: способ поиска элементов на странице. Поэтому они являются методами page

В VSC Ctrl+Click по методу выводит код метода.

<table border="1" id="bkmrk-%D0%9B%D0%BE%D0%BA%D0%B0%D1%82%D0%BE%D1%80-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-pag" style="border-collapse: collapse; width: 100%; height: 447.5px;"><colgroup><col style="width: 34.5834%;"></col><col style="width: 65.5358%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Локатор</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 80.1875px;"><td style="height: 80.1875px;">page.get\_by\_role('link', name="Docs")</td><td style="height: 80.1875px;">Поиск элемента по роли name - текст

link &lt;a&gt;

heading &lt;h&gt;

radio, checkbox, button

</td></tr><tr style="height: 191.531px;"><td style="height: 191.531px;">page.get\_by\_label("Email address")</td><td style="height: 191.531px;">Для выделения элементов, у которых есть привязанная метка. Например ```html
<div>
  <label for="exampleInputEmail1" class="form-label mt-4">Email address</label>
  <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
  <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
```

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">page.get\_by\_placeholder("Enter email")</td><td style="height: 29.7969px;">Поиск элементов по placeholder</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">page.get\_by\_text("Something", exact=False)</td><td style="height: 29.7969px;">Поиск по тексту. Exact=False ищет вхождение.</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">page.get\_by\_alt\_text(text)</td><td style="height: 29.7969px;">Поиск по атрибуту alt у изображений</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">page.get\_by\_title(text)</td><td style="height: 29.7969px;">Атрибут title</td></tr><tr style="height: 26.7969px;"><td style="height: 26.7969px;">page.locator(text)</td><td style="height: 26.7969px;">Поиск по CSS. Можно использовать tagname, classname, id, attribute/value

Примеры^

css=h1

footer

&lt;tagname&gt;.&lt;classname&gt; button.btn-outline-sucess

&lt;tagname&gt;#&lt;idname&gt; button#BtnGroupDrop1

&lt;tagname&gt;\[attribute\] input\[readonly\]

&lt;tagname&gt;\[attribute=somevalue\] input\[value='correct value'\]

</td></tr><tr><td>  
</td><td>Поиск по иерархии элементов.

Если через пробелы-то вложенные элементы. Если через точку - то у элемента несколько классов. Но они не обязательно непосредственно вложенные.

nav.bg-dark a.nav-link.active

Для непосредственного вложения:

nav.bg-dark &gt; a.nav-link.active

</td></tr><tr><td>  
</td><td>Называются sudo классами,

Класс и текст в теге. Для вхождения:

h1:text('Navbars')

Для полного соответствия:

h1:text-is('Navbars')

div.dropdown-menu:visible

Для определения по номеру вхождения, когда их много

 :nth-match(button.btn-primary, 4)

</td></tr><tr><td>  
</td><td>XPath

Абсолютный путь: xpath=/html/head/title

С любого начала: xpath=//h1/h2

С указанием атрибута xpath=//h1\[ @id='navbars' \]

</td></tr><tr><td>  
</td><td>Функции XPath

Для поиска по тексту, точно: //h1\[text()='Headling1'\]

Для поиска по тексту, содержит: //h1\[contains(text(), 'Headling1')\]

Для поиска по тексту, содержит: //h1\[contains(@class, 'btn')\]

</td></tr><tr><td>Множественные условия</td><td>Поиск родительского элемента

page.get\_by\_label("Email address").locator("..")

Фильтрация

page.get\_by\_role("heading").filter(has\_text="First")

По дочернему элементу

page.locator("div.form-group").filter(has=page.get\_by\_label("Password"))

</td></tr></tbody></table>

**Доступ к iframe**

```python
'''Test for auth module'''
import pytest
from playwright.sync_api import Browser, Page, expect

AUTH_URL = "https://wood.bobrobotirk.ru/auth"

@pytest.fixture
def page_and_auth(browser: Browser):
    context = browser.new_context(
        storage_state="playwright/.auth/vk.json"
        )
    page = context.new_page()
    yield page
    context.close()

def test_first(page_and_auth: Page):
    page_and_auth.goto(AUTH_URL)
    vkframe = page_and_auth.frame(url=lambda url: "id.vk.com" in url)

    if vkframe:
        authbutton = vkframe.get_by_role("button", name="Продолжить как")
        expect(authbutton, "Кнопка Продолжить как... отсутствует").to_be_visible(timeout=20000)
        authbutton.click()
        back_button = page_and_auth.get_by_role("button", name="Авторизация успешна")
        expect(back_button, "Сервис не произвел авторизацию").to_be_visible()
        back_button.click()
    else:
        assert False, "VK фрейм не найден."
```