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();
在我的代码中, 我对循环进行了硬编码,直到50次为止,并且要在达到滚动高度结束时退出/中断循环 。在这种方法中,我想删除诸如Java代码之类的硬代码,因为 我不知道对于滚动不断增加的其他应用程序要迭代多少次 。例如,Facebook应用程序,Yahoo News …
根据页面的实现方式,滚动到动态页面的底部可能具有挑战性。
首先,您必须使用滚动条找到该容器,因为它可能与链接的容器不同window.scrollTo。
window.scrollTo
然后,通过增加容器滚动scrollTop直到scrollHeight变得稳定,没有待处理的请求。要检查是否有待处理的请求,请评估jQuery.active页面是否具有JQuery或挂钩XMLHttpRequest以监视上的调用send。
scrollTop
scrollHeight
jQuery.active
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); })(); }