web-dev-qa-db-ja.com

Selenium:動的にロードするWebページでページの最後までスクロール

すべてのアイテムが読み込まれるまでページを下にスクロールすると、新しいアイテムを読み込み続けるWebページがあります。

私はJavaでSeleniumを使用していて、すべてをロードするためにページの一番下までスクロールする必要があります。

ページ下部の要素までスクロールするなど、さまざまなオプションを試しました。

WebElement copyrightAtEndOfPage = webDriver.findElement(By.xpath("//a[@href='/utils/copyright.html']"));
((JavascriptExecutor) webDriver).executeScript("arguments[0].scrollIntoView();", copyrightAtEndOfPage);

ただし、これは1度だけ下にスクロールし、その後Webページはロードされ続けます。

私はまた、ブラウザの高さのみを考慮に入れるため、 this アプローチも試しました。

どんな助けでも大歓迎です。

9
Johannes Mols

Pythonこれでコードを提供します。Javaに変換するのは簡単だと思います:

def scroll_down(self):
    """A method for scrolling the page."""

    # Get scroll height.
    last_height = self.driver.execute_script("return document.body.scrollHeight")

    while True:

        # Scroll down to the bottom.
        self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # Wait to load the page.
        time.sleep(2)

        # Calculate new scroll height and compare with last scroll height.
        new_height = self.driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:

            break

        last_height = new_height

お役に立てば幸いです。

18
Ratmir Asanov

Ratmir Asanovのおかげで(上記の承認された回答を参照)、PythonコードをJavaに翻訳して他の人が実装しやすくしました。

try {
    long lastHeight = (long) ((JavascriptExecutor) webDriver).executeScript("return document.body.scrollHeight");

    while (true) {
        ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.sleep(2000);

        long newHeight = (long) ((JavascriptExecutor) webDriver).executeScript("return document.body.scrollHeight");
        if (newHeight == lastHeight) {
            break;
        }
        lastHeight = newHeight;
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}
6
Johannes Mols

Johannesコードを少し機能的にするために更新しました。

JavascriptExecutor js = (JavascriptExecutor) driver;
try {
    long lastHeight=((Number)js.executeScript("return document.body.scrollHeight")).longValue();
    while (true) {
        ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.sleep(2000);

        long newHeight = ((Number)js.executeScript("return document.body.scrollHeight")).longValue();
        if (newHeight == lastHeight) {
            break;
        }
        lastHeight = newHeight;
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}
0
Prabhat Arya

上記のソリューションをPrabhatでさらに更新すると、コンパイルエラーが発生しました。

    try {
        Object lastHeight = ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");

        while (true) {
            ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
            Thread.sleep(2000);

            Object newHeight = ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
            if (newHeight.equals(lastHeight)) {
                break;
            }
            lastHeight = newHeight;
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
0
Zenab Gorach