如何使用C#滚动到Selenium WebDriver的元素

时间:2015-02-12 09:25:44

标签: c# selenium selenium-webdriver selenium-chromedriver

如何让Selenium WebDriver滚动到特定元素以在屏幕上显示它。我尝试了很多不同的选择,但没有运气。 这不适用于c#绑定吗?

我可以跳转到特定位置((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollTo(0, document.body.scrollHeight - 150)"); 但我希望能够将它发送到不同的元素,而不是每次都给出确切的位置。

public IWebElement Example { get { return Driver.FindElement(By.Id("123456")); } }

Ex 1)((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].scrollIntoView(true);", Example);

前2)((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollBy(Example.Location.X", "Example.Location.Y - 100)");

当我观看它时,它不会将页面向下跳转到元素,并且异常与屏幕外的元素匹配。

更新: 我添加了一个bool ex = Example.Exists();之后检查结果。 它确实存在(它是真的)。 它没有显示(因为它仍然在屏幕外,因为它没有移动到元素) 它未被选中??????

有人看到成功By.ClassName。 有没有人知道在c#bindings中执行此By.Id是否有问题?

8 个答案:

答案 0 :(得分:38)

这是一个较旧的问题,但我相信有比上面提出的更好的解决方案。

以下是原始答案:https://stackoverflow.com/a/26461431/1221512

您应该使用Actions类来执行滚动到元素。

var element = driver.FindElement(By.id("element-id"));
Actions actions = new Actions(driver);
actions.MoveToElement(element);
actions.Perform();

答案 1 :(得分:16)

这对我来说适用于Chrome,IE8和IE11:

public void ScrollTo(int xPosition = 0, int yPosition = 0)
{
    var js = String.Format("window.scrollTo({0}, {1})", xPosition, yPosition);
    JavaScriptExecutor.ExecuteScript(js);
}

public IWebElement ScrollToView(By selector)
{
    var element = WebDriver.FindElement(selector);
    ScrollToView(element);
    return element;
}

public void ScrollToView(IWebElement element)
{
    if (element.Location.Y > 200)
    {
        ScrollTo(0, element.Location.Y - 100); // Make sure element is in the view but below the top navigation pane
    }

}

答案 2 :(得分:9)

这对我有用:

var elem = driver.FindElement(By.ClassName("something"));
driver.ExecuteScript("arguments[0].scrollIntoView(true);", elem);

答案 3 :(得分:0)

要在页面内向下滚动,我有一些小代码和解决方案

我的场景是直到我向下滚动页面。未启用接受和不接受按钮。我有15个条款和条件,我需要通过查看网页并获取最后条款和条件段落的ID来选择第15个条款和条件。

driver.FindElement(By.Id("para15")).Click();

<div id="para15">One way Non-Disclosure Agreement</div>

答案 4 :(得分:0)

我为IWebDriver创建了一个扩展名:

public static IWebElement GetElementAndScrollTo(this IWebDriver driver, By by)
{
    var js = (IJavaScriptExecutor)driver;
    try
    {
        var element = driver.FindElement(by);
        if (element.Location.Y > 200)
        {
            js.ExecuteScript($"window.scrollTo({0}, {element.Location.Y - 200 })");
        }
        return element;
    }
    catch (Exception ex)
    {
        return null;
    }
}

答案 5 :(得分:0)

这对我来说是C#自动化的工作

 public Page scrollUp()
        {
            IWebElement s = driver.FindElement(By.Id("your_locator")); ;
            IJavaScriptExecutor je = (IJavaScriptExecutor)driver;
            je.ExecuteScript("arguments[0].scrollIntoView(false);", s);
            return this;
        }

答案 6 :(得分:0)

我也有同样的问题。我正在一个网页上工作,需要单击默认情况下位于屏幕下方的子窗口上的按钮。 这是我使用过的代码,并且有效。 实际上,我只是模拟了鼠标的拖放操作,并将窗口向上移动了250个点,从而使按钮位于屏幕上。

Actions action = new Actions(driver);
action.DragAndDropToOffset(driver.FindElement(By.XPath("put an element path which **is in the screen now**, such as a label")), 0, -250);
action.Build().Perform();

答案 7 :(得分:0)

如果我们放时间的原因是页面加载时间长,我们就放。就这样。

ChromeOptions options = new ChromeOptions();
var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://www.w3schools.com/");
Thread.Sleep(5000);
driver.ExecuteScript("scroll(0,400)");
HtmlDocument countriesDocument = new HtmlDocument();
countriesDocument.LoadHtml(driver.PageSource);