当前位置: 首页 > 知识库问答 >
问题:

Selenium—等待元素出现,即使在C中的可滚动模式上也是可见和可交互的#

贺运良
2023-03-14

这里对python提出了同样的问题:Selenium—等待元素出现、可见且可交互。然而,答案并没有涵盖所有的情况。

当我不处于调试模式时,我的实现有时会失败。我认为等待ID是一个非常琐碎的任务,应该有一个直接的吻实现,并且永远不会失败。

    public IWebElement WaitForId(string inputId, bool waitToInteract = false, int index = 0)
    {
        IWebElement uiElement = null;
        while (uiElement == null)
        {
            var items = WebDriver.FindElements(By.Id(inputId));
            var iteration = 0;
            while (items == null || items.Count < (index + 1) ||
                   (waitToInteract && (!items[index].Enabled || !items[index].Displayed)))
            {
                Thread.Sleep(500);
                items = WebDriver.FindElements(By.Id(inputId));
                if (items.Count == 0 && iteration == 10)
                {
                    // "still waiting...: " + inputId
                }

                if (iteration == 50)
                {
                    // "WaitForId not found: " + inputId
                    Debugger.Break(); // if tried too many times, maybe you want to investigate way
                }

                iteration++;
            }
            uiElement = WebDriver.FindElement(By.Id(inputId));
        }
        return uiElement;
    }

共有1个答案

淳于玺
2023-03-14
    public IWebElement GetActiveElement(string id, int allowedTimeout = 20, int retryInterval = 250)
    {
      var wait = new DefaultWait<IWebDriver>(_driver)
      {
        Timeout = TimeSpan.FromSeconds(allowedTimeout),
        PollingInterval = TimeSpan.FromMilliseconds(retryInterval)
      };

      return wait.Until(d =>
      {
        var element = d.FindElement(By.Id(id));
        return element.Displayed || element.Enabled ? element : throw new NoSuchElementException();
      });

   // Usage would be something like this

GetActiveElement("foo").SendKeys("Bar");

您应该能够创建扩展方法并调用扩展

public static class WebDriverExtension
  {
    public static IWebElement GetActiveElement(this IWebDriver driver, string id, int allowedTimeout = 20, int retryInterval = 250)
    {
      var wait = new DefaultWait<IWebDriver>(driver)
      {
        Timeout = TimeSpan.FromSeconds(allowedTimeout),
        PollingInterval = TimeSpan.FromMilliseconds(retryInterval)
      };

      return wait.Until(d =>
      {
        var element = d.FindElement(By.Id(id));
        return element.Displayed || element.Enabled ? element : throw new NoSuchElementException();
      });
    }
  }

// usage 
_driver.GetActiveElement("foo").SendKeys("bar");

 类似资料:
  • 我有一个Selenium脚本(Python),它单击一个回复按钮以显示类anonemail。类anonemail显示所需的时间各不相同。因此,在元素出现之前,我必须使用sleep。 我想等到类已经出现,而不是使用睡眠。我听说过等待命令,但我不知道如何使用它们。 这是我到目前为止所拥有的:

  • 我正在尝试在使用VueJs的单页应用程序中开发一个自动化测试,当我单击注册按钮时,页面加载了一个包含元素的表单,但是由于元素根据需要加载,它们不会自动出现在那里,我可以解决在单击注册按钮后放置driver.sleep的问题,但我正在寻找一种解决方法,我尝试了InluductEts和elisEnabled,但我无法得到结果,在这里检查我的代码: const { Builder, By, Key, 直

  • 所以我们有一页医学专科。它原本只是英文的。因此,如果您搜索“neuro”,则HTML看起来类似于 然后他们添加了西班牙语,所以并不是所有的结果都会返回,但是只有西班牙语是可见的。一个新的 > 添加在底部。 是否有方法等待任何匹配xpath的元素可见?注意,visibilityOfAllElements()将不起作用,因为它们不会全部可见。 我想可以做的是,预先计算所有带有@id和“width”的元

  • 我是新的Selenium C#NUnit。我跟着一行代码跑了 var wait=new WebDriverWait(驱动程序,TimeSpan.FromSeconds(30));等待直至(d)= 我得到了以下消息:消息:OpenQA. Selenium。元素不可交互(会话信息:chrome=89.0.4389.114)堆栈跟踪:远程WebDriver。Unpack AndThrowOnError(

  • 我试图得到某个产品的评论,但它返回一个错误。 我的代码: 它返回:硒。常见的例外。ElementNotInteractitableException:消息:元素不可交互 你能告诉我该怎么办吗?

  • 我正试图对这个网站进行测试。(https://www.phptravels.net/),我想测试一下它的登录特性。有一个“我的帐号”链接,需要先点击,显示登录和注册按钮的下拉。HTML代码如下所示: 当我尝试单击“我的帐户”按钮时,它抛出一个错误消息,说“元素不可见”。我很困惑,因为显然这个按钮一直可见。代码如下: 我的代码有什么问题?谢谢你。