我已经在Python工作了几年,最近开始研究Javascript(不是jQuery或依赖,只是普通的Javascript),用于某些浏览器自动化任务。
使用fx Selenium,使用延迟加载(如Facebook页面,Twitter页面或甚至是Wallmart网站)滚动网站很简单。
在Python中,粗略的'n'脏解决方案可能是高度检查,如果高度停止增加,则可以突破while循环。像这样:
check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
height = driver.execute_script("return document.body.scrollHeight;")
if height == check_height:
break
check_height = height
所以现在我正在尝试使用Chrome控制台在Javascript中完成同样的事情。到目前为止,一个工作代码看起来像这样:
var scrollToBottom = function() {
window.scrollTo(0, document.body.scrollHeight);
}
var sleep = 1000;
var kill_ID = setInterval(scrollToBottom, sleep);
setInterval启动一个永远循环的循环 - 每次调用scrollToBottom之间的休眠时间为第二。然后我可以通过发出以下命令 - 手动 - 在不再加载内容时将其终止:
window.clearInterval(kill_ID);
这显然不是解决这个问题的最好方法。因此,必须有一种更好的方法来完成任务,而无需手动终止滚动过程。
但是在Javascript中,Python逻辑对我来说似乎不起作用。任何人都会给我一些关于如何实现这一点的指示 - 我认为 - 基本任务?提前谢谢。
更新 由于显然没有简单的解决方案,我使用了一个低技术解决方案并添加了一个eventListener,当我点击鼠标时触发滚动(触发clearInterval)。
因此需要一个额外的代码片段 - fx作为书签 - 只需要:
window.addEventListener('click', function kill(){window.clearInterval(kill_ID)})
感谢大家提供的有用评论。
答案 0 :(得分:0)
你的方法是正确的,我认为(我可能是错的)如果你不想使用async/await
方法,那就尽可能好。
使用async/await
,您可以定义一个循环,如下所示:
async function toTheBottom() {
while (check if height has changed) {
window.scrollTo(0, document.body.scrollHeight);
await sleep(1000);
}
}
睡眠可能被定义为:
function sleep(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms);
});
}
答案 1 :(得分:0)
如果我理解你的问题,你想在窗口滚动时做某事,然后根据那个做某事。您应该可以通过eventListeners
:
window.addEventListener('scroll', event => {
// Do your checks to see if you need to
// do your work or not
if (doWork()) {
doSomethingElse()
}
})
Here is a jsfiddle我认为你做的是什么样的例子
如果您想添加依赖项,这将变得更容易:
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
<script>
const { Observable } = Rx
const scrollStream = Observable.fromEvent(window, 'scroll')
const isTheScrollICareAboutSubscription = scrollStream
.filter(e => {
// return true or false if this is
// an event we care about
return doWork(e)
})
.subscribe(doSomethingElse)
</script>