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();