C#Selenium - 在不断增长的页面上寻找元素

时间:2015-02-22 19:55:48

标签: c# selenium selenium-webdriver webdriver infinite-scroll

我正在尝试找到一种比使用更好的方法:

js.ExecuteScript("scroll(0, 1300)");

我有一个页面,数据可以更改,使页面高度变化大小。因此,当我今天点击位于1500px的元素时,明天它可能是800px,并且找不到该元素,并且测试用例失败。

那么你们用什么来定位尺寸变化的页面上的元素?

3 个答案:

答案 0 :(得分:1)

我不确定这是否有用,但您可以尝试使用以下内容获取页面的最大高度:

Math.max($(document).height(), $(window).height())

然后您可以使用js.ExecuteScript滚动。

之后我仍然使用findElement来启动点击。

答案 1 :(得分:1)

我将进一步采取@ 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);

答案 2 :(得分:0)

我开始使用下面似乎工作得很好。谢谢大家的帮助。

           IWebElement bio = SeleniumDriver.FindElement(By.XPath("path"));
                Actions actions = new Actions(SeleniumDriver);
                actions.MoveToElement(bio);
                actions.Perform();