等待 DOM 元素存在/可见

本文关键字:可见 存在 元素 DOM 等待 | 更新日期: 2023-09-27 18:32:36

我有一个非常简单的要求来加载网页,等到它完成加载,然后等待一个元素变得存在/可见(这只发生在页面发出完成加载的信号之后(在对页面执行任何其他操作之前。

我尝试使用 WebBrowser 控件,但很难找到等待元素的方法。

我考虑过使用 CefSharp,但我被告知唯一的方法是注入 js,我并不是那么热衷于这样做。

我也看了Selenium WebDriver,WebDriverWait似乎完全符合我的需求,但它实际上不是一个控件,无法隐藏并且需要安装浏览器这一事实对我来说是一个禁忌。

有没有一种方法不涉及在WebBrowser,CefSharp或任何其他我尚未提到的项目中使用Thread.Sleep

编辑:一些额外的信息...

我正在将其用于网络自动化。在这种特定情况下登录网站(我不存储密码,不用担心(。

有问题的特定网站在用户级别支持不同的身份验证方法,因此在输入用户名后,它会运行一个 js 脚本,该脚本确定是询问密码还是询问电话身份验证、智能卡身份验证等内容。js 脚本不会触发DocumentCompleted事件,这是我目前正在苦苦挣扎的问题。

这个想法是,如果它要求智能卡或电话身份验证以始终保持表单/控件.Visible = false,并且仅在用户设置为用户名/密码身份验证时显示它。

因此,根据我自动输入用户名后发生的情况,它会要求输入密码、智能卡或电话身份验证,我需要等待 DOM 更改,以便这 3 个元素之一变得可见,以便我知道该怎么做。

我不喜欢Selenium,因为它涉及用户必须安装浏览器,很难/不可能隐藏它,它不是我可以放在我的表单上的实际控件,等等。

等待 DOM 元素存在/可见

我知道

这已经很老了,但我想我会添加一个答案,以防有人也遇到它。

我有一个与您类似的设置,需要在运行每个测试之前进行身份验证,因此在继续测试之前,我将等待元素加载(不检查DocumentCompleted()方法(。

我所做的是使用一个接受某些条件的帮助程序,在我的情况下它是Func<bool>,然后每隔一段时间 x 检查这个条件,直到超时 y。X 和 Y 都是可配置的,但它们的默认值为 1 秒和 10 秒。您可以决定是否在方法中抑制异常,但我建议这样做,以便 ElementNotFound 异常不会停止执行。

计时帮助程序函数定义注意:以毫秒为单位的时间。

public static bool WaitFor(Func<bool> condition, int timeout = 10000, int waitTimePeriod = 1000)

使用示例包括:

  • 等待页面上的元素完成加载(如果组件具有加载指示器(
  • 等待元素出现在 DOM 中
  • 等待从 DOM 中删除元素