【问题标题】:selenium automation Mobile site: wait for hidden elementselenium 自动化移动站点:等待隐藏元素
【发布时间】:2018-08-09 20:40:13
【问题描述】:

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

    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)

【问题讨论】:

  • 你到底想做什么?如果某个元素不可见,您将无法单击它。你确定你不想点击别的东西吗?那可能包含不可见的元素?
  • 所以步骤:加载页面单击switch_left(小于500ms)单击menu_1并在那里..我收到错误...因为有az动画..比我可以看到menu_1。所以我需要等待......
  • 如果我是你,我可能会仔细查看 dom 中的元素,看看它们上面是否有任何属性表明动画已经发生,或者可见页面的状态是 left 还是对或什么。如果没有这样的事情,那么我会查找如何创建自定义等待,以等待元素停止移动,以便您知道动画已完成。

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


【解决方案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 或您决定的任何其他内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2012-08-15
    • 2012-09-03
    • 2014-05-07
    相关资源
    最近更新 更多