selenium:滚动到页面结尾

我是WebDriverJS的新手。我已经在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;

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

在我的代码中,

。在这种方法中,我想删除诸如Java代码之类的硬代码,因为

。例如,Facebook应用程序,Yahoo News …

回答:

根据页面的实现方式,滚动到动态页面的底部可能具有挑战性。

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

然后,通过增加容器滚动scrollTop直到scrollHeight变得稳定,没有待处理的请求。要检查是否有待处理的请求,请评估jQuery.active页面是否具有JQuery或挂钩XMLHttpRequest以监视上的调用send

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

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().forBrowser('chrome').build();

driver.get('https://groups.google.com/forum/#!search/webdriverjs');

// scroll to the bottom 3 times

driver.executeAsyncScript(scrollBottom, 3)

.then(n => console.log(`scrolled ${n} time(s)`));

// scroll to the bottom until the end

driver.executeAsyncScript(scrollBottom)

.then(n => console.log(`scrolled ${n} time(s)`));

function scrollBottom(){

var count = arguments[arguments.length - 2] || 0x7fffffff;

var callback = arguments[arguments.length - 1];

/* get the scrollable container */

var elm = document.elementFromPoint(window.innerWidth - 25, window.innerHeight / 2);

for ( ;elm && (++elm.scrollTop, !elm.scrollTop); elm=elm.parentElement);

elm = elm || document.documentElement;

/* hook XMLHttpRequest to monitor Ajax requests */

if (!('idle' in XMLHttpRequest)) (function(){

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 = function(){

++n;

this.addEventListener('loadend', loadend);

send.apply(this, arguments);

};

})();

/* scroll until steady scrollHeight or count of scroll and no pending request */

var i = 0, scrollHeight = -1, scrollTop = -1;

(function scroll(){

if ((scrollHeight === elm.scrollHeight || i === count) && XMLHttpRequest.idle() > 60)

return callback(i);

scrollTop = elm.scrollTop;

scrollHeight = elm.scrollHeight;

if (i < count)

i += (elm.scrollTop = 0x7fffffff, scrollTop !== elm.scrollTop);

setTimeout(scroll, 100);

})();

}

或通过滚动直到高度在特定时间(此处为5秒)不再增加为止:

function scrollBottom(){

var count = arguments[arguments.length - 2] || 0x7fffffff;

var callback = arguments[arguments.length - 1];

var timeout = 5000; /* 5 seconds timeout */

var i = 0;

/* get the scrollable container */

var elm = document.elementFromPoint(window.innerWidth - 25, window.innerHeight / 2);

for ( ;elm && (++elm.scrollTop, !elm.scrollTop); elm=elm.parentElement);

elm = elm || document.documentElement;

/* scroll while the height is increasing or until timeout */

(function scroll(){

var endtime = Date.now() + timeout;

var height = elm.scrollHeight;

elm.scrollTop = 0x7fffffff; /* scroll */

setTimeout(function check(){

if (Date.now() > endtime) /* returns if waited more than 5 sec */

callback(i);

else if (elm.scrollHeight == height) /* wait again if same height */

setTimeout(check, 60);

else if (++i === count) /* returns if scrolled the expected count */

callback(i);

else /* scroll again */

setTimeout(scroll, 60);

}, 250);

})();

}

以上是 selenium:滚动到页面结尾 的全部内容, 来源链接: utcz.com/qa/408331.html

回到顶部