【问题标题】:Close JavaScript Alert Using VBA Automation使用 VBA 自动化关闭 JavaScript 警报
【发布时间】:2012-03-18 05:08:48
【问题描述】:

我正在寻找一种方法来关闭加载网页时加载的 Javascript 弹出/消息框(即不是新的 IE 窗口,而是脚本化的 alert())。

我目前的代码可以将数据加载到搜索表单中,运行搜索,从结果中检索所需信息,退出搜索,然后继续处理列表中的下一项。在某些情况下,搜索结果中缺少一条关键信息。发生这种情况时,页面上的 JavaScript 会在页面加载时弹出消息,让用户知道该信息丢失。通过自动化,代码会在继续之前暂停(等待)清除框,并且用户必须在此发生之前单击“确定”按钮。

(我无法直接更改页面的源脚本,因为这超出了我在工作中的职责范围。另外,保留此功能以供一般使用更为重要;它真的只会受益我正在创建的这个小用途函数。)

虽然我无法更改源脚本,但我找到了example,说明如何通过更改加载的脚本来防止显示弹出窗口/警报。但是,它与一个已经加载的页面有关,并且对我不起作用(据我所知)。

IE.Document.getElementById("clearRelItems").removeAttribute "onClick"
IE.Document.getElementById("clearRelItems").setAttribute "onClick", "return true;"

是否可以使用此方法在页面完全加载之前进行更改?即这可以用来以某种方式绕过/规避页面加载时的函数调用吗?

我知道 sendkeys,但如果可能的话,我宁愿避免使用这个选项(如果没有其他选择,我最终可能会使用这个选项)。此功能旨在由用户启动,然后在后台运行,因为它需要一些时间才能完成。

我已经按照@Kyle 的建议研究了获取 XML,但我认为我不够熟练,无法使这种方法发挥作用。

我还能如何绕过警报?有没有办法实际激活警报上的 OK 按钮?是否可以通过任何其他方式绕过页面的警报/加载?

【问题讨论】:

  • 这是一个 Javascript alert();消息框?还是一个html元素?

标签: javascript internet-explorer vba automation alert


【解决方案1】:

一种解决方法可能是识别您的脚本何时卡住,然后只需发送击键“enter”即可关闭弹出窗口。

【讨论】:

  • 我知道 sendkeys,但这是由用户发起的,然后在后台运行,因为它需要一些时间才能完成。如果不存在其他替代方案,我可能最终会使用此选项。 (将此信息添加到原始问题中)
  • 我还是不愿意,但我将不得不选择这个选项。谢谢!
  • SendKeys 在我的情况下无法成功关闭 JavaScript confirm() 弹出窗口。在 SendKeys 之前添加 Application.Wait 也不起作用。其他人有这个问题吗?
  • 没关系,我发现它不起作用,因为我为 Wait 参数添加了 True。使用 SendKeys 关闭警报框时,请确保将第二个参数留空。
【解决方案2】:

您是否了解过使用 MS XML 类直接发布数据并解析结果?这比 IE 自动化要快得多,尽管不可否认

编辑:不是真的,我们只是使用类来处理请求和响应,我们实际上并没有使用 XML,我把这些放在一起给某人一段时间后给你一个想法:

Sub GetDataXML()

Dim strPostText As String, strResponse As String
Dim Pressure As Double, Temperature As Double
Dim XMLrequest As Object

Pressure = CDbl(InputBox("Enter the Pressure"))
Temperature = CDbl(InputBox("Enter the Temperature"))

strPostText = "lang=english&calc=standard&druck=" & Pressure & "&druckunit=1&temperatur=" & Temperature & "&tempunit=1&Submit=Calculate"

Set XMLrequest = CreateObject("MSXML2.XMLHTTP")

With XMLrequest
    .Open "POST", "http://www.peacesoftware.de/einigewerte/calc_co2.php5", False
    .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
    .send (strPostText)
    Do: DoEvents: Loop Until .readyState = 4
    strResponse = .responseText
    .abort
End With

Debug.Print strResponse

End Sub

如果您在 excel 中使用查询表会更容易,因为它可以处理任何数据解析。

以上对你有帮助吗?

【讨论】:

  • 我已经成功地让你的例子起作用了,@Kyle。但是,我缺少进入 POST 命令的其他内容(这是基于我在这里完全缺乏知识的假设)。我无法确定传递了哪些变量,也无法修改我的未知数,因为每次我在原始页面范围之外执行此操作时,脚本都会将我引导到登录页面。 Debug.Print 输出我习惯的标准登录屏幕的代码。如何查看这些变量?每个 INPUT/OPTION 标签都有一个吗? (如果是这样,有很多可以使用。)
  • 这种方法并不总是可行的。获取 POST 变量的最简单方法是从开发工具中的浏览器中获取,您使用的是哪个浏览器?
  • 你能安装类似的东西吗:this web analyser
  • 不幸的是,不在这个系统上。
  • 好的,我猜这是您尝试访问的内部站点? - 如果它是外部的,我可以看看,如果不是,那么我担心你可能会被发送密钥方法卡住:(
猜你喜欢
  • 2023-04-01
  • 2017-10-03
  • 1970-01-01
  • 2014-05-30
  • 2011-11-30
  • 2010-10-02
  • 2014-12-12
  • 1970-01-01
  • 2017-01-29
相关资源
最近更新 更多