Ссылка на проект:
https://www.selenium.dev/Ссылка на актуальные биндинги:
https://www.selenium.dev/downloads/Ссылка на драйвера и сторонние биндинги:
https://www.selenium.dev/ecosystem/Документация к Python биндингу:
https://selenium-python.readthedocs.io/index.htmlНачало работы с Python биндингом:
https://selenium-python.readthedocs.io/installation.htmlНет биндинга для Вашего языка ?Спецификация WebDriverРеализация для DelphiРеализация для RustРеализация для C++Как использовать:
- Установить нужный драйвер, например для Google Chrome в любую папку
- Добавить путь до драйвера в PATH
- Используя биндинг, автоматизировать требуемый ресурс
Пример решения задачи на Python:
Спойлер
Код
import time
import json
import sys
import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
URL = "https://istqb-training.ru/Training"
WAIT_TIMEOUT = 30
driver = webdriver.Chrome()
driver.get(URL)
driver.set_window_rect(10, 10, 900, 900)
driver.implicitly_wait(1.5)
startIndex = int(sys.argv[1])
stepsCount = int(sys.argv[2])
outFile = sys.argv[3]
questionNumberInput = None
try:
WebDriverWait(driver, WAIT_TIMEOUT).until(
EC.visibility_of_element_located((By.ID, 'questionNumberInput'))
).send_keys(str(startIndex))
WebDriverWait(driver, WAIT_TIMEOUT).until(
EC.visibility_of_element_located((By.ID, 'go-go-power-rangers'))
).click()
time.sleep(10)
result = {}
t1 = datetime.datetime.now()
for i in range(stepsCount):
time.sleep(0.2)
questionText = WebDriverWait(driver, WAIT_TIMEOUT).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, '#content-block > div > div'))
).text
if questionText:
WebDriverWait(driver, WAIT_TIMEOUT).until(
EC.visibility_of_element_located((By.ID, 'checkAnswButton'))
).click()
time.sleep(0.2)
answerText = WebDriverWait(driver, WAIT_TIMEOUT).until(
EC.visibility_of_element_located((By.XPATH, '//*[contains(@id, \"answ-\")][contains(@style, \"background-color: limegreen\")]'))
).text
WebDriverWait(driver, WAIT_TIMEOUT).until(
EC.visibility_of_element_located((By.XPATH, '//*[@id=\"nextQuestButton\"]'))
).click()
time.sleep(0.15)
result[questionText] = answerText
print(f'Start question: {startIndex}.')
print(f'Question count: {stepsCount}.')
print(f'Time elapsed: {datetime.datetime.now() - t1}.')
# swap to file
f = open(outFile, 'w')
f.write(json.dumps(result))
f.close()
except Exception as ex:
print(ex)
finally:
driver.quit()
Использование:
Код
python <script_name>.py 1 100 <out_file>
Умеет все что умеет обычный браузер + имеет возможность перебирать полный DOM страницы, выполнять JS. Хорошо подходит для работы с ресурсами на React, Angular, которые как правило создают глубокую вложенность элементов и генерируют свои id, class для элементов (регуляркой по полученному html сложно выбрать) да и в целом если контент динамический.
Ну и полная кроссплатформенность, разумеется кроме драйвера Edge.