当 ExecuteScript(setInterval) 完成时继续 `while` 循环

Posted

技术标签:

【中文标题】当 ExecuteScript(setInterval) 完成时继续 `while` 循环【英文标题】:Continue the `while` loop when ExecuteScript(setInterval) is finished 【发布时间】:2013-08-15 15:19:57 【问题描述】:

我有一个代码可以将不断增长的页面滚动到底部(直到无法滚动到底部)。 当它不可能时,它会滚动到顶部并且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 完成后给i 加1。

我尝试了下一件事:

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

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

我该怎么做?

【问题讨论】:

已删除 C# 标签 - 它可能在整个项目中使用,但与问题无关。 @Moo-Juice 只有字符串是 JS 代码...问题中的其他所有内容都是 C#。 @Pluto,它可能是从 C# 生成的,但这表面上都是关于 Javascript 的。 绝对是关于 C#,因为您正在与来自 javascript 的 C# 变量进行交互 你不能。在执行setInterval 回调的那一刻,while 循环已经终止。 【参考方案1】:

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;elsewindow.scrollTo(0,0);return false;");
    
    i++;

【讨论】:

【参考方案2】:

当你触底时找到一些东西用作变量,然后在 While 循环中使用 if 语句来增加 i 发生这种情况时

【讨论】:

以上是关于当 ExecuteScript(setInterval) 完成时继续 `while` 循环的主要内容,如果未能解决你的问题,请参考以下文章

setInterval,为啥只有当 clearInterval 函数高于 setInterval 函数时,计时器才停止?

求助:CATScriptUtilities::ExecuteScript 的用法

WebDriver executeAsyncScript 与 executeScript

chrome.tabs.executeScript():如何获取内容脚本的结果?

为啥我不能在我的 selenium 脚本中使用 executeScript?

ExecuteScript 上的硒超时