Пролистывание (scrolling) страницы с помощью JavaScript. В помощь веб-автоматизаторам


(Сергей Блохин) #1

Сейчас модно подгружать контент после пролистывания страницы, например, http://vk.com/feed.
Довольно простой способ заставить страницу пролистаться — выполнить одну JavaScript команду.

window.scrollBy(xpos, ypos)

Если нужно пролистать страницу до самого низу, то необходимо знать высоту всей страницы.
Конечно, можно указать заведомо большее значение, например, 100500, но это не совсем рационально.

Тут и родился мой Gist https://gist.github.com/tit/5789674, который вычисляет реальную высоту всего контента. Именно на эту высоту и нужно присвистывать страницу.


Дайджест полезных ссылок для тестировщиков-автоматизаторов #012
(Дмитрий Жарий) #2

Мне всегда нравился вот этот кроссбраузерный хак с Max

Math.max(document.body.clientWidth, document.body.offsetWidth, document.body.scrollWidth);

Действительно, выглядит красивее, чем 3 конструкции if


(Mykhailo Poliarush) #3

За заметку спасибо!

Кстати прочитал твою заметку и понял что было бы классно сделать ряд статей в помощь веб-автоматизаторам. Например, типичные проблемы и решения на javascript, скроллы, нажатия, удаление и добавление элементов и т.д.


(Сергей Блохин) #4

Я всегда рад ответить на любые вопросы. Но просто переписывать документацию по JS в виде статей — не думаю, что хорошая идея.
По мере того, как я работаю, у меня возникают нестандартные проблемы, и по мере их решения я стараюсь выкладывать рецепты тут.
Вот сегодня столкнулся с тем, что мне нужно пролистать страницу несколько раз, чтобы подгрузился весь контент, вспомнил, что это можно сделать на JS и поделился со всеми. :slight_smile:

Кстати, в дополнение хочу ещё сказать. Один раз проскроллировать страницу хорошо, но надо же скроллировать её столько раз, сколько у нас есть контента, правильно?
Для этого нужно после каждого скроллирования сравнивать высоту всего контента с тем, что было до этого.


(Mykhailo Poliarush) #5

Нет, я и не говорю чтобы переписывать. Просто появилась мысль выкладывать решения, которые помогают сделать жизнь проще. Вот например, как ты описал.

Ну ок, это просто мысль в слух :smile:


(Alexander Petrovich) #6

Пошевелим старый пост :smile:

def scroll_to_element(driver, element, inside_element=None):
    if not inside_element:
        script = """
            var elem = arguments[0];
            jQuery('html, body').animate({
                scrollTop: jQuery(elem).offset().top
                }, 'slow', null
            );
                """
    else:
        script = """
            var elem = arguments[0];
            var inside = arguments[1];
            var posArray = jQuery(arguments[0]).position();
            jQuery(inside).animate({scrollTop: posArray.top}, 'slow', null);
                 """
    driver.execute_script(script, element, inside_element) 

Собственно гешефт в возможности скроллить внутри div’а, например. element и inside_element, понятное дело, - вэбэлементы