10

我在 c# 中使用 Selenium。

Selenium 通常可以自动向下滚动到网页底部以查找元素,但我遇到了某个页面的问题,该页面的大小可能会增加。

任何人都可以建议在页面变大后向下滚动到页面底部的代码吗?

4

4 回答 4

12

尝试使用此问题中描述的 javascript

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");
于 2013-09-04T23:17:25.860 回答
7

我知道这是一个旧的,但它可能对某人有帮助。我提出了以下 C# 代码:

    private void ScrollToBottom(IWebDriver driver)
    {
        long scrollHeight = 0;

        do
        {
            IJavaScriptExecutor js = (IJavaScriptExecutor) driver;
            var newScrollHeight = (long) js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight); return document.body.scrollHeight;");

            if(newScrollHeight == scrollHeight)
            {
                break;
            }
            else
            {
                scrollHeight = newScrollHeight;
                Thread.Sleep(400);
            }
        } while (true);
    }
于 2016-12-26T18:43:35.933 回答
1

使用 .Net 4.5 和 Selenium WebDriver 2.45 的 C# 示例

只需将 _url变量更改为指向您的网站并运行即可。

我使用了 ChromeDriver,但它也应该与其他驱动程序一起使用。

using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumScrollTest {

    internal static class Program {

        // Declare Selenium Web Driver
        private static IWebDriver _chromeDriver;

        private static String _url;

        private static void Main(string[] args) {
            // Instantiate URL
            _url = @"http://my.website.com/LazyLoadContent";

            // Instantiate Web Driver as ChromeDriver and set initial URL
            _chromeDriver = new ChromeDriver {Url = _url};

            // Instruct the WebDriver to wait X seconds for elements to load
            _chromeDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));

            // Instantiate JavaScript Executor using the web driver
            var jse = (IJavaScriptExecutor) _chromeDriver;

            // The minified JavaScript to execute
            const string script =
                "var timeId=setInterval(function(){window.scrollY<document.body.scrollHeight-window.screen.availHeight?window.scrollTo(0,document.body.scrollHeight):(clearInterval(timeId),window.scrollTo(0,0))},500);";

            // Start Scrolling
            jse.ExecuteScript(script);

            // Wait for user input
            Console.ReadKey();

            // Close the browser instance
            _chromeDriver.Close();

            // Close the ChromeDriver Server
            _chromeDriver.Quit();
        }
    }
}

如果您已经对 Selenium 和 C# 有一定的了解,那么重要的一点就是 JavaScript。- 来自Cyber​​maxs在这里

    var timeId = setInterval(function () {
        if (window.scrollY !== document.body.scrollHeight)
            window.scrollTo(0, document.body.scrollHeight);
        else
            clearInterval(timeId);
    }, 500);

上面的 500 是尝试滚动的时间间隔(以微秒为单位),根据需要进行调整。[1000 微秒 = 1 秒]

于 2015-03-12T20:07:26.897 回答
0

很抱歉,我不使用 c#,但猜想任何语言的逻辑都会保持不变。如果它是页面的延迟加载,那么您可以使用 Actions 类来执行发送 pagedown 键选项。如果您收到消息,例如要加载更多项目或没有更多项目,那么您可以识别此元素。将 page down 选项放在 while 循环中,该循环执行 page down 直到满足条件。这样您就可以完全加载页面的所有内容。如果您需要更多帮助,请告诉我。

于 2013-09-05T01:53:59.143 回答