В Selenium представлены различные действия, которые можно выполнить с помощью клавиатуры. В основном, можно выполнять два действия:
Нажать клавишу
Отпустить нажатую клавишу.
Нажатие клавиши (Key down)
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains driver = ... # инициализация драйвера ActionChains(driver).key_down(Keys.SHIFT).send_keys("abc").perform()
Отпускание клавиши (Key up)
ActionChains(driver).key_down(Keys.SHIFT).send_keys(«a»).key_up(Keys.SHIFT).send_keys(«b»).perform()
Импортируем:
from selenium.webdriver import Keys или from selenium.webdriver.common.keys import Keys
Таким образом взаимодействовать можно только с интерактивными элементами:
Интерактивные элементы предназначены для взаимодействия с пользователем. Это могут быть кнопки, которые можно нажать, ссылки, по которым можно перейти, или поля ввода, в которые можно ввести текст. Они реагируют на действия пользователя, такие как клики мышью или нажатия клавиш. Примеры таких элементов включают в себя кнопки (<button>), ссылки (<a>), поля ввода (<input>) и другие подобные элементы.
Неинтерактивные элементы, напротив, предназначены в основном для отображения информации. Они не реагируют на действия пользователя так, как это делают интерактивные элементы. Примеры включают в себя абзацы с текстом (<p>), элементы списка (<li>), табличные элементы (<tr>, <td>) и так далее.
import time from selenium.webdriver import Keys from selenium import webdriver from selenium.webdriver.common.by import By with webdriver.Chrome() as browser: browser.get('https://mob25.com/') browser.find_element(By.TAG_NAME, 'input').send_keys(Keys.TAB) time.sleep(10)
.send_keys(Keys.TAB) симулирует ввод с клавиатуры. В данном случае симулируется нажатие клавиши TAB. Это может переместить фокус на следующий интерактивный элемент на странице после найденного <input>.
Чтобы взаимодействовать подобным образом с остальными элементами <input>, нам потребуется цикл while, если мы не знаем точного количества элементов, или цикл for, если точное количество элементов нам известно(не забываем фактор бесконечной загрузки элементов в боевых условиях).
import time from selenium.webdriver import Keys from selenium import webdriver from selenium.webdriver.common.by import By with webdriver.Chrome() as browser: browser.get('https://mob25.com/') tags_input = browser.find_elements(By.TAG_NAME, 'input') for input in tags_input: input.send_keys(Keys.DOWN) time.sleep(1)
В цикле for код проходит по каждому найденному элементу input и выполняет следующие действия:
input.send_keys(Keys.DOWN): «нажимает» клавишу «Вниз» (DOWN) в текущем элементе input. Это может привести к изменению значения элемента или к другому действию, в зависимости от типа и функционала элемента.
Запустите этот код у себя, и вы увидите, что он поочередно выделяет (берет в фокус) все элементы <input> на странице. Страница сайта-тренажера сразу отображает весь список тегов <input>.
Приведенный выше пример с циклом for обработал бы только первые элементы, так как они были загружены при открытии страницы. Чтобы решить эту проблему и обрабатывать все подгружаемые элементы, давайте модифицируем этот код.
import time from selenium.webdriver import Keys from selenium import webdriver from selenium.webdriver.common.by import By with webdriver.Chrome() as browser: browser.get(r"https://mob25.com/") list_input = [] # Инициализируем пустой список для хранения обработанных элементов ввода while True: # Начинаем бесконечный цикл # Ищем все элементы input на веб-странице и добавляем их в список input_tags input_tags = browser.find_elements(By.TAG_NAME, 'input') # Обходим каждый элемент input в списке for tag_input in input_tags: # Проверяем, не обрабатывали ли мы уже этот элемент ранее if tag_input not in list_input: # Вариант 1 Клавиша вниз tag_input.send_keys(Keys.DOWN) # Отправляем клавишу "Вниз" # Вариант 2 Скроллинг к элементу перед кликом # browser.execute_script("return arguments[0].scrollIntoView(true);", tag_input) # Использование небольшой задержки для исключения ошибки недоступности элемента time.sleep(0.1) tag_input.click() # Кликаем на элемент list_input.append(tag_input) # Добавляем элемент в список обработанных элементов
Обратите внимание, что страница имитирует «бесконечную» ленту. Перейдите на неё вручную и прокрутите вниз, наблюдая за появляющимися HTML-тегами. В тот момент, когда вы достигнете финала прокрутки, именно так ведёт себя «бесконечная» прокрутка (Infinite scroll).
Пояснение к коду.
Создаём пустой список list_input, который будет использоваться для хранения элементов <input>, с которыми уже произведены какие-либо действия (нажатия клавиш или клики).
list_input = [] # Инициализируем пустой список для хранения обработанных элементов ввода
Выполняем поиск всех элементов с тегом <input> на текущей веб-странице и сохраняет их в список input_tags.
input_tags = browser.find_elements(By.TAG_NAME, ‘input’)
Перебираем каждый найденный элемент <input>.
for tag_input in input_tags:
Проверяем, находится ли текущий элемент tag_input в списке list_input. Если элемент уже был обработан ранее, он будет в этом списке, и следующие действия с ним производиться не будут.
if tag_input not in list_input:
Симулируем нажатие клавиши «Вниз» (Keys.DOWN) в текущем элементе tag_input, для прокрутки элементов вниз.
tag_input.send_keys(Keys.DOWN) # Отправляем клавишу «Вниз»
В тексте скрипта приведен и второй вариант. Иногда элемент может быть перекрыт из-за его расположения за пределами видимой области страницы. Чтобы решить это, можно использовать метод JavaScript для скроллинга.
browser.execute_script(«arguments[0].scrollIntoView(true);», tag_input)
Для того, чтобы избежать ситуации, когда происходит попытка кликнуть по элементу, который к этому еще не готов, можно использовать небольшое ожидание time.sleep(0.1) (Другие способы ожидания будут рассмотрены в курсе немного позже).
Затем симулируется клик по текущему элементу tag_input, если это необходимо вашей задачей.
tag_input.click() # Кликаем на элемент
Наконец, текущий элемент tag_input добавляется в список list_input, чтобы в будущем не обрабатывать его повторно.
list_input.append(tag_input) # Добавляем элемент в список обработанных элементов