selenium automation移动站点:等待隐藏元素

时间:2018-03-01 17:28:22

标签: c# selenium selenium-webdriver selenium-chromedriver webdriverwait

我遇到隐藏元素的问题。该网站已满载,因此每个项目都可用,无需加载,切换页面。 我尝试了ExpectedConditions的所有选项,但仍未等待元素。使用查找功能,我得到位置,但x,y坐标为:( - 125,156),因此无法单击它(在屏幕上也不可见) 非常糟糕的解决方法是使用+ Thread.Sleep(1000);和一个计数器......而x> 0和> 0 哪个我想避免..有什么想法吗? enter image description here 代码示例:

    ChromeOptions chromeCapabilities = new ChromeOptions();
    chromeCapabilities.EnableMobileEmulation("iPhone 7");

    IWebDriver webDriver = new ChromeDriver(chromeCapabilities);
    webDriver.Manage().Window.Maximize();
    webDriver.Navigate().GoToUrl("https://m.exmaple.org");

    WebDriverWait driverWait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(30.0));

    IWebElement menu_1;
    IWebElement switch_left;

    switch_left = webDriver.FindElement(By.Id("item_1"));
    switch_left.Click(); // ~3-5 sec while switched left because of animations


    driverWait.Until(ExpectedConditions.ElementToBeClickable(By.Id("item_1"))));
    menu_1 = webDriver.FindElement(By.Id("item_1"));
    menu_1.Click(); System.InvalidOperationException: 'unknown error: Element is not clickable at point (-125, 156)

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么当您在浏览器框架之外时,您会尝试单击该元素。您需要一种方法来等待元素在单击后移动到框架中。没有内置的方法来执行此操作,因此您需要自定义等待。

您应该可以使用如下所示的内容。它基本上等到元素的X / Y坐标(技术上是左上角)在浏览器框架内。我认为这对你有用。

public IWebElement WaitForElementToBeOnscreen(By locator)
{
    WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
    wait.Until<IWebElement>(d =>
    {
        IWebElement element = d.FindElement(locator);
        if (element.Location.X > 0 &&
            element.Location.X < Driver.Manage().Window.Size.Width &&
            element.Location.Y > 0 &&
            element.Location.Y < Driver.Manage().Window.Size.Height)
        {
            return element;
        }

        return null;
    });

    return null;
}

注意:为了使其更加准确,您可以考虑元素的大小。例如,确保X大于0且小于窗口宽度 - 元素的宽度......依此类推。

您可能遇到的另一个问题是,如果元素永远不会移动......它会停留在浏览器框架之外。如果发生这种情况,则等待将超时。我不确定在这种情况下你想做什么......你可以用try-catch包裹它并返回null或你决定做的其他事情。