当ExecuteScript(setInterval)完成时,继续“while”循环

本文关键字:继续 while 循环 完成时 ExecuteScript setInterval | 更新日期: 2023-09-27 18:27:28

我有一个代码,可以将不断增长的页面滚动到底部(直到无法滚动到底部为止)
如果不可能,它会滚动到顶部,javascript代码就完成了。

例如:想象一下facebook上的时间线
这是一个不断增长的页面,所以我可以一次又一次地滚动它,直到无法滚动为止(然后我会出现:"BORN")。

这是我的代码:

while (i < elements.Count)
{
    js.ExecuteScript("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); } },5000);");
    i++;
}

我只想在setInterval完成时将1添加到i

我尝试了下一件事:

while (i < elements.Count)
{
    object a = js.ExecuteScript("setInterval( function() {  
    if(window.scrollY<(document.body.scrollHeight-window.screen.availHeight)) { 
    window.scrollTo(0,document.body.scrollHeight); return '1'}; else { 
    clearInterval(timeId); window.scrollTo(0,0); return '2'} },5000);");
    while (a != '2') {
      // do nothing, this while will be ended when we arrived the bottom and
      // go back to the top
    }
    // all the page is loaded
    i++;

}

但它不起作用。。也许有一种方法可以在不使用设置间隔的情况下越来越多地滚动到底部,然后再滚动到顶部?(但请记住:这是一个不断增长的页面,当你向下滚动时就会增长。

我该怎么做?

当ExecuteScript(setInterval)完成时,继续“while”循环

setInterval函数是异步的,这意味着它发生在ExecuteScript函数获得返回值之后,这就是为什么您尝试的方法不起作用。我能想到的最好的解决方案是稍微改变一下代码的结构,并使用C#线程。

使用C#线程

通过这种方式,我们要做的是每次停止代码5秒,然后执行一个JavaScript代码,检查您是否可以进一步向下滚动,如果可以,则向下滚动,否则向上滚动。这个JavaScript代码还将返回我们是否应该继续运行这个循环。

基本上,这是我们将执行的JavaScript代码:

if (window.scrollY < (document.body.scrollHeight - window.screen.availHeight)) {
    window.scrollTo(0, document.body.scrollHeight);
    return true;
} else {
    window.scrollTo(0, 0);
    return false;
}

这就是整个C#代码的样子:

while (i < elements.Count)
{
    bool run = true;
    while (run)
    {
        System.Threading.Thread.Sleep(5000);
        run = (bool)js.ExecuteScript("if(window.scrollY<(document.body.scrollHeight-window.screen.availHeight)){window.scrollTo(0,document.body.scrollHeight);return true;}else{window.scrollTo(0,0);return false;}");
    }
    i++;
}

找到一些东西作为触底时的变量,然后在While循环中使用if语句来增加i