Всех приветствую. Каких-то эксклюзивных материалов тут не будет. Просто, сам хочу более подробно разобраться в этом инструменте. В большинстве случаев за глаза хватает библиотеки Requests, но, иногда, необходимая информация на сайте появляется только после выполнения скриптов, в этих случаях без "эмулятора" браузера ничего не сделать... Ну, на мой непрофессиональный взгляд. В 4 версии Селениума много обновлений, а большинство русскоязычных материалов по 2 и 3 части этой программы (тут уж, библиотекой, язык не поворачивается назвать). Поэтому буду просто изучать официальные источники и интересные моменты переводить здесь.
Если у кого есть желание самому ознакомиться с данными источниками, то вот ссылки:
selenium.dev - официальный сайт
github.com - страничка на Гитхаб
pypi.org - страничка на PiPy (для линуксоидов)
Плейлист про возможности Селениум + Пайтен от канала PythonToday
На сайте Селениума можно увидеть информацию о том, что есть 3 ветви данной программы. Selenium WebDriver - управление браузером посредством большого множества языков программирования, Selenium IDE - планины для хрома и фаерфокса для автоматизации прямо через браузер, Selenium Grid - клиент-серверная система, которая позволяет Вам управлять веб-браузерами локально, или на других компьютерах, используя практически любой язык программирования.
В данный момент меня интересует именно Selenium WebDriver. Вот про него и продолжим.
Немного от себя. Необходимо изначально учитывать то, что для использования Селениума, на машине необходимо иметь памяти не менее 1 Гб!
Установка
Установку Selenium можно разделить на три этапа:
1) Установите библиотеку Selenium для нужного вамязыка программирования
Питон
Установка библиотек Selenium для Python может быть выполнена с помощью pip:
pip install selenium
В качестве альтернативы вы можете загрузить исходный архив PyPI (selenium-x.x.x.tar.gz) и установите его с помощью setup.py:
python setup.py install
2) Скачайте драйвер браузера для автоматизации вашего браузера и вашей системы
Для работы драйвера, его необходимо распаковать в папку со скриптом. Либо поместить драйвер в каталог, который уже указан в PATHсписке, либо поместить его в любой каталог и добавить путь к этому каталогу в PATHсписок.
Узнать адреса для Win можно перейдя в проводник => меню "Свойства" вкладки "Этот компьютер" в левом дереве каталогов => "Дополнительные параметры системы" => "Переменные среды"
Узнать адреса для LINUX можно командой:
echo $PATH
Установить новый адрес можно командой
export PATH=$PATH:/opt/local/bin
Узнать полный путь до текущей директории можно командой:
pwd
Но, для избежания лишних процессов в работе системы, лучше скопировать драйвер в уже прописанную директорию PATH
Если, при использовании гекодрайвера выводится ошибка Message: 'geckodriver' executable may have wrong permissions. То, необходимо файлу предоставить права на выполнение всем пользователям.
3) Соответственно, необходимо установить в систему непосредственно сам браузер
Мне более симпатичен Firefox, поэтому далее буду писать на его основе. Но, управление другими браузерами практически идентичны.
Для Винды - mozilla.org
Для Линукс - mozilla.org или
apt-get update
apt-get install firefox
Настройки
Общие настройки для всех браузеров
browserName:
Актуально только для Selenium Grid
browserVersion:
Актуально только для Selenium Grid
pageLoadStrategy:
При переходе на новую страницу по URL-адресу по умолчанию Selenium будет ждать, пока состояние готовности документа не станет “полным”. document. readyState Свойство документа описывает состояние загрузки текущего документа. По умолчанию WebDriver будет откладывать выполнение метода навигации (например, driver.navigate().get()) до тех пор, пока состояние готовности документа не будет complete. Это не обязательно означает, что страница завершила загрузку, особенно для сайтов, таких как одностраничные приложения, которые используют много JavaScript для динамической загрузки содержимого после завершения состояния готовности. Обратите также внимание, что это поведение не применяется к навигации, которая является результатом нажатия элемента или отправки формы.
Если загрузка страницы занимает много времени в результате загрузки ресурсов (например, изображений, css, js), которые не важны для автоматизации, вы можете изменить параметр по умолчанию normal на eager или none ускорить сеанс. Это значение применяется ко всему сеансу, поэтому убедитесь, что ваша стратегия ожидания достаточна для минимизации ошибок.
Стратегия загрузки страницы запрашивает document.readyState, как описано ниже:
СТРАТЕГИИ - Состояние Готовности - Примечания
normal - complete - Используется по умолчанию, ожидает загрузки всех ресурсов
Это заставит Selenium WebDriver ждать загрузки всей страницы. Если установлено значение "нормально", Selenium WebDriver ожидает, пока не будет возвращено событие загрузки.
По умолчанию нормальный установлен в браузер, если он не указан.
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.page_load_strategy = 'normal'
driver = webdriver.Chrome(options=options) driver.get("http://www.google.com")
driver.quit()
eager - interactive - Доступ к DOM готов, но другие ресурсы, такие как изображения, все еще могут загружаться
Это заставит Selenium WebDriver подождать, пока исходный HTML-документ не будет полностью загружен и проанализирован, и отменит загрузку таблиц стилей, изображений и подкадров.
Если задано значение eager, Selenium WebDriver ожидает, пока не будет возвращен запуск события DOMContentLoaded.
...
options.page_load_strategy = 'eager'
...
none - Any - Не блокирует WebDriver вообще
Если установлено значение none, веб-драйвер Selenium ожидает только загрузки начальной страницы.
...
options.page_load_strategy = 'none'
...
platformName
Актуально только для Selenium Grid
acceptInsecureCerts
Эта возможность проверяет, используется ли устаревший или недопустимый TLS Certificate (аналог SSL сертификата) во время навигации во время сеанса.
Если для этой функции установлено значение false, при обнаружении проблем с сертификатом домена при навигации будет возвращена ошибка небезопасного сертификата. Если установлено значение true, браузер будет доверять недействительному сертификату.
По умолчанию эта возможность будет доверять всем самозаверяющим сертификатам. После установки acceptInsecureCerts эта функция будет действовать в течение всего сеанса.
from selenium import webdriver
from selenium.common import exceptions
session = webdriver.Firefox(capabilities={"acceptInsecureCerts": True})
session.get("https://self-signed.badssl.com/")
print(session.current_url)
timeouts
Веб-драйвер session вводится с определенным session timeout интервалом, в течение которого пользователь может контролировать поведение при выполнении сценариев или получении информации из браузера.
Каждый тайм-аут сеанса настраивается с использованием комбинации различных timeouts параметров, как описано ниже:
Script Timeout:
Указывает, когда прерывать выполнение сценария в текущем контексте просмотра. Время ожидания по умолчанию 30 000 устанавливается при создании нового сеанса с помощью WebDriver.
Page Load Timeout:
Определяет интервал времени, в течение которого необходимо загрузить веб-страницу в текущем контексте просмотра. Тайм-аут по умолчанию 300 000 устанавливается при создании нового сеанса с помощью WebDriver. Если загрузка страницы ограничивает заданный/установленный по умолчанию временной интервал, скрипт будет остановлен исключением TimeoutException.
Implicit Wait Timeout
Это указывает время ожидания неявной стратегии расположения элементов при размещении элементов. Тайм-аут по умолчанию 0 устанавливается при создании нового сеанса с помощью WebDriver.
unhandledPromptBehavior
Определяет состояние текущего сеанса user prompt handler. По умолчанию используется отклонить и уведомить.
User Prompt Handler
Актуально только для Selenium Grid
setWindowRect
Эта команда изменяет размер и положение текущего контекстного окна просмотра. Эта команда действует как задатчик для getWindowRect команда, которая принимает ширина, высота, x, y как необязательный аргументы.
Во время автоматизации текущий контекст просмотра будет связан с состояниями окна, которые описывают видимость окна браузера. Состояния окна являются
- увеличенный - maximized
- сведено к минимуму - minimized
- Нормальный - normal
- полноэкранный - fullscreen
Установка ширины или высоты не гарантирует, что результирующий размер окна будет точно соответствовать запрошенному. Это связано с тем, что некоторые драйверы могут не иметь возможности изменять размер с шагом в один пиксель. Из-за этого выборка состояния/сведений окна getWindowRect может не соответствовать значениям, установленным в браузере.
strictFileInteractability
Эта новая возможность указывает, следует ли применять строгие проверки интерактивности к тип ввода=файл. Поскольку строгие проверки интерактивности по умолчанию отключены, поведение при использовании Элемент Отправить Ключи со скрытыми элементами управления загрузкой файлов
proxy
Прокси - сервер действует как посредник для запросов между клиентом и сервером. Проще говоря, трафик проходит через прокси-сервер на пути к запрошенному вами адресу и обратно.
Прокси - сервер для сценариев автоматизации с помощью Selenium может быть полезен для:
- Захват сетевого трафика
- Имитация внутренних вызовов, выполняемых веб-сайтом
- Доступ к требуемому веб-сайту осуществляется в соответствии со сложными сетевыми топологиями или строгими корпоративными ограничениями/политиками.
Если вы находитесь в корпоративной среде, и браузер не может подключиться к URL-адресу, скорее всего, это связано с тем, что для доступа к среде требуется прокси-сервер.
Selenium WebDriver предоставляет способ настройки прокси-сервера:
from selenium import webdriver
PROXY = "<HOST:PORT>" webdriver.DesiredCapabilities.FIREFOX['proxy'] = { "httpProxy": PROXY, "ftpProxy": PROXY, "sslProxy": PROXY, "proxyType": "MANUAL",
}
with webdriver.Firefox() as driver: driver.get("https://selenium.dev")
Возможности, специфичные для браузера Firefox
Headless
Короче говоря, Headless Browser - это веб-браузер без графического пользовательского интерфейса (GUI), который обычно управляется с помощью программирования или интерфейса командной строки. Необходим для серверов без графической оболочки и уменьшения нагрузки на компьютер с графическим интерфейсом.
from selenium.webdriver.firefox.options import Options
options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)
Настройка пользовательского профиля
Firefox сохраняет Вашу личную информацию, такую как закладки, пароли и личные настройки в наборе файлов называемом профилем, который хранится отдельно от программных файлов Firefox. Вы можете иметь несколько профилей, каждый из которых будет содержать свой собственный набор данных. С помощью менеджера профилей Вы можете создавать, удалять, переименовывать профили, а также переключаться между ними.
FirefoxProfile() устарел, и в selenium4 для использования пользовательского профиля необходимо использовать экземпляр Options.
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
profile_path = r'C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\y1uqp5mi.default'
options=Options()
options.set_preference('profile', profile_path)
service = Service(r'C:\WebDriver\bin\geckodriver.exe')
driver = Firefox(service=service, options=options)
driver.get("https://selenium.dev")
driver.quit()
Пример програмного прикручивания профиля.
Но, стоит облегчить себе жизнь и уменьшить код. Берём привязанный профиль и редактируем его ручками.... Потом опишу более подробно, а пока, полезные ссылки:
Получить информацию от браузера
Получить title открытого сайта
driver.title
Получить текущий URL-адрес
driver.current_url
Навигация по браузеру
Открыть ресурс
Первое, что вам захочется сделать после запуска браузера, - это открыть какой-то веб-сайт. Это может быть достигнуто в одной строке:
driver.get("https://selenium.dev")
Назад
Нажатие кнопки "Назад" браузера:
driver.back()
Вперед
Нажатие кнопки браузера вперед:
driver.forward()
Обновить:
Обновите текущую страницу:
driver.refresh()
Идентификация и работа с объектами элементов в DOM.
Способы идентификации одного или нескольких конкретных элементов в DOM.
Локатор - это способ идентификации элементов на странице. Это аргумент, передаваемый методам элемента поиска.
Ознакомьтесь с нашими рекомендуемыми методами тестирования, чтобы получить советы по локаторам, в том числе о том, что использовать, когда и почему объявлять локаторы отдельно от методов поиска.
Различные методы поиска элементов
driver.find_elements(By.XPATH, '//input') # выводит список найденных элементов
driver.find_element(By.XPATH, '//input') # Присваивает значение первого найденного элемента
Selenium обеспечивает поддержку этих традиционных стратегий определения местоположения в WebDriver:
ID = “id”
XPATH = “xpath”
NAME = “name”
TAG_NAME = “tag name”
CLASS_NAME = “class name”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
Скоро будет:
Примеры выбора элементов из HTML с использованием каждой стратегии локатора
Относительные локаторы
Селен 4 вводит Относительные локаторы (ранее называемые Дружественными локаторами). Эти локаторы полезны, когда нелегко создать локатор для нужного элемента, но легко описать пространственно, где элемент находится по отношению к элементу, который имеет легко сконструированный локатор.
Selenium использует функцию JavaScript getBoundingClientRect() для определения размера и положения элементов на странице и может использовать эту информацию для определения местоположения соседних элементов.
найдите относительные элементы.
Методы относительного локатора могут принимать в качестве аргумента для исходной точки либо ранее расположенную ссылку на элемент, либо другой локатор. В этих примерах мы будем использовать только локаторы, но вы можете поменять локатор в конечном методе на объект элемента, и он будет работать так же.
Давайте рассмотрим приведенный ниже пример для понимания относительных локаторов.
Доступные относительные локаторы
Если элемент текстового поля электронной почты по какой-либо причине нелегко идентифицировать, но элемент текстового поля пароля есть, мы можем найти элемент текстового поля, используя тот факт, что он является элементом “ввода” “над” элементом пароля.
email_locator = locate_with(By.TAG_NAME, "input").above({By.ID: "password"})
Если элемент текстового поля пароля по какой-либо причине нелегко идентифицировать, но элемент текстового поля электронной почты есть, мы можем найти элемент текстового поля, используя тот факт, что он является элементом “ввода” “под” элементом электронной почты.
password_locator = locate_with(By.TAG_NAME, "input").below({By.ID: "email"})
Left of
Если по какой-либо причине кнопку “отмена” нелегко идентифицировать, но элемент кнопки “отправить” есть, мы можем найти элемент кнопки "отмена", используя тот факт, что это элемент "кнопка" слева от элемента "отправить".
cancel_locator = locate_with(By.TAG_NAME, "button").to_left_of({By.ID: "submit"})
Right of
Если по какой-либо причине кнопку “отправить” нелегко идентифицировать, но элемент кнопки “отмена” есть, мы можем найти элемент кнопки "отправить", используя тот факт, что это элемент "кнопка" справа от элемента "отмена".
submit_locator = locate_with(By.TAG_NAME, "button").to_right_of({By.ID: "cancel"})
Если относительное расположение не очевидно или оно зависит от размера окна, вы можете использовать метод near для идентификации элемента, который находится на расстоянии не более 50 пикселей от предоставленного локатора. Одним из отличных вариантов использования для этого является работа с элементом формы, у которого нет легко построенного локатора, но есть связанный с ним элемент метки ввода.
email_locator = locate_with(By.TAG_NAME, "input").near({By.ID: "lbl-email"})
Объединение в цепочку относительных локаторов
Вы также можете подключить локаторы, если это необходимо. Иногда элемент легче всего идентифицировать как находящийся как над/под одним элементом, так и справа/слева от другого.
submit_locator = locate_with(By.TAG_NAME, "button").below({By.ID: "email"}.to_right_of({By.ID: "cancel"})
Определение местоположения элементов на основе предоставленных значений локатора.
Одним из наиболее фундаментальных аспектов использования Selenium является получение ссылок на элементы для работы. Selenium предлагает ряд встроенных стратегий определения местоположения для уникальной идентификации элемента. Существует множество способов использования локаторов в очень сложных сценариях. Для целей этой документации давайте рассмотрим этот фрагмент HTML-кода:
<ol id="vegetables">
<li class="potatoes">…
<li class="onions">…
<li class="tomatoes"><span>Tomato is a Vegetable</span>…
</ol>
<ul id="fruits">
<li class="bananas">…
<li class="apples">…
<li class="tomatoes"><span>Tomato is a Fruit</span>…
</ul>
Первый соответствующий элемент
Многие локаторы будут соответствовать нескольким элементам на странице. Метод сингулярного поиска элемента вернет ссылку на первый элемент, найденный в данном контексте.
Оценка всего DOM
Когда в экземпляре драйвера вызывается метод find element, он возвращает ссылку на первый элемент в DOM, который совпадает с предоставленным локатором. Это значение можно сохранить и использовать для будущих действий с элементом. В нашем примере HTML выше есть два элемента с именем класса “помидоры”, поэтому этот метод вернет элемент в списке “овощи”.
vegetable = driver.find_element(By.CLASS_NAME, "tomatoes")
В случае, если название индификатора имеет в себе пробелы, то поиск индификатора можно вести по части названия без пробелов (пробелы выводят ошибку в коде). Например, имеем в коде
<span class="drjCHn cewJyj">Нужная информация</span>
Мы можем вести поиск элемента данным методом:
vegetable = driver.find_element(By.CLASS_NAME, "cewJyj")
Оценка подмножества DOM
Вместо того, чтобы находить уникальный локатор во всем DOM, часто бывает полезно сузить область поиска до другого расположенного элемента. В приведенном выше примере есть два элемента с именем класса “помидоры”, и получить ссылку на второй элемент немного сложнее.
Одно из решений состоит в том, чтобы найти элемент с уникальным атрибутом, который является предком нужного элемента, а не предком нежелательного элемента, а затем вызвать find элемент для этого объекта:
fruits = driver.find_element(By.ID, "fruits")
fruit = fruits.find_elements_by_id("tomatoes")
Java и C#
Классы WebDriver, WebElement и shadowRoot реализуют интерфейс SearchContext, который считается интерфейсом на основе ролей. Интерфейсы на основе ролей позволяют определить, поддерживает ли конкретная реализация драйвера данную функцию. Эти интерфейсы четко определены и стараются придерживаться только одной ответственной роли.
Оптимизированный локатор
Вложенный поиск может быть не самой эффективной стратегией определения местоположения, поскольку для этого браузеру необходимо выполнить две отдельные команды.
Чтобы немного повысить производительность, мы можем использовать CSS или XPath для поиска этого элемента в одной команде. Смотрите предложения по стратегии поиска в нашем разделе "Рекомендуемые методы тестирования".
В этом примере мы будем использовать селектор CSS:
fruit = driver.find_element_by_css_selector("fruits .tomatoes")
Все соответствующие элементы
Существует несколько вариантов использования для получения ссылок на все элементы, соответствующие локатору, а не только на первый. Методы множественного числа find elements возвращают коллекцию ссылок на элементы. Если совпадений нет, возвращается пустой список. В этом случае ссылки на все товары из списка фруктов и овощей будут возвращены в коллекции.
plants = driver.find_elemnts(By.TAG_NAME, "li")
Получить элемент
Часто вы получаете коллекцию элементов, но хотите работать с определенным элементом, а это значит, что вам нужно перебрать коллекцию и определить тот, который вам нужен.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
# Navigate to Url
driver.get("https://www.example.com")
# Get all the elements available with tag name 'p'
elements = driver.find_elements(By.TAG_NAME, 'p')
for e in elements:
print(e.text)
Находить Элементы Из Элемента
Он используется для поиска списка соответствующих дочерних веб-элементов в контексте родительского элемента. Для достижения этой цели родительский веб-элемент связан с помощью "findElements" для доступа к дочерним элементам
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# Get element with tag name 'div'
element = driver.find_element(By.TAG_NAME, 'div')
# Get all the elements available with tag name 'p'
elements = element.find_elements(By.TAG_NAME, 'p')
for e in elements:
print(e.text)
++++++++++++++++++++++++
Предупреждения, подсказки и подтверждения JavaScript
WebDriver предоставляет API для работы с тремя типами собственных всплывающих сообщений, предлагаемых JavaScript. Эти всплывающие окна оформлены браузером и предлагают ограниченную настройку.
Alerts
Самый простой из них называется предупреждением, которое отображает пользовательское сообщение, и единственной кнопкой, которая отклоняет предупреждение, помеченное в большинстве браузеров как "ОК". Его также можно отключить в большинстве браузеров, нажав кнопку "Закрыть", но это всегда будет делать то же самое, что и кнопка "ОК". См. Пример предупреждения.
WebDriver может получить текст из всплывающего окна и принять или отклонить эти предупреждения.
# Нажмите на ссылку, чтобы активировать оповещение
driver.find_element(By.LINK_TEXT, "See an example alert").click()
# Дождитесь отображения предупреждения и сохраните его в переменной
alert = wait.until(expected_conditions.alert_is_present())
# Сохраните текст предупреждения в переменной
text = alert.text
# Нажмите кнопку "ОК"
alert.accept()
Confirm
Окно подтверждения похоже на предупреждение, за исключением того, что пользователь также может отменить сообщение. Смотрите подтверждение образца.
В этом примере также показан другой подход к хранению предупреждения:
# Нажмите на ссылку, чтобы активировать оповещение
driver.find_element(By.LINK_TEXT, "See a sample confirm").click()
# Дождитесь отображения предупреждения
wait.until(expected_conditions.alert_is_present())
# Сохраните предупреждение в переменной для повторного использования
alert = driver.switch_to.alert
# Сохраните текст предупреждения в переменной
text = alert.text
# Нажмите кнопку "Отмена"
alert.dismiss()
Prompt
Подсказки аналогичны полям подтверждения, за исключением того, что они также включают ввод текста. Аналогично работе с элементами формы, вы можете использовать ключи отправки WebDriver для заполнения ответа. Это полностью заменит текст-заполнитель. Нажатие кнопки "Отмена" не приведет к отправке какого-либо текста. См. Пример приглашения.
# Нажмите на ссылку, чтобы активировать оповещение
driver.find_element(By.LINK_TEXT, "See a sample prompt").click()
# Дождитесь отображения предупреждения
wait.until(expected_conditions.alert_is_present())
# Дождитесь отображения предупреждения
alert = Alert(driver)
# Введите свое сообщение
alert.send_keys("Selenium")
# Нажмите кнопку "ОК"
alert.accept()
Работа с файлами cookie
Файл cookie - это небольшой фрагмент данных, который отправляется с веб-сайта и хранится на вашем компьютере. Файлы cookie в основном используются для распознавания пользователя и загрузки сохраненной информации.
API WebDriver предоставляет способ взаимодействия с файлами cookie с помощью встроенных методов:
Add Cookie
Он используется для добавления файла cookie в текущий контекст просмотра. Добавить файл cookie принимает только набор определенных сериализуемых объектов JSON. Вот ссылка на список принятых значений ключа JSON
Прежде всего, вы должны быть на домене, для которого будет действителен файл cookie. Если вы пытаетесь установить файлы cookie до того, как начнете взаимодействовать с сайтом, а ваша домашняя страница большая / загрузка занимает некоторое время, альтернативой является поиск страницы меньшего размера на сайте (обычно страница 404 маленькая, например http://example.com/some404page )
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
# Добавляет файл cookie в текущий контекст браузера
driver.add_cookie({"name": "key", "value": "value"})
Get Named Cookie
Он возвращает сериализованные данные файлов cookie, совпадающие с именем файла cookie среди всех связанных файлов cookie.
from selenium import webdriver
driver = webdriver.Chrome()
# Перейдите по URL-адресу
driver.get("http://www.example.com")
# Добавляет файл cookie в текущий контекст браузера
driver.add_cookie({"name": "foo", "value": "bar"})
# Получите подробную информацию о файлах cookie с помощью именованного файла cookie "foo"
print(driver.get_cookie("foo"))
Get All Cookies
Он возвращает "успешно сериализованные данные файлов cookie" для текущего контекста просмотра. Если браузер больше недоступен, он возвращает ошибку.
from selenium import webdriver
driver = webdriver.Chrome()
# Перейдите по URL-адресу
driver.get("http://www.example.com")
driver.add_cookie({"name": "test1", "value": "cookie1"}) driver.add_cookie({"name": "test2", "value": "cookie2"})
# Получить все доступные файлы cookie
print(driver.get_cookies())
Delete Cookie
Он удаляет данные файла cookie, совпадающие с указанным именем файла cookie.
from selenium import webdriver
driver = webdriver.Chrome()
# Перейдите по URL-адресу
driver.get("http://www.example.com")
driver.add_cookie({"name": "test1", "value": "cookie1"})
driver.add_cookie({"name": "test2", "value": "cookie2"})
# Удалить файл cookie с именем "test1"
driver.delete_cookie("test1")
Delete All Cookies
Он удаляет все файлы cookie текущего контекста просмотра.
from selenium import webdriver
driver = webdriver.Chrome()
# Перейдите по URL-адресу
driver.get("http://www.example.com")
driver.add_cookie({"name": "test1", "value": "cookie1"}) driver.add_cookie({"name": "test2", "value": "cookie2"})
# Удаляет все файлы cookie
driver.delete_all_cookies()
Same-Site Cookie Attribute
Это позволяет пользователю указывать браузерам контролировать, отправляются ли файлы cookie вместе с запросом, инициированным сторонними сайтами. Он введен для предотвращения атак CSRF (Подделка межсайтовых запросов).
Атрибут cookie одного и того же сайта принимает два параметра в качестве инструкций
Strict
Если для атрибута SameSite установлено значение Strict, файл cookie не будет отправляться вместе с запросами, инициированными сторонними веб-сайтами.
Lax
Когда вы устанавливаете для атрибута того же сайта cookie значение Lax, файл cookie будет отправлен вместе с запросом GET, инициированным сторонним веб-сайтом.
Примечание: На данный момент эта функция доступна в Chrome (версия 80+), Firefox (версия 79+) и работает с Selenium 4 и более поздними версиями.
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
# Добавляет файл cookie в текущий контекст браузера с тем же сайтом 'Strict' (or) 'Lax'
driver.add_cookie({"name": "foo", "value": "value", 'sameSite': 'Strict'}) driver.add_cookie({"name": "foo1", "value": "value", 'sameSite': 'Lax'}) cookie1 = driver.get_cookie('foo') cookie2 = driver.get_cookie('foo1') print(cookie1)
print(cookie2)
Работа с iFrames и фреймами
Фреймы - это устаревшее средство создания макета сайта из нескольких документов в одном домене. Вы вряд ли будете работать с ними, если не работаете с веб-приложением до HTML5. Фреймы Iframe позволяют вставлять документ из совершенно другого домена и по-прежнему широко используются.
Если вам нужно работать с фреймами или iframes, WebDriver позволяет вам работать с ними таким же образом. Рассмотрим кнопку внутри iframe. Если мы проверим элемент с помощью инструментов разработки браузера, мы можем увидеть следующее:
<div id="modal">
<iframe id="buttonframe" name="myframe" src="https://seleniumhq.github.io">
<button>Click here</button>
</iframe>
</div>
Если бы не iframe, мы ожидали бы нажать на кнопку, используя что-то вроде:
driver.find_element(By.TAG_NAME, 'button').click()
Однако, если за пределами iframe нет кнопок, вместо этого вы можете получить сообщение об ошибке "такого элемента нет". Это происходит потому, что Selenium знает только об элементах в документе верхнего уровня. Чтобы взаимодействовать с кнопкой, нам нужно будет сначала переключиться на рамку, аналогично тому, как мы переключаем окна. WebDriver предлагает три способа переключения на кадр.
Using a WebElement
Переключение с помощью веб-элемента является наиболее гибким вариантом. Вы можете найти нужный кадр с помощью выбранного вами селектора и переключиться на него.
# Хранить веб-элемент iframe
iframe = driver.find_element(By.CSS_SELECTOR, "modal > iframe")
# переключиться на выбранный iframe
driver.switch_to.frame(iframe)
# Теперь нажмите на кнопку
driver.find_element(By.TAG_NAME, 'button').click()
Using a name or ID
Если у вашего фрейма или iframe есть атрибут id или name, его можно использовать вместо этого. Если имя или идентификатор на странице не уникальны, то будет переключен на первый найденный.
# Переключать кадр по идентификатору
driver.switch_to.frame('buttonframe')
# Теперь нажмите на кнопку
driver.find_element(By.TAG_NAME, 'button').click()
Using an index
Также можно использовать индекс фрейма, например, который можно запросить с помощью window.frames в JavaScript.
# переключение на второй iframe на основе индекса
iframe = driver.find_elements_by_tag_name('iframe')[1]
# переключиться на выбранный iframe
driver.switch_to.frame(iframe)
Leaving a frame
Чтобы оставить iframe или набор фреймов, вернитесь к содержимому по умолчанию, например:
# вернуться к содержимому по умолчанию
driver.switch_to.default_content()
Работа с окнами и вкладками
Get window handle
WebDriver не делает различия между окнами и вкладками. Если ваш сайт открывает новую вкладку или окно, Selenium позволит вам работать с ним с помощью дескриптора окна. Каждое окно имеет уникальный идентификатор, который остается постоянным в течение одного сеанса. Вы можете получить дескриптор окна текущего окна с помощью:
print(browser.current_window_handle)
Переключение окон или вкладок
Нажатие на ссылку, которая открывается в новом окне, сфокусирует новое окно или вкладку на экране, но WebDriver не будет знать, какое окно операционная система считает активным. Для работы с новым окном вам нужно будет переключиться на него. Если у вас открыто только две вкладки или окна, и вы знаете, с какого окна вы начинаете, в процессе исключения вы можете перебрать оба окна или вкладки, которые может видеть WebDriver, и переключиться на то, которое не является исходным.
Однако Selenium 4 предоставляет новый api NewWindow, который создает новую вкладку (или) новое окно и автоматически переключается на него.
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Firefox() as driver: driver.get("https://seleniumhq.github.io") # Открыть URL-адрес
wait = WebDriverWait(driver, 10) # Настройка отложена на потом
original_window = driver.current_window_handle # Сохраните идентификатор исходного окна
assert len(driver.window_handles) == 1 # Проверьте, у нас еще не открыты другие окна
driver.find_element(By.LINK_TEXT, "new window").click() # Нажмите на ссылку, которая откроется в новом окне wait.until(EC.number_of_windows_to_be(2)) # Дождитесь появления нового окна или вкладки
for window_handle in driver.window_handles: # Перебирайте до тех пор, пока мы не найдем новый дескриптор окна
if window_handle != original_window: driver.switch_to.window(window_handle)
break
# Подождите, пока новая вкладка завершит загрузку содержимого wait.until(EC.title_is("SeleniumHQ Browser Automation"))
Create new window (or) new tab and switch
Создает новое окно (или) вкладку и фокусирует новое окно или вкладку на экране. Вам не нужно переключаться на работу с новым окном (или) вкладкой. Если у вас открыто более двух окон (или) вкладок, отличных от нового окна, вы можете просмотреть оба окна или вкладки, которые может видеть WebDriver, и переключиться на то, которое не является исходным.
Примечание: Эта функция работает с Selenium 4 и более поздними версиями.
# Открывает новую вкладку и переключается на новую вкладку
driver.switch_to.new_window('tab')
# Открывает новое окно и переключается в новое окно
driver.switch_to.new_window('window')
Closing a window or tab
Когда вы закончите с окном или вкладкой, и это не последнее окно или вкладка, открытые в вашем браузере, вам следует закрыть их и вернуться к окну, которое вы использовали ранее. Предполагая, что вы следовали примеру кода в предыдущем разделе, у вас будет предыдущий дескриптор окна, сохраненный в переменной. Сложите это вместе, и вы получите:
# Закройте вкладку или окно
driver.close()
# Вернитесь к старой вкладке или окну
driver.switch_to.window(original_window)
Quitting the browser at the end of a session
Когда вы закончите сеанс браузера, вам следует позвонить quit, а не закрывать:
driver.quit()
quit будет:
- Закройте все окна и вкладки, связанные с этим сеансом WebDriver
- Закройте процесс браузера
- Закройте фоновый процесс драйвера
- Уведомить Selenium Grid о том, что браузер больше не используется, чтобы его можно было использовать в другом сеансе (если вы используете Selenium Grid)
Неспособность вызвать quit приведет к тому, что на вашем компьютере будут запущены дополнительные фоновые процессы и порты, что впоследствии может вызвать проблемы.
Некоторые тестовые платформы предлагают методы и аннотации, к которым вы можете подключиться, чтобы удалить их в конце теста.
# unittest teardown
# https://docs.python.org/3/library/unittest.html?highlight=teardown#unittest.TestCase.tearDown
def tearDown(self):
self.driver.quit()
Если вы не используете WebDriver в контексте тестирования, вы можете рассмотреть возможность использования try / finally, который предлагается большинством языков, чтобы исключение все равно очистило сеанс WebDriver.
try:
# WebDriver code here...
finally:
driver.quit()
WebDriver Python теперь поддерживает диспетчер контекста python, который при использовании ключевого слова with может автоматически завершить работу с драйвером в конце выполнения.
with webdriver.Firefox() as driver:
# WebDriver code here...
# WebDriver автоматически завершит работу после отступа
Управление окнами
Разрешение экрана может повлиять на то, как отображается ваше веб-приложение, поэтому WebDriver предоставляет механизмы для перемещения и изменения размера окна браузера.
Get window size
Извлекает размер окна браузера в пикселях.
# Access each dimension individually
width = driver.get_window_size().get("width")
height = driver.get_window_size().get("height")
# Or store the dimensions and query them later
size = driver.get_window_size()
width1 = size.get("width")
height1 = size.get("height")
Set window size
Восстанавливает окно и устанавливает размер окна.
driver.set_window_size(1024, 768)
Получить положение окна
Извлекает координаты верхней левой координаты окна браузера.
# Доступ к каждому измерению в отдельности
x = driver.get_window_position().get('x')
y = driver.get_window_position().get('y')
# Или сохраните размеры и запросите их позже
position = driver.get_window_position()
x1 = position.get('x')
y1 = position.get('y')
Установить положение окна
Перемещает окно в выбранное положение.
driver.set_window_position(0, 0)
Развернуть окно
Увеличивает окно. В большинстве операционных систем окно заполняет весь экран, не блокируя собственные меню и панели инструментов операционной системы.
driver.maximize_window()
Свернуть окно
Сворачивает окно текущего контекста просмотра. Точное поведение этой команды зависит от отдельных оконных менеджеров.
Свернуть окно обычно скрывает окно в системном трее.
Примечание: Эта функция работает с Selenium 4 и более поздними версиями.
driver.minimize_window()
Полноэкранное окно
Заполняет весь экран, аналогично нажатию клавиши F11 в большинстве браузеров.
driver.fullscreen_window()
Сделайте снимок экрана
Используется для захвата скриншота для текущего контекста просмотра. Снимок экрана конечной точки WebDriver возвращает снимок экрана, который закодирован в формате Base64.
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
# Возвращает строку в кодировке base64 в изображение driver.save_screenshot('./image.png')
driver.quit()
Снимок экрана takeэлемента
Используется для захвата снимка экрана элемента для текущего контекста просмотра. Снимок экрана конечной точки WebDriver возвращает снимок экрана, который закодирован в формате Base64.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.example.com")
ele = driver.find_element(By.CSS_SELECTOR, 'h1')
# Возвращает строку в кодировке base64 в изображение
ele.screenshot('./image.png')
driver.quit()
Выполнить сценарий
Выполняет фрагмент кода JavaScript в текущем контексте выбранного фрейма или окна.
# Stores the header element
header = driver.find_element(By.CSS_SELECTOR, "h1")
# Executing JavaScript to capture innerText of header element driver.execute_script('return arguments[0].innerText', header)
Страница печати
Печатает текущую страницу в браузере.
Примечание: Для этого требуется, чтобы браузеры Chromium находились в безголовом режиме
from selenium.webdriver.common.print_page_options import PrintOptions
print_options = PrintOptions()
print_options.page_ranges = ['1-2']
driver.get("printPage.html")
base64code = driver.print_page(print_options)
+++++++++++++++++++++++++++++++
Получить Активный Элемент
Он используется для отслеживания (или) поиска элемента DOM, который находится в центре внимания в текущем контексте просмотра.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.google.com")
driver.find_element(By.CSS_SELECTOR, '[name="q"]').send_keys("webElement")
# Get attribute of current active element
attr = driver.switch_to.active_element.get_attribute("title")
print(attr)
Что вы можете узнать об элементе.
Is Displayed
Is Enabled
Этот метод используется для проверки того, включен или отключен подключенный элемент на веб-странице. Возвращает логическое значение, True, если подключенный элемент включен в текущем контексте просмотра, в противном случае возвращает false.
# Navigate to url
driver.get("http://www.google.com")
# Returns true if element is enabled else returns false
value = driver.find_element(By.NAME, 'btnK').is_enabled()
Is Selected
Этот метод определяет, выбран ли элемент, на который ссылается ссылка, или нет. Этот метод широко используется для флажков, переключателей, элементов ввода и элементов опций.
Возвращает логическое значение, True, если элемент, на который ссылается ссылка, выбран в текущем контексте просмотра, в противном случае возвращает false.
# Navigate to url
driver.get("https://the-internet.herokuapp.com/checkboxes")
# Returns true if element is checked else returns false
value = driver.find_element(By.CSS_SELECTOR, "input[type='checkbox']:first-of-type").is_selected()
Tag Name
Он используется для извлечения имени тега ссылочного элемента, который находится в фокусе в текущем контексте просмотра.
# Navigate to url
driver.get("https://www.example.com")
# Returns TagName of the element
attr = driver.find_element(By.CSS_SELECTOR, "h1").tag_name
Size and Position
Он используется для получения размеров и координат ссылочного элемента.
Извлеченный текст данных содержит следующие сведения:
Положение оси X от верхнего левого угла элемента
положение по оси y от верхнего левого угла элемента
Высота элемента
Ширина элемента
# Navigate to url
driver.get("https://www.example.com")
# Returns height, width, x and y coordinates referenced element
res = driver.find_element(By.CSS_SELECTOR, "h1").rect
Получить значение CSS
Извлекает значение указанного свойства вычисляемого стиля элемента в текущем контексте просмотра.
# Navigate to Url
driver.get('https://www.example.com')
# Retrieves the computed style property 'color' of linktext
cssValue = driver.findElement(By.LINK_TEXT, "More information...").value_of_css_property('color')
Текстовое Содержимое
Извлекает отображенный текст указанного элемента.
# Navigate to url
driver.get("https://www.example.com")
# Retrieves the text of the element
text = driver.find_element(By.CSS_SELECTOR, "h1").text
Работа с элементами списка выбора
Списки выбора имеют особое поведение по сравнению с другими элементами.
Для автоматизации выбора элементов может потребоваться довольно много кода котельной плиты. Чтобы уменьшить это и сделать ваши тесты более чистыми, в пакете поддержки Selenium есть класс Select. Чтобы использовать его, вам понадобится следующая инструкция импорта:
from selenium.webdriver.support.select import Select
Затем вы сможете создать объект Select с помощью WebElement, который ссылается на элемент <select>.
select_element = driver.find_element(By.ID,'selectElementID')
select_object = Select(select_element)
Объект выбора теперь предоставит вам ряд команд, которые позволят вам взаимодействовать с элементом <select>. Прежде всего, существуют различные способы выбора опции из элемента <select>.
<select>
<option value=value1>Bread</option>
<option value=value2 selected>Milk</option>
<option value=value3>Cheese</option>
</select>
Есть три способа выбрать первый вариант из приведенного выше элемента:
# Select an <option> based upon the <select> element's internal index
select_object.select_by_index(1)
# Select an <option> based upon its value attribute
select_object.select_by_value('value1')
# Select an <option> based upon its text
select_object.select_by_visible_text('Bread')
Затем вы можете проверить, какие параметры выбраны с помощью:
# Return a list[WebElement] of options that have been selected
all_selected_options = select_object.all_selected_options
# Return a WebElement referencing the first selection option found by walking down the DOM
first_selected_option = select_object.first_selected_option
Или вам может быть просто интересно, какие элементы <option> содержит элемент <select>:
# Return a list[WebElement] of options that the <select> element contains
all_available_options = select_object.options
Если вы хотите отменить выбор каких-либо элементов, теперь у вас есть четыре варианта:
# Deselect an <option> based upon the <select> element's internal index
select_object.deselect_by_index(1)
# Deselect an <option> based upon its value attribute
select_object.deselect_by_value('value1')
# Deselect an <option> based upon its text
select_object.deselect_by_visible_text('Bread')
# Deselect all selected <option> elements
select_object.deselect_all()
Наконец, некоторые элементы <select> позволяют выбрать более одного параметра. Вы можете узнать, является ли ваш элемент <select> одним из них, используя:
does_this_allow_multiple_selections = select_object.is_multiple
Удаленный веб-драйвер
Вы можете использовать WebDriver удаленно так же, как вы бы использовали его локально. Основное отличие заключается в том, что удаленный WebDriver необходимо настроить так, чтобы он мог запускать ваши тесты на отдельной машине.
Удаленный веб-драйвер состоит из двух частей: клиента и сервера. Клиент - это ваш тест WebDriver, а сервер - это просто Java-сервлет, который может быть размещен на любом современном сервере приложений JEE.
Чтобы запустить удаленный клиент WebDriver, нам сначала нужно подключиться к RemoteWebDriver. Мы делаем это, указывая URL-адрес на адрес сервера, на котором выполняются наши тесты. Чтобы настроить нашу конфигурацию, мы устанавливаем желаемые возможности.…
ожидание
Обычно можно сказать, что WebDriver имеет блокирующий API. Поскольку это внепроцессная библиотека, которая инструктирует браузер, что делать, и поскольку веб-платформа имеет внутреннюю асинхронную природу, WebDriver не отслеживает активное состояние DOM в реальном времени. Это связано с некоторыми проблемами, которые мы обсудим здесь.
По опыту, большинство периодических проблем, возникающих при использовании Selenium и WebDriver, связаны с условиями гонки, возникающими между браузером и инструкциями пользователя. Примером может быть то, что пользователь указывает браузеру перейти на страницу, а затем при попытке найти элемент выдает ошибку "такого элемента нет".
Рассмотрим следующий…
<!doctype html>
<meta charset=utf-8>
<title>Race Condition Example</title>
<script>
var initialised = false;
window.addEventListener("load", function() {
var newElement = document.createElement("p");
newElement.textContent = "Hello from JavaScript!";
document.body.appendChild(newElement);
initialised = true;
});
</script>
Инструкции WebDriver могут выглядеть достаточно невинно:
driver.navigate("file:///race_condition.html")
el = driver.find_element(By.TAG_NAME, "p")
assert el.text == "Hello from JavaScript!"
Проблема здесь в том, что стратегия загрузки страницы по умолчанию, используемая в WebDriver, прослушивает состояние document.readyState для изменения на "завершить" перед возвратом из вызова для навигации. Поскольку элемент p добавляется после завершения загрузки документа, этот сценарий WebDriver может работать с перебоями. Это “может” быть прерывистым, потому что нельзя дать никаких гарантий в отношении элементов или событий, которые запускаются асинхронно без явного ожидания — или блокировки — этих событий.
К счастью, обычный набор команд, доступный в интерфейсе WebElement, такой как WebElement.click и WebElement.SendKeys, гарантированно будет синхронным, поскольку вызовы функций не будут возвращаться (или обратный вызов не будет запускаться на языках в стиле обратного вызова), пока команда не будет завершена в браузере. API-интерфейсы расширенного взаимодействия с пользователем, клавиатура и мышь, являются исключениями, поскольку они явно предназначены для асинхронных команд “делай, что я говорю".
Ожидание - это когда автоматическое выполнение задачи проходит определенное количество времени, прежде чем перейти к следующему шагу.
Чтобы решить проблему, связанную с условиями гонки между браузером и вашим сценарием WebDriver, большинство клиентов Selenium поставляются с пакетом ожидания. При использовании ожидания вы используете то, что обычно называют явным ожиданием.
Явное ожидание
Явные ожидания доступны клиентам Selenium для императивных процедурных языков. Они позволяют вашему коду останавливать выполнение программы или замораживать поток до тех пор, пока не будет выполнено переданное вами условие. Условие вызывается с определенной частотой до тех пор, пока не истечет время ожидания. Это означает, что до тех пор, пока условие возвращает ложное значение, оно будет продолжать пытаться и ждать.
Поскольку явные ожидания позволяют вам дождаться выполнения условия, они хорошо подходят для синхронизации состояния между браузером и его DOM и вашим сценарием WebDriver.
Чтобы исправить наш ошибочный набор инструкций из предыдущих, мы могли бы использовать ожидание, чтобы вызов findElement подождал, пока динамически добавляемый элемент из скрипта не будет добавлен в DOM:
from selenium.webdriver.support.ui import WebDriverWait
def document_initialised(driver):
return driver.execute_script("return initialised")
driver.navigate("file:///race_condition.html")
WebDriverWait(driver).until(document_initialised)
el = driver.find_element(By.TAG_NAME, "p")
assert el.text == "Hello from JavaScript!"
Мы передаем условие в качестве ссылки на функцию, что ожидание будет выполняться повторно до тех пор, пока его возвращаемое значение не будет истинным. “Правдивое” возвращаемое значение - это все, что оценивается как логическое значение true на данном языке, например строка, число, логическое значение, объект (включая веб-элемент) или заполненная (непустая) последовательность или список. Это означает, что пустой список оценивается как false. Когда условие выполняется верно и блокирующее ожидание прерывается, возвращаемое значение из условия становится возвращаемым значением ожидания.
Обладая этими знаниями и поскольку утилита ожидания по умолчанию не игнорирует ошибки таких элементов, мы можем переработать наши инструкции, чтобы они были более краткими:
from selenium.webdriver.support.ui import WebDriverWait
driver.navigate("file:///race_condition.html")
el = WebDriverWait(driver).until(lambda d: d.find_element_by_tag_name("p"))
assert el.text == "Hello from JavaScript!"
В этом примере мы передаем анонимную функцию (но мы также могли бы определить ее явно, как мы делали ранее, чтобы ее можно было использовать повторно). Первый и единственный аргумент, который передается нашему условию, всегда является ссылкой на наш объект драйвера, WebDriver. В многопоточной среде следует быть осторожным при работе со ссылкой на драйвер, переданной в условие, а не со ссылкой на драйвер во внешней области.
Поскольку ожидание не будет проглатывать такие ошибки элемента, которые возникают, когда элемент не найден, условие будет повторяться до тех пор, пока элемент не будет найден. Затем он примет возвращаемое значение, веб-элемент, и передаст его обратно в наш скрипт.
Если условие не выполняется, например, правдивое возвращаемое значение из условия никогда не достигается, ожидание вызовет/вызовет ошибку/исключение, называемое ошибкой тайм-аута
Options
Условие ожидания может быть настроено в соответствии с вашими потребностями. Иногда нет необходимости ждать полного времени ожидания по умолчанию, так как штраф за невыполнение условия успешного выполнения может быть дорогостоящим.
Ожидание позволяет вам передать аргумент для переопределения времени ожидания:
WebDriverWait(driver, timeout=3).until(some_condition)
Ожидаемые условия
Поскольку необходимость синхронизации DOM и ваших инструкций является довольно распространенным явлением, большинство клиентов также имеют набор предопределенных ожидаемых условий. Как может быть очевидно из названия, это условия, которые предопределены для частых операций ожидания.
Условия, доступные в разных языковых привязках, различаются, но это неполный список из нескольких:
- alert is present
- element exists
- element is visible
- title contains
- title is
- element staleness
- visible text
Вы можете обратиться к документации API для каждой привязки клиента, чтобы найти исчерпывающий список ожидаемых условий:
Python’s selenium.webdriver.support.expected_conditions class
Скрытое ожидание
Существует второй тип ожидания, который отличается от явного ожидания, называемого неявным ожиданием. Неявно ожидая, WebDriver опрашивает DOM в течение определенного времени при попытке найти какой-либо элемент. Это может быть полезно, когда определенные элементы на веб-странице недоступны сразу и для загрузки требуется некоторое время.
Неявное ожидание появления элементов по умолчанию отключено, и его необходимо будет включать вручную для каждого сеанса. Смешивание явных ожиданий и неявных ожиданий приведет к непреднамеренным последствиям, а именно к ожиданию в режиме ожидания в течение максимального времени, даже если элемент доступен или условие истинно.
Предупреждение: Не смешивайте явные и неявные ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может привести к истечению времени ожидания через 20 секунд.
Неявное ожидание состоит в том, чтобы указать WebDriver опрашивать DOM в течение определенного промежутка времени при попытке найти элемент или элементы, если они недоступны немедленно. Значение по умолчанию равно 0, что означает отключено. После установки неявное ожидание устанавливается на весь срок действия сеанса.
driver = Firefox()
driver.implicitly_wait(10)
driver.get("http://somedomain/url_that_delays_loading")
my_dynamic_element = driver.find_element(By.ID, "myDynamicElement")
Свободное ожидание
Экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки условия.
Пользователи могут настроить ожидание, чтобы игнорировать определенные типы исключений во время ожидания, такие как исключение NoSuchElementException при поиске элемента на странице.
driver = Firefox()
driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))
API действий
Продолжение - https://www.selenium.dev/documentation/webdriver/actions_api/
Полезные ссылки:
АВТОМАТИЗИРОВАННОЕ ТЕСТИРОВАНИЕ С НУЛЯ | PYTHON + SELENIUM
Необходим более детальное изучение:
Ошибка:
selenium.common.exceptions.ElementNotInteractableException: Message: Element <button class="imsocial-btn imsocial-btn--icon imsocial-btn--vk" type="button"> could not be scrolled into view
Возможные варианты решения:
1) В коде страницы могут быть скрытые и заблокированные элементы с такими же параметрами. Для проверки этого необходимо выполнить:
elements = driver.find_elements(By.CLASS_NAME, 'imsocial-btn imsocial-btn--icon imsocial-btn--vk')
print (len(elements))
В случае наличия большого кол-ва списка elements нужно выяснять кокой именно необходим нам.
2)