2013-07-12 2 views
3

У меня есть страница. когда я прокручиваю его вручную, он растет, а затем я могу прокручивать его снова и снова до тех пор, пока свиток не достигнет нижней границы (хорошим примером является страница временной шкалы facebook).прокрутите растущую страницу донизу

Я пытаюсь написать:

static IWebDriver driver = new ChromeDriver(@"C:\selenium\net40"); 
IJavaScriptExecutor js = driver as IJavaScriptExecutor; 

я вошел страницы и сделал:

js.ExecuteScript("window.scroll(0, document.height)"); 

, но я могу прокручивать больше.

Как это сделать, чтобы прокручивать его до самого нижнего, даже если страница растет?

любая помощь оценена!

+0

Учитывая ответы, которые у вас есть в настоящее время, я думаю, нам может понадобиться некоторое разъяснение. Когда именно вам нужен этот свиток? – MaxPRafferty

ответ

2

window.scroll(0, document.height) будет прокручиваться к известной прокрутке. Проблема в том, что больше данных загружается, когда вы достигаете нижней части страницы. Таким образом, область с прокруткой изменяется. Вам нужно прокручивать столько раз, сколько требуется.

, например, использовать этот скрипт

var timeId = setInterval(function() { 
    if(window.scrollY!==document.body.scrollHeight) 
     window.scrollTo(0,document.body.scrollHeight); 
    else 
     clearInterval(timeId); 
},500); 

EDIT:

На некоторых страницах window.scrollY никогда не будет равна document.body.scrollHeight, так setIntervanl никогда не будут удалены: это помешает вам пойти Вверх.

var timeId = setInterval(function() { 
    if(window.scrollY<(document.body.scrollHeight-window.screen.availHeight)) 
     window.scrollTo(0,document.body.scrollHeight); 
    else 
    { 
     clearInterval(timeId); 
     window.scrollTo(0,0); 
    } 
},500); 
+0

@CybermaxsBetclic, спасибо! вы так близки .. прокрутка идет в нижнюю часть, а затем я пытаюсь довести ее до вершины: он достигает вершины, а затем продолжает движение к нижней части: js.ExecuteScript ("var timeId = setInterval (function() {if (window.scrollY! = document.body.scrollHeight) window.scrollTo (0, document.body.scrollHeight); else clearInterval (timeId);}, 500); "); js.ExecuteScript ("window.scrollTo (0, 0);"); –

+0

Да, есть проблема. см. редактировать – Cybermaxs

+0

еще раз спасибо! :] –

2

К сожалению, нет события, которое срабатывает при изменении общей высоты страницы. Поэтому есть два возможных решения:

Вы можете использовать таймер, чтобы «слепо» прокручивать нижнюю часть каждого интервала.

setInterval(function() { window.scroll(0, document.height); }, 100); 

Или вы можете прокручивать до дна каждый раз, когда изменяется высота, используя событие «DOMSubtreeModified». Это событие срабатывает каждый раз, когда что-либо изменяется в документе, поэтому оно может замедлить работу вашего браузера, если вы часто меняете DOM. Это решение, однако, гарантирует, что вы мгновенно прокрутите страницу вниз, когда страница будет расти.

//scroll to bottom when anything changes in the dom tree. 
var height = document.height; 
document.addEventListener('DOMSubtreeModified', function() { 
    if (document.height != height) { 
     height = document.height; 
     window.scroll(0, height); 
    } 
}); 
+0

спасибо, но это не сработало:/ –

2

У меня все в порядке с целью, но не с предлагаемыми подходами кода с точки зрения пользователя. Если я приземляюсь на странице, где есть дизайн, нужно частично загрузить весь контент с помощью ajax (или любого другого метода), я ожидаю, что страница будет делать это молча, не беспокоя меня нежелательными свитками. Поэтому лучший подход заключается в том, чтобы сделать вызовы в фоновом режиме один за другим, поскольку нагрузка больше на контент. Если вы согласны с этим решением, то в общем случае вам понадобится функция для события window.onload, чтобы сделать первый вызов, обработать ответ и позвонить самому для большего количества контента.

+0

кажется хорошим подходом, но я вижу две проблемы: вы можете не знать, как обращаться к большему количеству контента, и для этого потребуется разместить js-код, специфичный для сайта, в тесте selenium (не простое обслуживание). В Selenium, перспектива пользователя на самом деле не имеет значения – Cybermaxs

+0

код для сайта? В любом случае, не весь ваш тестовый сайт. Я делаю ставку на ваш тестовый пакет для google +, когда я запускаю его против Facebook ... – Ardesco

1

Следующие две функции заставит вашу страницу прокручивать когда новое содержание нагрузки:

JS:

var attachScrollModified = function() { 
    document.addEventListener('DOMSubtreeModified', function() { 
     this.removeEventListener('DOMSubtreeModified', arguments.callee, false); 
     window.scroll(0, getBottomElemPos()); 
     attachScrollModified(); 
    }); 
} 

var getBottomElemPos = function() { 
    var scrollElem = document.getElementById("scrollElem"); 
    if (scrollElem) { 
     document.body.removeChild(scrollElem); 
    } 
    scrollElem = document.createElement("div"); 
    scrollElem.id = "scrollElem"; 
    document.body.appendChild(scrollElem); 
    return scrollElem.offsetTop; 
} 

Пример на: http://jsfiddle.net/MaxPRafferty/aHGD6/

место тех, кто в <script> на вашей странице, и затем позвоните:

js.ExecuteScript("attachScrollModified();"); 

Это сказал, что это может привести к бесконечному циклу непрерывного увеличения содержимого.

+0

Большое вам спасибо за ваши попытки, но у меня нет кнопки, и я не понял, как удалить строку кнопки в ваш код .. большое спасибо! –

+1

@AlonShmiel Ок! Модифицированный ответ и jsfiddle, чтобы сделать его прикрепляемым вне клика пользователя. – MaxPRafferty

Смежные вопросы