【问题标题】:C# Selenium - Finding Element On Continuously Growing PageC# Selenium - 在不断增长的页面上查找元素
【发布时间】:2015-02-22 19:55:48
【问题描述】:

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

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

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

那么你们用什么来定位页面上大小发生变化的元素?

【问题讨论】:

  • 按名称而不是按位置查找元素?
  • @paqogomez 这可能是 滚动加载 页面之一,除非您向下滚动,否则该元素不存在
  • 嘿赛弗。你是对的。我必须先滚动到它,然后这不是问题。如前所述,这只是一种痛苦,因为根据内容,位置可能会发生变化,并且原来的滚动点不再正确。

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多