如何使用 Selenium WebDriver 滚动到元素
How to scroll to element with Selenium WebDriver
如何让 Selenium WebDriver 滚动到特定元素以将其显示在屏幕上。我尝试了很多不同的选择,但没有运气。
这在 C# 绑定中不起作用吗?
我可以让它跳转到特定位置 ex
((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollTo(0, document.body.scrollHeight - 150)");
但我希望能够将它发送到不同的元素,而不必每次都给出确切的位置。
public IWebElement Example { get { return Driver.FindElement(By.Id("123456")); } }
例 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# 绑定中这样做 By.Id 是否有问题?
这对我有用:
var elem = driver.FindElement(By.ClassName("something"));
driver.ExecuteScript("arguments[0].scrollIntoView(true);", elem);
这对我适用于 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
}
}
这是一个比较老的问题,但我相信有比上面建议的更好的解决方案。
原回答如下:
您应该使用操作 class 执行滚动到元素。
var element = driver.FindElement(By.id("element-id"));
Actions actions = new Actions(driver);
actions.MoveToElement(element);
actions.Perform();
为了在页面内向下滚动,我有一些小代码和解决方案
我的场景是直到我向下滚动页面。接受和不接受按钮未启用。我有 15 个条款和条件,我需要通过检查网页并获取最后一个条款和条件段落的 ID select 第 15 个条款和条件。
driver.FindElement(By.Id("para15")).Click();
<div id="para15">One way Non-Disclosure Agreement</div>
我为 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;
}
}
这在 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;
}
我遇到了同样的问题。我在网页上工作,需要点击子 window 上的按钮,默认情况下,它位于屏幕下方。
这是我使用的代码并且有效。
实际上我只是模拟了鼠标拖放并将 window 向上移动了 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();
如果我们放置时间的原因是加载页面时间过长,我们就放置它。就这样吧。
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);
我正在提供在特定元素内滚动的解决方案,例如可滚动的 table。
// Driver is the Selenium IWebDriver
IJavaScriptExecutor exec = (IJavaScriptExecutor) Driver;
int horizontalScroll= direction == Direction.Right ? X : 0;
int verticalScroll = direction == Direction.Down ? Y : 0;
exec.ExecuteScript(
"arguments[0].scrollBy(arguments[1], arguments[2])"
, Self
, horizontalScroll
, verticalScroll);
Actions actions = new Actions(driver);
actions.SendKeys(Keys.PageDown).Build().Perform();
你完成它,它像发条一样工作,简单,但并不总是方便
var js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'})", PutYourElementIDHere);
如何让 Selenium WebDriver 滚动到特定元素以将其显示在屏幕上。我尝试了很多不同的选择,但没有运气。 这在 C# 绑定中不起作用吗?
我可以让它跳转到特定位置 ex
((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollTo(0, document.body.scrollHeight - 150)");
但我希望能够将它发送到不同的元素,而不必每次都给出确切的位置。
public IWebElement Example { get { return Driver.FindElement(By.Id("123456")); } }
例 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# 绑定中这样做 By.Id 是否有问题?
这对我有用:
var elem = driver.FindElement(By.ClassName("something"));
driver.ExecuteScript("arguments[0].scrollIntoView(true);", elem);
这对我适用于 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
}
}
这是一个比较老的问题,但我相信有比上面建议的更好的解决方案。
原回答如下:
您应该使用操作 class 执行滚动到元素。
var element = driver.FindElement(By.id("element-id"));
Actions actions = new Actions(driver);
actions.MoveToElement(element);
actions.Perform();
为了在页面内向下滚动,我有一些小代码和解决方案
我的场景是直到我向下滚动页面。接受和不接受按钮未启用。我有 15 个条款和条件,我需要通过检查网页并获取最后一个条款和条件段落的 ID select 第 15 个条款和条件。
driver.FindElement(By.Id("para15")).Click();
<div id="para15">One way Non-Disclosure Agreement</div>
我为 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;
}
}
这在 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;
}
我遇到了同样的问题。我在网页上工作,需要点击子 window 上的按钮,默认情况下,它位于屏幕下方。 这是我使用的代码并且有效。 实际上我只是模拟了鼠标拖放并将 window 向上移动了 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();
如果我们放置时间的原因是加载页面时间过长,我们就放置它。就这样吧。
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);
我正在提供在特定元素内滚动的解决方案,例如可滚动的 table。
// Driver is the Selenium IWebDriver
IJavaScriptExecutor exec = (IJavaScriptExecutor) Driver;
int horizontalScroll= direction == Direction.Right ? X : 0;
int verticalScroll = direction == Direction.Down ? Y : 0;
exec.ExecuteScript(
"arguments[0].scrollBy(arguments[1], arguments[2])"
, Self
, horizontalScroll
, verticalScroll);
Actions actions = new Actions(driver);
actions.SendKeys(Keys.PageDown).Build().Perform();
你完成它,它像发条一样工作,简单,但并不总是方便
var js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'})", PutYourElementIDHere);