Javascript Selenium:滚动到页面末尾

Javascript Selenium:滚动到页面末尾,javascript,node.js,selenium,selenium-webdriver,Javascript,Node.js,Selenium,Selenium Webdriver,硒: 我是新手。我在Java中尝试过这种方法 Long repaeted = 0l, scrollHeight = 0l, returnHeight = 0l; while(true){ if (repaeted == 0) { returnHeight = (Long) jse.executeScript("var scroll =document.documentElement.scrollHeight;window.scrollTo(0, scroll); retu

硒:

我是新手。我在Java中尝试过这种方法

Long repaeted = 0l, scrollHeight = 0l, returnHeight = 0l;
while(true){
    if (repaeted == 0) {
        returnHeight = (Long) jse.executeScript("var scroll =document.documentElement.scrollHeight;window.scrollTo(0, scroll); return scroll;");
         System.out.println("Height : "+scrollHeight +"\t Chnage : "+returnHeight+ "\t Repeated : "+repaeted);
         scrollHeight = returnHeight;
     }else {
         returnHeight = (Long) jse.executeScript("var scroll =  document.documentElement.scrollHeight;window.scrollTo(0, scroll); return scroll;");
         System.out.println("Height : "+scrollHeight +"\t Chnage : "+returnHeight+ "\t Repeated : "+repaeted);
         if (scrollHeight.intValue() == returnHeight.intValue()) {
             System.out.println("Break.."+ returnHeight);
             break;
         } else { scrollHeight = returnHeight; }
     }
            repaeted++;
 } 
但我在迭代循环时遇到了webdriverjs中的问题

var webdriver=require('..'),
By=webdriver.By,
until=webdriver.until;
//确保chromedriver可以在您的系统路径上找到
var driver=new webdriver.Builder()
.forBrowser('chrome')
.withCapabilities(webdriver.Capabilities.chrome())
.build();
司机,上车https://in.yahoo.com/)。然后(函数(){
var window=新的webdriver.webdriver.window(驱动程序);
window.maximize();
driver.manage().timeouts().implicitlyWait(1000*3);
})
.然后(函数(){
console.log('Entered');
变量检查=0,计数=0
对于(变量i=0;i<50;i++){
//驾驶员睡眠(1000*2);
driver.executeScript('var dynamicscroll=document.documentElement.scrollHeight;window.scrollTo(0,dynamicscroll);return dynamicscroll;')。然后(函数(高度){
log('Check:'+Check+'高度:'+Height+'重复:'+(count++);
如果(check==0 | | check!==height){console.log('continue');check=height;}
else{console.log('break');i=100;}
});
}
})
.then(空,函数(错误){
console.error(“抛出了一个错误!按承诺…”+err);
});
driver.quit();
在我的代码中,我对循环进行了硬编码,使其迭代50次,当滚动高度达到末尾时,我想退出/中断循环。在这种方法中,我想删除像java代码这样的硬代码,因为我不知道对滚动不断动态增加的其他应用程序迭代多少次。
例如,Facebook应用程序、雅虎新闻……

纯JavaScript:

在JavaScript中,我们可以使用()函数。它将在指定的时间延迟后递归调用指定的函数

我已经测试了GoogleGroups应用程序,它的div标签垂直滚动会动态增加。为了加载内容,我使用了5000的时间延迟。您可以使用以下URL在浏览器控制台中测试此代码:
https://groups.google.com/forum/#!搜索/webdrierjs

var i=0,高度=0,校验=0,t=null;
流();
函数运行(arg){
var objDiv=document.querySelector('div.IVILX2C-b-F');
objDiv.scrollTop=objDiv.scrollHeight;
返回objDiv.scrollHeight;
}
函数流(){
i++;
开关(i){
案例0:高度=行程(i);
睡眠(5000);
打破
案例1:运行(i);
clearTimeout(t);//停止流
打破
默认值:检查=运行(i);
log('返回高度:'+check+'计数:'+i);
如果(检查==高度){i=-2;
console.log('中断消息:'+i);
}否则{
log('Changed…');
高度=检查;
}
睡眠(5000);
打破
}
}
函数sleep(delay){t=setTimeout(“flow()”,delay);}//在指定的时间后再次启动流控制。
//函数sleep(delay){var start=new Date().getTime();while(new Date().getTime()

但即使是我也无法使用WebDriver/WebDriverJS运行此脚本,因为它不会在时间延迟时调用递归函数。

滚动到动态页面底部可能很困难,这取决于页面如何实现

首先,您必须找到带有滚动条的容器,因为它可能与链接到
window.scrollTo
的容器不同

然后通过增加
scrollTop
滚动容器,直到
scrollHeight
变得稳定,没有挂起的请求。若要检查是否存在挂起的请求,请在页面具有jQuery的情况下使用evalute
jQuery.active
,或使用hook
XMLHttpRequest
监视
send
上的调用

下面是一个使用通用函数多次滚动到页面底部或滚动到页面末尾的示例:

var-webdriver=require('selenium-webdriver');
var driver=new webdriver.Builder().forBrowser('chrome').build();
司机,上车https://groups.google.com/forum/#!search/webdriverjs');
//滚动至底部3次
driver.executeAsyncScript(滚动底部,3)
.then(n=>console.log(`scrolled${n}time`));
//滚动到底部直到结束
driver.executeAsyncScript(滚动底部)
.then(n=>console.log(`scrolled${n}time`));
函数滚动底部(){
变量计数=参数[arguments.length-2]| | 0x7fffffff;
var callback=arguments[arguments.length-1];
/*获取可滚动的容器*/
var elm=document.elementFromPoint(window.innerWidth-25,window.innerHeight/2);
对于(;elm&&(++elm.scrollTop,!elm.scrollTop);elm=elm.parentElement);
elm=elm | | document.documentElement;
/*钩住XMLHttpRequest以监视Ajax请求*/
if(!('idle'在XMLHttpRequest中))(函数(){
var n=0,t=Date.now(),send=XMLHttpRequest.prototype.send;
var dispose=function(){--n;t=Date.now();};
var loadend=function(){setTimeout(dispose,1)};
XMLHttpRequest.idle=function(){return n>0?0:Date.now()-t;};
XMLHttpRequest.prototype.send=函数(){
++n;
此.addEventListener('loadend',loadend);
send.apply(这个,参数);
};
})();
/*滚动至稳定的滚动高度或滚动计数且无未决请求*/
变量i=0,scrollHeight=-1,scrollTop=-1;
(功能滚动条(){
if((scrollHeight==elm.scrollHeight | | i==count)和&XMLHttpRequest.idle()>60)
返回回调(i);
scrollTop=elm.scrollTop;
scrollHeight=elm.scrollHeight;
如果(ivar webdriver = require('..'),
    By = webdriver.By,
    until = webdriver.until;
// make sure chromedriver can be found on your system PATH
var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .withCapabilities(webdriver.Capabilities.chrome())
    .build();


driver.get('https://in.yahoo.com/').then(function(){
        var window = new webdriver.WebDriver.Window(driver);
        window.maximize();
        driver.manage().timeouts().implicitlyWait(1000 * 3);
    })
    .then(function(){
        console.log('Entered');
        var check = 0, count = 0
        for(var i = 0; i< 50; i++){
        //driver.sleep(1000 * 2);
driver.executeScript('var dynamicscroll = document.documentElement.scrollHeight;window.scrollTo(0, dynamicscroll);return dynamicscroll;').then(function(height){
        console.log('Check : '+check+'  Height : '+height +'  Repeated : '+(count++));
        if(check === 0 || check !== height){console.log('continue'); check = height; }
        else { console.log('break'); i = 100; }
            });
        }
        })
    .then(null, function(err) {
      console.error("An error was thrown! By Promise..." + err);
    });

driver.quit();
var i = 0, height = 0, check = 0, t = null;
flow();

function run(arg){
var objDiv = document.querySelector('div.IVILX2C-b-F');
objDiv.scrollTop = objDiv.scrollHeight;
return objDiv.scrollHeight;
}

function flow() {
i++;
    switch(i){ 
        case 0:     height  = run(i);
                    sleep(5000);
                break;
        case -1:    run(i);
                    clearTimeout(t); //stops flow
                break;
        default:    check = run(i);
                    console.log('Return Height : '+check +'  Count : '+i);
                    if(check === height){ i = -2;
                    console.log('Break message : '+i);
                    }else {
                    console.log('Changed...');
                    height = check;
                    }
                sleep(5000);
                break;
    }
}

function sleep(delay) { t=setTimeout("flow()",delay);} //starts flow control again after time specified.
//function sleep(delay) {  var start = new Date().getTime();     while (new Date().getTime() < start + delay);  flow(); } // stops execution and then continues.
footer = driver.findElement({id: "footer"});
driver.executeScript("arguments[0].scrollIntoView(false);", footer);