为什么Selenium Chrome驱动程序无法在滚动条下方找到元素?

时间:2016-08-26 21:50:15

标签: c# .net google-chrome selenium

我一直在努力编写一个清晰的仪表板步骤,清除我们称之为小部件的所有对象,如下所示:

    public static void ClearDashboard(string widgetToKeep = null)
    {
        var widgets = Driver.FindElements(
            By.XPath(
                $"//div[@widget-name and descendant::span[@class='title' and text()[not(contains(., '{widgetToKeep ?? "dummyText"}'))]]]"
            ));

        if (widgets != null)
        {
            foreach (IWebElement widget in widgets)
            {
                var closeButton = widget.FindElement(By.XPath(".//span[@class='delete']"));
                closeButton.Click();
            }
    }

完全有效。 它使用标题返回所有span元素,我可以浏览这些元素,为每个元素获取一个span删除按钮,并删除小部件:

closeButton.Click()

除了有点偏离屏幕的窗口小部件对象。 如果窗口小部件离屏幕稍微偏离,它似乎无法找到跨度按钮。

  

这是例外:   用户代码未处理InvalidOperation

     

类型' System.InvalidOperationException'的例外情况发生在WebDriver.dll中但未在用户代码中处理

     

其他信息:未知错误:元素在点(951,760)处无法点击。其他元素会收到点击:<div class="scroll" ng-class="{'getting-data': gettingNewData}" scroll-pag="">...</div>

     

(会话信息:chrome = 52.0.2743.116)

     

(驱动程序信息:chromedriver = 2.22.397933(1cab651507b88dec79b2b2a22d1943c01833cc1b),platform = Windows NT 6.1.7601 SP1 x86_64)

1 个答案:

答案 0 :(得分:0)

在使用IJavascriptExecutor点击之前,您应该使用滚动来覆盖每个元素,并使用WebDriverWait等待元素点击,如下所示: -

IWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(3));
IJavaScriptExecutor js = Driver as IJavaScriptExecutor;
foreach (IWebElement widget in widgets)
{
 var closeButton = widget.FindElement(By.XPath(".//span[@class='delete']"));

 //Now scroll to this element first 
 js.ExecuteScript("arguments[0].scrollIntoView(true);", closeButton);

 wait.Until(ExpectedConditions.ElementToBeClickable(closeButton)).Click();
}