C# Selenium - 在不断增长的页面上查找元素
C# Selenium - Finding Element On Continuously Growing Page
我正在尝试找到一种比使用更好的方法:
js.ExecuteScript("scroll(0, 1300)");
我有一个页面,其中的数据可以更改,从而使页面高度在大小上发生变化。所以当我今天去点击位于 1500px
的元素时,明天可能是 800px
并且找不到该元素并且测试用例失败。
那么你们用什么来定位页面上尺寸变化的元素?
我不确定这是否可行,但您可以尝试使用如下方法获取页面的最大高度:
Math.max($(document).height(), $(window).height())
然后您可以使用 js.ExecuteScript 滚动。
之后我仍然会使用 findElement 来启动点击。
我将进一步阐述@ratsstack 的回答,让您更容易实施。
我不确定是否有更清洁的方法来做到这一点。但是,至少应该起作用。您可以提供您认为足以让页面完全加载的 估计 滚动次数。请注意,您可以提供比您认为正确的更多的数字。它不会真正伤害或不会导致您的脚本失败。
public void ScrollPage(int counter)
{
const string script =
@"window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));";
int count = 0;
while (count != counter)
{
IJavaScriptExecutor js = _driver as IJavaScriptExecutor;
js.ExecuteScript(script);
Thread.Sleep(500);
count++;
}
}
注意:我正在使用 Thread.Sleep()
让页面有时间完成加载。但是,从不建议使用硬编码使用。我不确定您使用的技术,所以真的无法提供任何等待机制来等待页面加载。您可以使用一些东西并替换 Thread.Sleep()
实施
ScrollPage(8);
我开始使用下面的方法,它似乎运行良好。感谢大家的帮助。
IWebElement bio = SeleniumDriver.FindElement(By.XPath("path"));
Actions actions = new Actions(SeleniumDriver);
actions.MoveToElement(bio);
actions.Perform();
我正在尝试找到一种比使用更好的方法:
js.ExecuteScript("scroll(0, 1300)");
我有一个页面,其中的数据可以更改,从而使页面高度在大小上发生变化。所以当我今天去点击位于 1500px
的元素时,明天可能是 800px
并且找不到该元素并且测试用例失败。
那么你们用什么来定位页面上尺寸变化的元素?
我不确定这是否可行,但您可以尝试使用如下方法获取页面的最大高度:
Math.max($(document).height(), $(window).height())
然后您可以使用 js.ExecuteScript 滚动。
之后我仍然会使用 findElement 来启动点击。
我将进一步阐述@ratsstack 的回答,让您更容易实施。 我不确定是否有更清洁的方法来做到这一点。但是,至少应该起作用。您可以提供您认为足以让页面完全加载的 估计 滚动次数。请注意,您可以提供比您认为正确的更多的数字。它不会真正伤害或不会导致您的脚本失败。
public void ScrollPage(int counter)
{
const string script =
@"window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));";
int count = 0;
while (count != counter)
{
IJavaScriptExecutor js = _driver as IJavaScriptExecutor;
js.ExecuteScript(script);
Thread.Sleep(500);
count++;
}
}
注意:我正在使用 Thread.Sleep()
让页面有时间完成加载。但是,从不建议使用硬编码使用。我不确定您使用的技术,所以真的无法提供任何等待机制来等待页面加载。您可以使用一些东西并替换 Thread.Sleep()
实施
ScrollPage(8);
我开始使用下面的方法,它似乎运行良好。感谢大家的帮助。
IWebElement bio = SeleniumDriver.FindElement(By.XPath("path"));
Actions actions = new Actions(SeleniumDriver);
actions.MoveToElement(bio);
actions.Perform();