等待DOM元素存在/可见

时间:2016-01-31 22:59:17

标签: c# .net selenium webbrowser-control cefsharp

我有一个非常简单的要求,即加载网页,等到它完成加载,然后等待元素变为存在/可见(这只发生页面之后在对页面做任何其他事情之前已表示已完成加载。

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

我看着使用CefSharp,但我被告知唯一的方法就是注入js,我并不是那么热衷于做。

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

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

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

我用它来进行网络自动化。在这个特殊情况下登录网站(我不存储密码,不用担心)。

有问题的特定网站支持用户级别的不同身份验证方法,因此在输入用户名后,它会运行一个js脚本,该脚本确定是否要求输入密码或者手机身份验证,智能卡身份验证等等.js脚本不会触发DocumentCompleted事件,这是我目前正在努力解决的问题。

这个想法是,如果它要求智能卡或手机身份验证一直保持表单/控件.Visible = false,并且只要用户设置为用户名/密码身份验证就显示它。

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

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

1 个答案:

答案 0 :(得分:1)

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

我有一个与您类似的设置,需要在运行每个测试之前进行身份验证,因此在进行测试之前,我将等待元素加载(无需检查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中删除元素