2017-11-15 7 views
0

私はPythonで数年間働いていて、最近はいくつかのJavascript(jQueryや依存関係ではなく、単純なJavascript)ブラウザ自動化タスク。ウェブページの下部にあるときにjavascript-scrollを確認する方法(と殺す)

Pythonでの遅延読み込み(Facebookページ、Twitterページ、またはWallmartサイトでさえも)は、fx Seleniumを使用すると簡単です。

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

をこれは明らかにこのことについてに行くための最善の方法ではありません。だから手動でスクロール・プロセスを終了させることなく、タスクを達成するためのより良い方法が必要です。

しかし、PythonのロジックはJavascriptで私にとってはうまくいかないようです。誰かが私に、これを達成する方法についての2つの指針を与えるでしょう - 私は - 基本的な仕事ですか?前もって感謝します。

更新: どうやら、このいずれかの簡単な修正がないように、私はローテク溶液で行って、私は(てclearIntervalを誘発する)は、マウスをクリックしたときにスクロールを殺すのEventListenerを追加しました。参考になったコメントについて

window.addEventListener('click', function kill(){window.clearInterval(kill_ID)}) 

おかげで、誰も:

これが機能するので、余分なコードスニペット - - FXブックマークレットとしてだけであることが必要です。

答えて

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

互換性:https://caniuse.com/#feat=async-functions

0

私はあなたの問題を理解していれば、あなたウィンドウがスクロールしたときに何かを実行したい場合は、それに基づいて何か else。あなたは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> 
+0

ありがとう、Tim。私の問題が不明な場合は申し訳ありません。骨に:ロードするコンテンツがなくなるまでスクロールしたいこれが起こると、私はスクロールを殺したい。あなたが与える最初の例で私はそれについてどうやって行くのですか?ありがとう。 – jlaur

+0

「スクロールを殺す」という言葉が混乱しています。これ以上コンテンツをロードしないと、ユーザーはページの下をスクロールできなくなり、実際には 'スクロールを殺します。 ' –

+0

あなたは間違っているようです。投稿したコードは永遠に繰り返されます。一番上にスクロールしようとすると(またはちょっと上に)スクロールすると、1秒後にボトムに戻ります。私はsetInterval関数がclearIntervalの対応を持つ必要があるのではないかと思います... – jlaur

関連する問題