3

我有一个页面。当我手动滚动它时,它会增长,然后我可以一次又一次地滚动它,直到滚动到达底部(一个很好的例子是 facebook 时间轴页面)。

我试着写:

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

然后我进入一个页面并做了:

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

但我可以滚动更多。

即使页面正在增长,如何让它滚动到底部?

任何帮助表示赞赏!

4

4 回答 4

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);
    }
});
于 2013-07-17T07:44:26.580 回答
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);

编辑 :

在某些页面上, 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);
于 2013-07-17T07:55:41.173 回答
2

我对目标很满意,但从用户的角度来看,我对建议的代码方法不满意。如果我进入一个需要使用 ajax(或任何其他方法)部分加载所有内容的设计页面,我希望该页面能够以静默方式完成,而不会因不需要的滚动而打扰我。因此,最好的方法是在后台一个接一个地调用,只要有更多的内容要加载。如果您同意此解决方案,那么通常您将需要一个用于 window.onload 事件的函数来进行第一次调用、处理响应并调用自身以获取更多内容。

于 2013-07-17T23:41:57.670 回答
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();");

也就是说,这可能会导致无限循环不断地 ajax-ing 更多内容。

于 2013-07-18T17:00:08.093 回答