【发布时间】:2016-05-09 07:37:27
【问题描述】:
我有一个非常简单的要求来加载一个网页,等到它完成加载,然后等待一个元素出现/可见(这只发生在页面发出信号之后完成加载),然后再对页面进行任何其他操作。
我尝试使用 WebBrowser 控件,但很难找到等待元素的方法。
我研究过使用 CefSharp,但有人告诉我唯一的方法是注入 js,我并不是那么热衷于这样做。
我也查看了 Selenium WebDriver,WebDriverWait 似乎完全符合我的要求,但事实上它不是一个控件,不能隐藏并且需要安装浏览器,这对我来说是一个禁忌。
有没有一种不涉及在 WebBrowser、CefSharp 或我尚未提及的任何其他项目中使用 Thread.Sleep 的方法?
编辑:一些额外的信息...
我将其用于网络自动化。在这个特定的例子中登录一个网站(我没有存储密码,别担心)。
所讨论的特定网站在用户级别支持不同的身份验证方法,因此在输入用户名后,它会运行一个 js 脚本,该脚本决定是否要求输入密码或电话身份验证、智能卡身份验证等。js脚本不会触发 DocumentCompleted 事件,这是我目前正在努力解决的问题。
这个想法是,如果它要求智能卡或手机身份验证,则始终将表单/控件与.Visible = false 保持一致,如果用户设置为用户名/密码身份验证,则仅显示它。
因此,根据我自动输入用户名后发生的情况,它会要求输入密码、智能卡或电话身份验证,我需要等待 DOM 更改,以便这三个元素之一变得可见,所以我知道是什么去做。
我不喜欢 Selenium,因为它涉及到用户必须安装浏览器,很难/不可能隐藏它,它不是我可以放在表单上的实际控件,等等。
【问题讨论】:
-
WebBrowser.DocumentCompleted() 在文档完成加载时触发。
-
@Mathemats DOM 元素仅在该事件触发后出现,我已经尝试过了。
-
这肯定只是 JavaScript,但我对某些语言感到困惑。当你说“我有一个非常简单的要求”时——这意味着是手动的、偶尔的工作还是测试场景,或者只是一个标准的 Web 开发事物,其中一个元素触发另一个元素做某事?其中 JQuery(或只是标准 JS)将涵盖所有内容。例如。 developer.mozilla.org/en-US/docs/Web/Events/load。即使您的 elem 动态加载,您也可以为其添加一个侦听器?
-
您的要求不清楚。您是否尝试在 iframe 中加载网页?
-
您能回答这些问题以确认我的理解吗? 1. 您是否使用 CefSharp 将铬嵌入到您的应用程序中? 2. 是否尝试在您的应用程序上打开网页然后检查给定元素是否存在? 3. Selenium 是否获得正确的窗口(检查 webdriver.Title)?
标签: c# .net selenium webbrowser-control cefsharp