【问题标题】:Wait for DOM element to be present/visible等待 DOM 元素出现/可见
【发布时间】: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


【解决方案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 中移除元素

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2017-09-04
    • 2017-08-14
    • 2019-10-21
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多