Эмуляция сенсорного телефона
Пишу скрипт(парсер) на python с использованием selenium. И хочу сделать вид, что захожу с мобилки. Прокси и юзеры мобильные юзаю. Так же несколько других фич, чтобы скрыть, что мой скрипт - это бот. На странице антибот от саннисофт вся таблица зелёная.
Но я хочу добавить свайпы по странице, а если это сделать для десктопной версии сайта то возможны только скроллы мышкой. При просмотре Click Maps не будет видно касаний и перетаскиваний характерных для сенсорных телефонов. Была идея через js включать мобильное представление как в хроме при просмотре мобильного вида страницы. Там курсор превращается в точку которой можно скроллить страницу перетаскиванием.
В селениуме до 4 версии был модуль TouchActions. Но сейчас он устарел.
Как мне сделать, чтобы загрузить страницу в режиме мобилки и скроллить её перетаскиваними?
Я перепробовал всё, что есть в документации selenium, но так и не нашёл решения. Хотя я мог не правильно что-то сделать
Сразу после инициализации драйвера я выполняю скрипт
driver.execute_cdp_cmd("Emulation.setTouchEmulationEnabled", {"enabled": True})
А затем пытаюсь выполнить на странице функцию
def simulate_human(driver):
body = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, 'body'))
)
body_size = body.size
window_width = body_size['width'] / 2
window_height = body_size['height'] / 2
start_x = max(0, min(window_width, window_width * random.uniform(0.400, 0.800)))
start_y = max(0, min(window_height, window_height * random.uniform(0.150, 0.300)))
end_x = max(0, min(window_width, start_x + random.uniform(10.00, 30.00)))
end_y = max(0, min(window_height, start_y + (window_width / 3)))
actions = ActionChains(driver)
print('Симуляция движения')
actions.move_to_element_with_offset(body, start_x, start_y).drag_and_drop_by_offset(body, end_x, end_y).perform()
time.sleep(random_wait_time)
actions.move_to_element_with_offset(body, start_x, start_y).drag_and_drop_by_offset(body, end_x, end_y).perform()
time.sleep(random_wait_time)
actions.move_to_element_with_offset(body, start_x, start_y).drag_and_drop_by_offset(body, end_x, end_y).perform()
time.sleep(random_wait_time)
def main():
driver.get('https://bot.sannysoft.com/')
random_delay(min_delay=3)
pg.hotkey('ctrl', 'shift', 'm')
random_delay()
simulate_human(driver)
print('done')
В таком виде, при открытии devtools и запуcке device toolbar(запускается мобильное представление сайта) я получаю в консоль "Симуляция движения", а "done" не получаю. Программа не знает что делать дальше
Нашёл решение
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.pointer_input import PointerInput
from selenium.webdriver.common.actions import interaction
def swipe(driver, start_x: int, start_y: int, end_x: int, end_y: int, duration: int = 0):
actions = ActionChains(driver)
touch_input = PointerInput(interaction.POINTER_TOUCH, 'touch')
actions.w3c_actions = ActionBuilder(driver=driver, mouse=touch_input)
actions.w3c_actions.pointer_action.move_to_location(start_x, start_y)
actions.w3c_actions.pointer_action.pointer_down()
if duration > 0:
actions.w3c_actions = ActionBuilder(driver=driver, mouse=touch_input, duration=duration)
actions.w3c_actions.pointer_action.move_to_location(end_x, end_y)
actions.w3c_actions.pointer_action.release()
actions.perform()
def simulate_human(driver):
window_size = driver.get_window_size()
window_width = window_size['width']
window_height = window_size['height']
body = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, 'body'))
)
body.click()
# Координаты начала движения
start_x = window_width * random.uniform(0.400, 0.800)
start_y = window_height * random.uniform(0.150, 0.300)
# Координаты окончания движения
end_x = start_x + random.uniform(10.00, 30.00)
end_y = start_y + (window_width / 3)
print('Симуляция движения')
swipe(driver, end_x, end_y, start_x, start_y, 500)
time.sleep(random_wait_time)
swipe(driver, end_x, end_y, start_x, start_y, 500)
time.sleep(random_wait_time)
swipe(driver, start_x, start_y, end_x, end_y, 500)
time.sleep(random_wait_time)
swipe(driver, start_x, start_y, end_x, end_y, 500)
time.sleep(random_wait_time)