我有一个非常简单的要求,即加载网页,等到它完成加载,然后等待元素变为存在/可见(这只发生在页面之后在对页面做任何其他事情之前已表示已完成加载。
我尝试使用WebBrowser控件,但很难找到等待元素的方法。
我看着使用CefSharp,但我被告知唯一的方法就是注入js,我并不是那么热衷于做。
我也查看了Selenium WebDriver,WebDriverWait
似乎完全符合我的要求,但它实际上并不是一个控件,无法隐藏,需要安装浏览器才是不,对我来说。
有没有办法做到这一点,不涉及在WebBrowser,CefSharp或我尚未提及的任何其他项目中使用Thread.Sleep
?
编辑:一些额外信息......
我用它来进行网络自动化。在这个特殊情况下登录网站(我不存储密码,不用担心)。
有问题的特定网站支持用户级别的不同身份验证方法,因此在输入用户名后,它会运行一个js脚本,该脚本确定是否要求输入密码或者手机身份验证,智能卡身份验证等等.js脚本不会触发DocumentCompleted
事件,这是我目前正在努力解决的问题。
这个想法是,如果它要求智能卡或手机身份验证一直保持表单/控件.Visible = false
,并且只要用户设置为用户名/密码身份验证就显示它。
因此,根据我自动输入用户名后发生的情况,它会要求输入密码,智能卡或手机身份验证,我需要等待DOM更改,以便这3个元素中的一个变得可见,所以我知道是什么要做。
我不喜欢Selenium,因为它涉及用户必须安装浏览器,它很难/不可能隐藏它,它不是我可以放在我的表格上的实际控制等等。
答案 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)
使用示例为: