【问题标题】:scroll the a growing page to the bottom将不断增长的页面滚动到底部
【发布时间】:2013-07-22 16:52:32
【问题描述】:

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

我试着写:

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

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

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

但我可以滚动更多。

即使页面在增长,我怎样才能让它滚动到底部?

任何帮助表示赞赏!

【问题讨论】:

  • 鉴于您目前的答案,我想我们可能需要澄清一下。您究竟希望何时进行此滚动?

标签: c# javascript selenium-webdriver


【解决方案1】:

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);

【讨论】:

  • @Cyber​​maxsBetclic,谢谢!你是如此接近..滚动到底部,然后我试图把它带到顶部:它到达顶部但然后继续移动到底部:js.ExecuteScript(“var timeId = setInterval(函数( ) { if(window.scrollY!=document.body.scrollHeight) window.scrollTo(0,document.body.scrollHeight); 否则 clearInterval(timeId); },500);"); js.ExecuteScript("window.scrollTo(0, 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);
    }
});

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 似乎是一个不错的方法,但我发现两个问题:您可能不知道如何调用更多内容,这需要将特定于站点的 js 代码放入 selenium 测试中(不容易维护)。在 Selenium 中,用户视角并不重要
    • 特定于站点的代码?无论如何,您的整个测试套件站点都不是特定的。我打赌你的 google+ 测试套件在我针对 Facebook 运行时会失败......
    【解决方案4】:

    以下两个函数将在新内容加载时强制您的页面滚动:

    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/

    将它们放在您页面上的&lt;script&gt; 中,然后调用:

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

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

    【讨论】:

    • 非常感谢您的尝试,但我没有任何按钮,而且我不明白如何删除代码中的按钮行。非常感谢!
    • @AlonShmiel 好的!修改了答案和 jsfiddle,使其可以在用户点击之外附加。
    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 2016-04-21
    • 2011-05-14
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多