InternetExplorer html 属性更改

InternetExplorer html attribute change

提问人:Svj 提问时间:7/12/2020 最后编辑:braXSvj 更新时间:7/13/2020 访问量:330

问:

源网页包含一个带有 和 的输入元素aria-expanded='false'aria-activedescendant="Listbox_18--item-0"

当我将此属性更改为“true”(以编程方式)时,它确实在开放的 IE 上展开。还能够更改“Listbox_18--item-3”。

但是更改后我无法触发事件。 下面是我的VBA代码。

IE.Document.body.getElementsByTagName("input")(0).Focus
Debug.Print IE.Document.body.getElementsByTagName("input")(0).setAttribute("aria-expanded", "true")
Debug.Print IE.Document.body.getElementsByTagName("input")(0).setAttribute("aria-activedescendant", "Listbox_18--item-3")
Debug.Print IE.Document.body.getElementsByTagName("input")(0).setAttribute("aria-expanded", "false")
VBA Internet-Explorer DOM

评论

0赞 Peyter 7/12/2020
你可以试试我在这篇文章中写的一些方法: stackoverflow.com/a/59721369/12685075 每个网站的运行方式都略有不同,因此当您直接更改这些属性时,javascript Web 应用程序中的变量可能没有听到这种直接更改,因此在输入/表单/发布提交时不会更改它们的值。Jquery 在很多网站中都有使用,它可以用来在元素上设置一个特定的事件,这样它只触发 JS 代码/变量更改,如果事件是通过点击等方式触发的。
0赞 Svj 7/13/2020
@Peyter,谢谢。这是我尝试使用的 URL。我能够成功更改输入值(例如:“低票价”更改为“随时”),但它不会更改以下值(例如价格)。我尝试使用fireevent('onchange'),但没有帮助。southwest.com/air/low-fare-calendar/......
0赞 Svj 7/13/2020
input element 属性说 ReadOnly,所以我的猜测是它无法更改。属性还声明 aria-owns: Listbox_10--menu,我找不到。
0赞 Peyter 7/13/2020
移动到答案,这样我就可以粘贴代码一秒钟。
0赞 Deepak-MSFT 7/13/2020
尝试像下面这样触发事件,并检查它是否有任何区别。设置 ieEvent = htmldoc.createEvent(“HTMLEvents”) ieEvent.initEvent “change”, False, True ie.document.all.Item(“txt1”).dispatchEvent ieEvent

答:

0赞 Peyter 7/13/2020 #1

好了,这就是页面上发生的事情。

您正在处理 DOM 中的元素,这些元素使用 javascript 侦听事件,然后触发函数,然后最终调用 AJAX 函数以将数据返回到网页而无需重新加载。

这意味着您不能只设置属性。由于设置属性的行为不会在 Web 应用的变量中注册事件/值。

因此,尝试这样的事情,您将模拟页面上的操作以生成 AJAX 响应,特别是因为 SW 的网站使用生成的 QSI id 来指定页面的选择。

所以页面上的工作流程是:页面加载,在元素上设置事件,脚本资源保存函数。用户单击元素,触发事件,记录选择值,脚本资源创建随机 ID,随机 ID 是 ajax http 请求的输入,然后它从匹配的 id 返回价格值。

我在 DevTools 的控制台中执行类似操作,它模拟用户单击该项目。现在,您会看到该页面执行 Ajax 请求并返回价格。

document.querySelectorAll('#Listbox_10--item-3 > button')[0].click();

在像 Puppeteer 这样更高级的东西中,您实际上可以设置请求拦截以从 ajax 在页面上查找该请求,但在 VBA 中,您只需要等待加载,然后查找页面以更新它的 HTML。

现在,如果你有一种方法可以捕获 ID,然后将其作为参数发送到服务器,就像你在 DevTools 中看到的那样 -- 你可以使用 MS XML HTTP 发送它并获得漂亮的 JSON 响应。