Эмуляция сенсорного телефона

Пишу скрипт(парсер) на 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)

Ответы (0 шт):