c# - ExecuteScript(setInterval) 完成后继续 `while` 循环

标签 c# javascript selenium scroll selenium-webdriver

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

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

我该怎么做?

最佳答案

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

关于c# - ExecuteScript(setInterval) 完成后继续 `while` 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218743/

相关文章:

c# - 使用 nHibernate 忽略实体类型的方法

javascript - 识别 javascript 字符串中的子查询

javascript - var 在功能之外不受影响?

c# - 使用扩展方法的 Selenium 并行测试

python - switch_to_alert.text() 不起作用

java - Selenium Java : Unable to Select Date from Date Picker

c# - HandleBars .Net 比较

C# - 优化数据更新的最佳方式

c# - 在 Simple Injector 中使用运行时数据获取实例

javascript - 未捕获的语法错误 : Unexpected token < google-analytics google tag manager